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