SQL Server的經常使用提示

在SQL Server中,有許多SQL語句的提示,本文總結一些比較經常使用的提示。html

 

 

OPTION LOOP/MERGE/HASH JOIN提示算法


 

該提示能夠改變整個SQL語句中全部JOIN的關聯算法,因此請慎用!spa

下面語句中,咱們使用OPTION(MERGE JOIN)提示,將SQL語句的兩個JOIN都改成了MERGE JOIN:3d

SELECT *
FROM 
[dbo].[Student]
INNER JOIN 
[dbo].[City]
ON [City].StudentID=[Student].ID
INNER JOIN
[dbo].[Car]
ON [Car].StudentID=[Student].ID
OPTION(MERGE JOIN)
/*
三種JOIN的提示用法以下:
OPTION(LOOP JOIN) 將SQL語句中的全部JOIN改成LOOP JOIN
OPTION(MERGE JOIN) 將SQL語句中的全部JOIN改成MERGE JOIN
OPTION(HASH JOIN) 將SQL語句中的全部JOIN改成HASH JOIN
*/

查看執行計劃,咱們能夠發現SQL語句中的兩個JOIN的確都變爲MERGE JOIN了:code

 

 

關聯JOIN提示htm


 

上面咱們看到了用OPTION提示,是改變整個SQL語句全部JOIN的關聯算法,比較危險,其實咱們還能夠對SQL語句中的單個JOIN聲明關聯算法。blog

 

聲明[Student]表和[City]表之間,採用LOOP JOIN:索引

SELECT *
FROM 
[dbo].[Student]
INNER LOOP JOIN 
[dbo].[City]
ON [City].StudentID=[Student].ID
INNER JOIN
[dbo].[Car]
ON [Car].StudentID=[Student].ID

執行計劃以下,咱們能夠看到,[Student]表和[City]表之間是使用的LOOP JOIN:get

 

聲明[Student]表和[City]表之間,採用MERGE JOIN:it

SELECT *
FROM 
[dbo].[Student]
INNER MERGE JOIN 
[dbo].[City]
ON [City].StudentID=[Student].ID
INNER 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].ID
INNER JOIN
[dbo].[Car]
ON [Car].StudentID=[Student].ID

執行計劃以下,咱們能夠看到,[Student]表和[City]表之間是使用的HASH JOIN:

 

能夠看到採用單個JOIN的提示要比使用OPTION提示靈活不少。

 

 

鎖定提示


 

在SQL語句中,咱們還能夠在表名後聲明鎖的類型和鎖定級別,下面查詢語句中,咱們就聲明瞭在表[Student]上使用排它鎖WITH(XLOCK)

SELECT *
FROM 
[dbo].[Student] WITH(XLOCK)

關於鎖定提示,能夠查看這篇文章,這裏就不作過多的介紹了。

 

 

索引提示


 

在SQL語句中,咱們還能夠在表名後聲明要使用表上的哪些索引,語法是

WITH(INDEX([索引名]))

若是要使用表上的多個索引,就用逗號分隔開便可:

WITH(INDEX([索引名1]),INDEX([索引名2]),INDEX([索引名3]))

 

以下SQL語句就聲明瞭,咱們要使用表[Student]的索引[IX_Index]和[IX_Student_Index_Code]:

SELECT *
FROM 
[dbo].[Student] WITH(INDEX([IX_Index]),INDEX([IX_Student_Index_Code]))

執行計劃以下,咱們能夠看到,該SQL語句,如今的確是使用了索引[IX_Index]和[IX_Student_Index_Code]:

 

咱們還能夠將鎖定提示和索引提示結合在一塊兒使用,以下所示:

SELECT Stu.*
FROM 
[dbo].[Student] AS Stu WITH(XLOCK,TABLOCK,INDEX([IX_Index]))

咱們聲明瞭該SQL語句對錶[Student]添加排它鎖(XLOCK),而且排它鎖的鎖定級別爲表鎖(TABLOCK),而且咱們要使用表[Student]的[IX_Index]索引(INDEX([IX_Index]))。這幾個提示結合在一塊兒使用,之間用逗號分隔開便可。

 

最後提醒下,SQL Server的提示並非什麼狀況下均可以使用的,有時候使用提示會帶來負面效果甚至報錯,查看這裏瞭解,因此在具體選擇使用SQL Server提示的時候,要根據實際狀況而定,不能夠胡亂使用。

相關文章
相關標籤/搜索