SQL Server的常用提示

SQL Server的常用提示

在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提示灵活很多。

推荐阅读