在sql server中,有許多sql語句的提示,本文總結一些比較常用的提示。
option loop/merge/hash join提示
該提示可以改變整個sql語句中所有join的關聯演算法,所以請慎用!
下面語句中,我們使用option(merge join)提示,將sql語句的兩個join都改為了merge join:
select檢視執行計畫,我們可以發現sql語句中的兩個join的確都變為merge join了:*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
*/
關聯join提示
上面我們看到了用option提示,是改變整個sql語句所有join的關聯演算法,比較危險,其實我們還可以對sql語句中的單個join宣告關聯演算法。
宣告[student]表和[city]表之間,採用loop join:
select執行計畫如下,我們可以看到,[student]表和[city]表之間是使用的loop join:*from
[dbo
].[student
]inner loop join
[dbo
].[city]on
[city
].studentid=
[student
].id
inner
join
[dbo
].[car]on
[car
].studentid=
[student
].id
宣告[student]表和[city]表之間,採用merge join:
select執行計畫如下,我們可以看到,[student]表和[city]表之間是使用的merge join:*from
[dbo
].[student
]inner merge join
[dbo
].[city]on
[city
].studentid=
[student
].id
inner
join
[dbo
].[car]on
[car
].studentid=
[student
].id
宣告[student]表和[city]表之間,採用hash join:
select執行計畫如下,我們可以看到,[student]表和[city]表之間是使用的hash join:*from
[dbo
].[student
]inner hash join
[dbo
].[city]on
[city
].studentid=
[student
].id
inner
join
[dbo
].[car]on
[car
].studentid=
[student
].id
可以看到採用單個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執行計畫如下,我們可以看到,該sql語句,現在的確是使用了索引[ix_index]和[ix_student_index_code]:*from
[dbo
].[student
]with(index([
ix_index
]),index([
ix_student_index_code
]))
我們還可以將鎖定提示和索引提示結合在一起使用,如下所示:
select stu.*我們宣告了該sql語句對錶[student]新增排它鎖(xlock),並且排它鎖的鎖定級別為表鎖(tablock),並且我們要使用表[student]的[ix_index]索引(index([ix_index]))。這幾個提示結合在一起使用,之間用逗號分隔開即可。from
[dbo
].[student
]as stu with(xlock,tablock,index([
ix_index
]))
最後提醒下,sql server的提示並不是什麼情況下都可以使用的,有時候使用提示會帶來負面效果甚至報錯,檢視這裡了解,所以在具體選擇使用sql server提示的時候,要根據實際情況而定,不可以胡亂使用。
SQLSERVER中忽略索引提示
當我們想讓某條查詢語句利用某個索引的時候,我們一般會在查詢語句裡加索引提示,就像這樣 複製 如下 select id,name from tb with index ix xttrace bal where bal 100 當在生產環境裡面,由於這個索引提示的原因,優化器一般不會再去考慮其他的索引,...
安裝SQL Server 遇到錯誤提示的解決
以前的某個程式安裝已在安裝計算機上建立掛起的檔案操作。執行安裝程式之前必須重新啟動計算機 找了半天,沒發現什麼一場程式,該機器上以前沒安裝過sql server。看看系統安裝了什麼軟體?3721 上網助手什麼的赫然在目 刪掉 還是不行,搜尋了一下,發現這篇blog最有價值 3 開啟登錄檔編輯器,在h...
SQLSERVER中如何忽略索引提示
當我們想讓某條查詢語句利用某個索引的時候,我們一般會在查詢語句裡加索引提示,就像這樣 select id,name from tb with index ix xttrace bal where bal 100 當在生產環境裡面,由於這個索引提示的原因,優化器一般不會再去考慮其他的索引,那有時候這個...