在SQL Server中,有许多SQL语句的提示,本文总结一些比较常用的提示。
OPTION LOOP/MERGE/HASH JOIN提示
该提示可以改变整个SQL语句中所有JOIN的关联算法,所以请慎用!
下面语句中,我们使用OPTION(MERGE JOIN)提示,将SQL语句的两个JOIN都改为了MERGE JOIN:
SELECT *FROM [dbo].[Student]INNER JOIN [dbo].[City]ON [City].StudentID=[Student].IDINNER JOIN[dbo].[Car]ON [Car].StudentID=[Student].IDOPTION(MERGE JOIN)/*三种JOIN的提示用法如下:OPTION(LOOP JOIN) 将SQL语句中的所有JOIN改为LOOP JOINOPTION(MERGE JOIN) 将SQL语句中的所有JOIN改为MERGE JOINOPTION(HASH JOIN) 将SQL语句中的所有JOIN改为HASH JOIN*/
查看执行计划,我们可以发现SQL语句中的两个JOIN的确都变为MERGE JOIN了:
关联JOIN提示
上面我们看到了用OPTION提示,是改变整个SQL语句所有JOIN的关联算法,比较危险,其实我们还可以对SQL语句中的单个JOIN声明关联算法。
声明[Student]表和[City]表之间,采用LOOP JOIN:
SELECT *FROM [dbo].[Student]INNER LOOP JOIN [dbo].[City]ON [City].StudentID=[Student].IDINNER JOIN[dbo].[Car]ON [Car].StudentID=[Student].ID
执行计划如下,我们可以看到,[Student]表和[City]表之间是使用的LOOP JOIN:
声明[Student]表和[City]表之间,采用MERGE JOIN:
SELECT *FROM [dbo].[Student]INNER MERGE JOIN [dbo].[City]ON [City].StudentID=[Student].IDINNER JOIN[dbo].[Car]ON [Car].StudentID=[Student].ID
执行计划如下,我们可以看到,[Student]表和[City]表之间是使用的MERGE JOIN:
声明[Student]表和[City]表之间,采用HASH JOIN:
SELECT *FROM [dbo].[Student]INNER HASH JOIN [dbo].[City]ON [City].StudentID=[Student].IDINNER JOIN[dbo].[Car]ON [Car].StudentID=[Student].ID
执行计划如下,我们可以看到,[Student]表和[City]表之间是使用的HASH JOIN:
可以看到采用单个JOIN的提示要比使用OPTION提示灵活很多。