在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提示的時候,要根據實際狀況而定,不能夠胡亂使用。