如何微调以下SQL查询?

时间:2017-01-09 05:56:19

标签: sql-server tsql sql-server-2012

我正在尝试替换嵌套循环以合并无强制选项的连接,我已经给出了表数据和查询以下谢谢。

表1:

   N_ID S_NAME  DEPT
    1   NAME1   DEPT1
    2   NAME2   DEPT2
    3   NAME3   DEPT3

表2:

  N_ID  S_CITY  PHONE
    1   CITY1   PHONE1
    2   CITY2   PHONE2
    3   CITY3   PHONE3

我已创建如下索引:

CREATE NONCLUSTERED INDEX IX_NC ON TBL1(N_ID)
INCLUDE (S_NAME)

CREATE NONCLUSTERED INDEX IX_NC ON TBL2(N_ID)

查询:

SELECT A.N_ID,S_NAME FROM TBL1 A
INNER JOIN TBL2 B ON A.N_ID=B.N_ID;

这是我的执行计划:

enter image description here

1 个答案:

答案 0 :(得分:2)

除非你有理由强制使用嵌套循环进行合并连接,否则我不建议这样做..

SQLServer内部将连接实现为三个运算符

1.嵌套循环
2.Hash
3.Merge

每个都有自己的优势,并且不可能说,一个连接比其他连接更好.SQL可以根据许多因素选择任何连接,总体而言,它选择一个成本更低的计划......

提出你的问题,按照文件......

在..时选择嵌套循环

  

如果一个连接输入很小(少于10行)并且另一个连接输入相当大并且在其连接列上建立索引,则索引嵌套循环连接是最快的连接操作,因为它们需要最少的I / O和最少的比较

MSDN也解释了嵌套循环连接有效的情况。

  

如果外部输入很小并且内部输入是预索引且大,则嵌套循环连接特别有效。在许多小事务中,例如仅影响一小组行的事务,索引嵌套循环连接优于合并连接和散列连接。

因此,除非您以这种方式强制提示并设计数据,否则SQL会选择合并连接。在您的情况下无法进行合并

参考文献:
https://msdn.microsoft.com/en-us/library/ms191426(v=sql.100).aspx