【发布时间】:2010-10-09 22:23:49
【问题描述】:
在 SQL 上下文中,失控查询是什么意思?
这是否意味着任何查询在花费太长时间时都会疯狂运行? 还是说它会因为触发器而产生一些副作用?
【问题讨论】:
标签: sql terminology definition
在 SQL 上下文中,失控查询是什么意思?
这是否意味着任何查询在花费太长时间时都会疯狂运行? 还是说它会因为触发器而产生一些副作用?
【问题讨论】:
标签: sql terminology definition
失控查询是指执行时间比优化器估计的执行时间长的查询。失控查询可能会导致在执行期间耗尽所有处理器周期或其他资源。
【讨论】:
这是一个开始运行并且永不返回的查询(对于“never”的某些值)。
通常这意味着查询没有使用它应该使用的索引,或者使用了错误的连接方法,或者错误的连接顺序,或者进行了一堆字符串转换/比较。
可以编写需要数周/数年才能执行的 SQL 查询。
【讨论】:
我将此术语专门应用于通常意外触发具有意外复杂性的运行时行为的查询。如果您希望查询采用 O(n * m) (即两个表之间的单个连接)并且它需要 O(n * n * m) 那么我会称之为失控,即使 n * n * m 是在本案中可以接受的小。更常见的情况是,查询预计需要 O(log(n) * log(m)) 需要 O(n * n * m * m),结果证明是不可接受的复杂。
【讨论】:
失控查询具有许多特征 - 从中挑选一些:
在所有情况下,它们都倾向于阻止其他用户做任何有用的工作。
【讨论】:
我相信这意味着您执行并且永远不会返回。例如,执行一个永远不会返回结果的 select 语句(或者这样做需要很长时间)。
【讨论】:
当查询连接的行数超过了所需的数量时。
来自Wikipedia:该语言使得进行笛卡尔连接(连接所有可能的组合)变得过于容易,当 WHERE 子句输入错误时,这会导致“失控”结果集。笛卡尔连接在实践中很少使用,因此可能需要明确的笛卡尔关键字。 SQL 1992 引入了 CROSS JOIN 关键字,该关键字允许用户明确表示要进行笛卡尔连接,但不带谓词的速记“逗号连接”仍然是可接受的语法。
【讨论】:
失控查询通常是需要很长时间和/或大量系统资源(CPU、内存等)才能完成的查询。
常见的原因可能是:
“失控”查询最终可能会回来,只是需要太长时间或太多系统资源才值得。
【讨论】:
只是提到如果涉及编写不佳的触发器,可能会发生失控查询。触发器必须能够处理多记录插入/更新或删除,并且已知有些人通过使用游标而不是通过使用基于集合的语言来做到这一点。这可能会导致更新大量记录的查询失控。最近能够通过替换一个这样的触发器将大量正在更新的记录的查询时间从 40 多分钟缩短到 40 秒。
其他原因包括意外的交叉连接(用 distinct 修复)、不可解析的 where 子句、使用子查询或使用定义的函数、不正确的索引、尚未更新的统计信息、使用游标、连接或 where 中的定义不足。不断地。
【讨论】: