SQL Server的常用提示

2022-02-06 05:30:48 字數 3726 閱讀 6247

在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

].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了:

關聯join提示

上面我們看到了用option提示,是改變整個sql語句所有join的關聯演算法,比較危險,其實我們還可以對sql語句中的單個join宣告關聯演算法。

宣告[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:

宣告[student]表和[city]表之間,採用merge join:

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

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 當在生產環境裡面,由於這個索引提示的原因,優化器一般不會再去考慮其他的索引,那有時候這個...