7

在 SQL 的上下文中,失控查询是什么意思?

这是否意味着任何查询在花费太长时间时都会疯狂运行?或者这是否意味着由于触发器而产生一些副作用?

4

8 回答 8

10

失控查询是执行时间比优化器估计的执行时间长的查询。失控查询可能导致在执行期间耗尽所有处理器周期或其他资源。

于 2009-02-25T21:35:05.380 回答
4

这是一个开始运行并且永远不会返回的查询(对于“从不”的某些值)。

通常这意味着查询没有使用它应该使用的索引,或者使用了错误的连接方法,或者错误的连接顺序,或者进行了一堆字符串转换/比较。

可以编写需要数周/数年才能执行的 SQL 查询。

于 2009-02-25T21:35:23.397 回答
2

我将此术语专门应用于通常意外触发具有意外复杂性的运行时行为的查询。如果您希望查询采用 O(n * m)(即两个表之间的单个连接)并且它需要 O(n * n * m),那么我会称之为失控,即使 n * n * m 是在本案中可以接受的小。更常见的情况是,查询预计需要 O(log(n) * log(m)) 需要 O(n * n * m * m),结果证明是不可接受的复杂。

于 2009-02-25T21:37:06.980 回答
2

失控查询具有许多特征 - 从以下选项中选择一些:

  • 他们产生巨大的结果集
  • 他们锁了很多桌子
  • 它们导致事务日志中有大量条目
  • 它们消耗大量的 I/O 和 CPU 资源

在所有情况下,它们都倾向于阻止其他用户做任何有用的工作。

于 2009-02-25T21:38:36.027 回答
1

我相信这意味着你执行并且永远不会返回。例如,执行一个永远不会返回结果的 select 语句(或者需要很长时间才能这样做)。

于 2009-02-25T21:34:06.770 回答
1

当查询连接的行数超过了所需的数量时。

来自Wikipedia:该语言使得进行笛卡尔连接(连接所有可能的组合)变得太容易了,当 WHERE 子句输入错误时,这会导致“失控”结果集。笛卡尔连接在实践中很少使用,因此可能需要明确的笛卡尔关键字。SQL 1992 引入了 CROSS JOIN 关键字,该关键字允许用户明确表示要进行笛卡尔连接,但不带谓词的速记“逗号连接”仍然是可接受的语法。

于 2009-02-25T21:36:32.910 回答
1

失控查询通常是需要很长时间和/或大量系统资源(CPU、内存等)才能完成的查询。

常见的原因可能是:

  • 未能使用索引列
  • 未能正确连接表(因此您至少得到一个交叉产品)
  • 已使用索引列的错误表统计信息
  • 许多字符串比较或操作

一个“失控”的查询最终可能会回来,它只需要太长或太多的系统资源才值得。

于 2009-02-25T21:38:41.127 回答
0

只是提到如果涉及编写不佳的触发器,可能会发生失控查询。触发器必须能够处理多记录插入/更新或删除,并且已知有些人通过使用游标而不是通过使用基于集合的语言来做到这一点。这可能会导致更新大量记录的查询失控。最近能够通过替换一个这样的触发器将大量正在更新的记录的查询时间从 40 多分钟减少到 40 秒。

其他原因包括意外的交叉连接(用 distinct 修复)、不可分割的 where 子句、使用子查询或使用定义的函数、不正确的索引、尚未更新的统计信息、使用游标、连接或 where 中的定义不足。不断地。

于 2009-02-25T21:52:22.887 回答