Dan*_*iel 8 t-sql sql-server sql-execution-plan
我最近听到很多,我应该看看我的SQL的执行计划,以判断它的执行情况.但是,我不确定从何处开始使用此功能或具体含义.
我正在寻找一个很好的解释执行计划的作用,它的局限性,以及我如何利用它或指向一个资源.
它描述了服务器用来检索数据的实际算法。
\n\nSQL
像这样的查询:
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\nSELECT (\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\nSELECT 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