什么是SQL执行计划以及它们如何帮助我?

Dan*_*iel 8 t-sql sql-server sql-execution-plan

我最近听到很多,我应该看看我的SQL的执行计划,以判断它的执行情况.但是,我不确定从何处开始使用此功能或具体含义.

我正在寻找一个很好的解释执行计划的作用,它的局限性,以及我如何利用它或指向一个资源.

Qua*_*noi 4

它描述了服务器用来检索数据的实际算法。

\n\n

SQL像这样的查询:

\n\n
SELECT  *\nFROM    mytable1\nJOIN    mytable2\nON      \xe2\x80\xa6\nGROUP BY\n        \xe2\x80\xa6\nORDER BY\n        \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

,描述了该做什么,但没有描述应该如何做

\n\n

执行计划显示如何:使用哪些索引,选择哪些连接方法(嵌套循环或散列连接或合并连接),如何对结果进行分组(使用排序或散列),如何排序等。

\n\n

不幸的是,即使现代SQL引擎也无法自动找到或多或少复杂查询的最佳计划,SQL开发人员仍然需要重新制定查询以使其具有高性能(即使它们执行原始查询的操作)。

\n\n

一个经典的例子也是这些查询:

\n\n
SELECT  (\n        SELECT  COUNT(*)\n        FROM    mytable mi\n        WHERE   mi.id <= mo.id\n        )\nFROM    mytable mo\nORDER BY \n        id\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
SELECT  RANK() OVER (ORDER BY id)\nFROM    mytable\n
Run Code Online (Sandbox Code Playgroud)\n\n

,它们的作用相同,并且理论上应该使用相同的算法执行。

\n\n

然而,没有实际的引擎会优化前一个查询来实现相同的算法,即将计数器存储在变量中并递增它。

\n\n

它将执行它被告知执行的操作:一遍又一遍地计算行数。

\n\n

要优化查询,您需要实际查看幕后发生的情况,这就是执行计划向您展示的内容。

\n\n

您可能想阅读我博客中的这篇文章:

\n\n\n