使用PostgreSQL或My SQL的SQL查询进度

alv*_*fvr 6 php mysql sql database postgresql

介绍

大家好.从事Web应用程序管理我经常发现自己遇到了一个我从未用现有知识解决过的问题.在我的应用程序中,由于复杂的查询和大量数据,大多数数据提取过程都是持久的.事实上,通过PHP进行数据提取的等待时间主要由QUERY EXECUTION(大多数情况下)进行.假设我们有这种常见情况

在此输入图像描述

题

在这一点上,我的问题是:是否有一个解决方案,知道查询执行过程到达了什么时候,然后执行查询跟踪,让我的[PROGRESS QUERY%]?

我的解决方案

到目前为止,我使用的解决方案是:"查询时间历史"

当我使用特定参数运行数据提取查询时,我在表中保存查询的持续时间以及每次使用这些参数执行查询时,我用所有持续时间的平均值覆盖重新安排的持续时间.所以我可以根据平均值进行估算,显然忽略了可能影响查询持续时间的其他参数,我可以根据估计的秒数调用客户端函数并填充[PROGRESS QUERY%].

示例:(我使用boostrap进度条查看)

HTML

<!-- where "data-seconds" are the average seconds of the execution saved in my query time history table -->
<button type="button" id="runQuery" data-seconds="500">Get Data</button>    
<div class="progress">
  <div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%">
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

JAVASCRIPT

$("#runQuery").on("click", function() {
    var currentSeconds = 0;
    var totalSeconds = parseFloat($(this).data("seconds"));
    var $progressBar = $(".progress-bar");
    var progressPercentage = 0;
    var execution;

    $.ajax({
        url: "scriptForQueryExecution.php", type: "POST", beforeSend: function() {
            execution = setInterval(function() {
                progressPercentage = currentSeconds / totalSeconds * 100;
                $progressBar.css("width", progressPercentage + '%').attr("aria-valuenow", progressPercentage);

                currentSeconds++;
            }, 1000);
        }, success: function() {
            $progressBar.css("width", '100%').attr("aria-valuenow", 100);
            clearInterval(execution);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

Cod*_*4R7 2

MariaDB在其进程列表中支持“进度报告”SHOW PROCESSLIST ,通过和INFORMATION_SCHEMA.PROCESSLIST以 5 秒的间隔(默认)更新进度信息。详细信息可以在这里找到:https ://mariadb.com/kb/en/library/progress-reporting/ 。

PostgreSQL 也支持进度报告,尽管仅适用于VACUUM命令: https: //www.postgresql.org/docs/9.6/static/progress-reporting.html

您需要做的就是使用单独的 XHR 请求查询此信息,并使用 CSS 动画为进度指示器设置动画。