在我的 c# 应用程序中,用户可以从 SQL 数据库构建动态报告。如果他们的数据库查询太复杂并且运行时间太长,我需要警告用户。
我正在使用 microsoft-sql-server 2008。
我怎样才能做到这一点?是否有任何统计算法来计算查询执行的运行时间?
在我的 c# 应用程序中,用户可以从 SQL 数据库构建动态报告。如果他们的数据库查询太复杂并且运行时间太长,我需要警告用户。
我正在使用 microsoft-sql-server 2008。
我怎样才能做到这一点?是否有任何统计算法来计算查询执行的运行时间?
这实际上是不可能的。数据库根据表和索引统计信息计算执行计划,甚至数据库本身也无法预测运行时间。
可能有一些迹象,例如排序(和分组,这意味着排序)或多个连接,但在我看来,任何算法预测几乎都是不可能的。
正如其他人已经表明的那样,您无法事先预测复杂性。您所能做的就是让查询运行并在时间过长时中止。
要在一段时间后中止查询,您可以查看SqlCommand.CommandTimeout 属性并将其设置为某个合适的值。这种方法的缺点是用户可能会等待全部时间只是为了得到一条查询需要很长时间的错误消息。
另一种方法是让用户决定什么时候需要很多时间。这可以通过使用无限制 (Timeout = 0) 来完成,但异步调用 execute 方法并简单地向他可以点击的用户提供一个取消按钮。
最后一种方法与 SQL Server Management Studio 中的方法相同。如果您开始查询,您将在页脚中看到一个运行计时器,显示查询当前运行了多长时间,并且在工具栏中,您有一个取消按钮来停止当前运行的查询。
正如其他人所指出的那样,绝对的答案是您无法预先知道查询需要多长时间才能运行。
我可以建议的最接近的事情是,在运行查询之前尝试粗略地了解查询中涉及的内容,即首先检索它的估计执行计划,然后对其进行一些粗略的分析。
SET SHOWPLAN_XML ON
GO
SELECT TOP 100 *
FROM MyTable
GO
在执行计划 XML 中,有诸如估计的行数、优化器在选择执行计划之前是否超时、执行了哪些操作(索引查找/扫描等)以及一大堆其他内容(你真的需要更深入地研究执行计划)。
因此,理论上,您可以尝试查看计划中的信息以做出粗略/最佳猜测判断。请注意,这只是估计的执行计划,我不知道您可以做出何种程度的准确性/判断。
它没有给你时间,只是(也许)某种方式来权衡查询的相对预期成本
您可以根据连接的数量和类型、排序依据和位置条件等因素以及所有受影响表的行数来创建公式。
根据该公式的构建方式,当查询变得“繁重”时,这将给出粗略的指示。