在SQL的上下文中, 失控查询 是什么意思?
这是否意味着任何查询在花费的时间太长时会运行? 或者它是否意味着由于触发器会产生一些副作用?
答案 0 :(得分:8)
失控查询是一种查询,其执行时间比优化程序估计的执行时间要长。失控查询可能导致在执行期间耗尽所有处理器周期或其他资源。
答案 1 :(得分:4)
这是一个开始运行的查询,永远不会回来(对于某些“永不”的值)。
通常它意味着查询不使用它应该使用的索引,或使用错误的连接方法,或者错误的连接顺序,或者进行一堆字符串转换/比较。
可以编写需要数周/年才能执行的SQL查询。
答案 2 :(得分:2)
我将此术语专门应用于一个查询,该查询通常会意外地触发具有意外复杂性的运行时的行为。如果您希望查询采用O(n * m)(即两个表之间的单个连接)并且需要O(n * n * m)那么我会将其称为失控,即使n * n * m是在本案中可接受的小。更常见的是,这经历了一个预期采用O(log(n)* log(m))取O(n * n * m * m)的查询,结果证明是不可接受的复杂。
答案 3 :(得分:2)
失控查询具有许多特征 - 从以下选择:
在所有情况下,它们往往会阻止其他用户从事任何有用的工作。
答案 4 :(得分:1)
我相信这意味着你执行并永不返回。例如,执行一个永远不会返回结果的select语句(或者需要很长时间才能完成)。
答案 5 :(得分:1)
当查询加入的行多于超出必要的行时。
来自Wikipedia:该语言使得进行笛卡尔联接(加入所有可能的组合)变得太容易了,当WHERE子句输入错误时会导致“失控”结果集。笛卡尔连接在实践中很少使用,因此需要明确的CARTESIAN关键字。 SQL 1992引入了CROSS JOIN关键字,允许用户明确表示笛卡尔连接,但是没有谓词的简写“逗号连接”仍然是可接受的语法。
答案 6 :(得分:1)
失控查询通常是一个需要很长时间和/或大量系统资源(CPU,内存等)才能完成的查询。
常见原因可能是:
“失控”的查询可能会偶然回来,只需花费太长时间或太多的系统资源就可以实现。
答案 7 :(得分:0)
提一下,如果涉及写得不好的触发器,可能会发生失控查询。触发器必须能够处理多记录插入/更新或删除,并且已知某些人通过使用游标而不是通过使用基于集合的语言来执行此操作。这可能会导致查询更新大量记录以使其失控。最近能够通过替换一个这样的触发器,将大量记录的查询时间从40多分钟缩短到40秒。
其他原因包括意外交叉连接(使用不同的固定),不可分割的where子句,使用子查询或使用已定义的函数,索引不正确,未更新的统计信息,游标的使用,连接中的定义不足或其中。等等。