【发布时间】:2018-05-01 12:26:41
【问题描述】:
简介
大家好。 在从事 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>
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);
}
});
});
【问题讨论】:
-
您想要一个进度表来通知用户什么时候完成查询?您需要具有权限的单独数据库连接来查询其他用户查询的执行计划和其他数据库系统信息。实际上是调试器或分析器。您使用的是哪个 RDBMS?我的 SQL、SQL SERVER 等?每个 RDBMS 的答案都会发生巨大变化,有些不会给你想要的。
-
我使用 PostgresSQL、My SQL、MariaDB
标签: php mysql sql database postgresql