Sql “什么是”呢;失控查询“;?

Sql “什么是”呢;失控查询“;?,sql,terminology,definition,Sql,Terminology,Definition,在SQL上下文中,失控查询是什么意思 这是否意味着任何查询在花费太长时间时都会失控? 或者,它是否意味着由于触发器而产生一些副作用?我相信它意味着一个你执行并且永远不会返回的副作用。例如,执行一条永远不会返回结果的select语句(或者执行该语句需要很长时间)。失控查询是指执行时间比优化器估计的执行时间长的查询。失控查询可能会在执行过程中耗尽所有处理器周期或其他资源。这是一个开始运行且永远不会返回的查询(对于某些“从不”值) 通常这意味着查询没有使用它应该使用的索引,或者没有使用错误的连接方法,

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

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

我相信它意味着一个你执行并且永远不会返回的副作用。例如,执行一条永远不会返回结果的select语句(或者执行该语句需要很长时间)。

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

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

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


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

当一个查询连接的行数超过所需的行数时,就可以执行SQL查询

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

我专门将此术语应用于一个查询,该查询通常会意外地触发运行时异常复杂的行为。如果您期望一个查询采用O(n*m)(即两个表之间的一个连接)并采用O(n*n*m),那么我将称之为失控,即使n*n*m在当前情况下小得可以接受。更常见的情况是,当一个查询预期采用O(log(n)*log(m))采用O(n*n*m*m)时,这种情况变得异常复杂。

失控查询有许多特征-从以下几个方面中选择一些:

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

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

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

常见的原因可能是:

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

“失控”查询甚至可能会再次出现,只是需要太长时间或太多的系统资源才能使其变得有价值。

请注意,如果涉及编写不当的触发器,可能会发生失控查询。触发器必须能够处理多条记录的插入/更新或数据挖掘,有些人通过使用游标而不是使用基于集合的语言来实现这一点。这可能导致查询将大量记录更新为失控。通过更换一个这样的触发器,最近能够将更新的大量记录的查询时间从40分钟缩短到40秒


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

或者通常会耗尽所有磁盘I/O