【问题标题】:How to determine if query of SQL is too complex?如何判断SQL查询是否过于复杂?
【发布时间】:2012-11-20 22:19:12
【问题描述】:

在我的 c# 应用程序中,用户可以从 SQL 数据库构建动态报告。 如果他们的数据库查询过于复杂并且运行时间过长,我需要警告用户。

我正在使用 microsoft-sql-server 2008。

我该怎么做? 是否有任何统计算法来计算查询执行的运行时间?

【问题讨论】:

  • 太复杂怎么定义?
  • 你的意思是像sql server的查询优化器?我不认为你会写其中之一......
  • 我想你的意思是“太贵了”
  • 打开 SQL 分析器并查看哪些查询花费的时间超过了某个时间段或使用了太多内存等。

标签: c# sql-server-2008 query-optimization


【解决方案1】:

正如其他人已经展示的那样,您无法事先预测复杂性。您所能做的就是让查询运行并在时间过长时中止。

要在一段时间后中止查询,您可以查看SqlCommand.CommandTimeout Property 并将其设置为某个合适的值。这种方法的缺点是用户可能会等待全部时间,只是为了得到一条错误消息,而查询需要很长时间。

另一种方法是让用户决定何时需要花费大量时间。这可以通过不使用限制 (Timeout = 0) 来完成,但 call the execute method asynchronously 只需向他可以点击的用户提供一个取消按钮。

最后一种方法与 SQL Server Management Studio 中的方法相同。如果您开始查询,您会在页脚看到一个正在运行的计时器,显示查询当前正在运行多长时间,并且在工具栏中您有一个取消按钮来停止当前正在运行的查询。

【讨论】:

  • 创建包含一小部分原始数据库表的树桩表听起来合理吗?现在我将首先在这个树桩表上运行查询(用于运行时间指示)并根据查看的运行时间我会估计在原始数据库上执行查询的实际运行时间..有意义吗?
【解决方案2】:

正如其他人所指出的那样,绝对的答案是您无法预先确定查询需要多长时间才能运行。

我可以建议的最接近的事情是,在运行查询之前尝试对查询中涉及的内容给出一个粗略的想法,即首先检索它的估计执行计划,然后做一些粗略的对此进行分析。

SET SHOWPLAN_XML ON
GO
SELECT TOP 100 *
FROM MyTable
GO

在执行计划 XML 中,包含估计的行数、优化器在选择执行计划之前是否超时、执行了哪些操作(索引查找/扫描等)以及大量其他信息(您真的需要更深入地研究执行计划)。

所以理论上,您可以尝试查看计划中的信息以做出粗略/最佳猜测判断。请注意,这只是估计的执行计划,我不知道您可以做出什么样的准确度/判断。

它没有给你时间,只是(也许)某种方式来衡量查询的相对预期成本

【讨论】:

    【解决方案3】:

    您可以根据连接的数量和类型、排序依据和位置条件以及所有受影响表的行数等因素创建公式。

    根据该公式的构建方式,当查询变得“繁重”时,这将为您提供粗略的指示。

    【讨论】:

      【解决方案4】:

      这实际上是不可能的。数据库根据表和索引统计计算执行计划,甚至数据库本身也无法预测运行时间。

      可能有一些迹象,例如排序(和分组,这意味着排序)或多个连接,但在我看来,任何算法预测几乎都是不可能的。

      【讨论】:

      • 我如何表明需要改变连接的顺序?
      • 您永远不需要修改连接顺序(理论上),因为查询优化器应该比您更了解它。最佳连接顺序可能会改变,因为表中元组的数量会发生变化(因此可能是最佳连接算法)等等。聪明的索引和评估执行计划是比强制特定的连接顺序更好的方法。尽管如此,由于统计数据不足或设计缺陷,有时数据库会表现得很奇怪(从我的开发人员的角度来看),因此切换连接顺序是有意义的。唯一的指示是执行计划。
      猜你喜欢
      • 2021-03-31
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多