使用 PostgreSQL 或 My SQL 的 SQL 查询进度
Posted
技术标签:
【中文标题】使用 PostgreSQL 或 My SQL 的 SQL 查询进度【英文标题】:SQL Query progress using PostgreSQL or My SQL 【发布时间】:2018-05-01 12:26:41 【问题描述】:简介
大家好。 在从事 Web 应用程序管理工作时,我经常发现自己遇到了一个问题,而我目前的知识从未解决过这个问题。 在我的应用程序中,由于复杂的查询和大量的数据,大多数数据提取过程都是持久的。 事实上,通过 php 提取数据的等待时间主要由 QUERY EXECUTION 花费(在大多数情况下)。 假设我们有这种常见的情况
问题
此时我的问题是:是否有一种解决方案可以知道查询执行过程到达的时间点,然后对我的 [PROGRESS QUERY %] 进行查询跟踪?
我的解决方案
到目前为止我使用的解决方案是这样的:“查询时间历史”
当我使用特定参数运行数据提取查询时,我将查询的持续时间保存在表中,并且每次使用这些参数执行查询时,我都会用所有持续时间的平均值覆盖重新安排的持续时间。 所以我可以根据平均值进行估计,显然忽略可能影响查询持续时间的其他参数,我可以根据估计的秒数调用客户端函数并填充 [PROGRESS QUERY %]。
示例:(我使用 boostrap 进度条进行查看)
<!-- 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>
$("#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 【参考方案1】: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 动画为您的进度指示器设置动画。
【讨论】:
【参考方案2】:当然您可能已经想到了这一点,但是您可以编写一个查询来使用 select count([ID]) from dbo.MyTable
确定表中的行数,这应该花费不到 1 秒的时间,然后在客户端构建一些计算来计算当前行数除以表中的总行数...
【讨论】:
如果存在,我会搜索“Query-Trace”。以上是关于使用 PostgreSQL 或 My SQL 的 SQL 查询进度的主要内容,如果未能解决你的问题,请参考以下文章
将 TSQL 转换为 Postgresql - SQL 错误:错误:“[”处或附近的语法错误
sql 使用union,intersection或difference运算符组合查询(来自http://www.postgresql.org/docs/9.4/static/queries-union