共計 1328 個字符,預計需要花費 4 分鐘才能閱讀完成。
今天就跟大家聊聊有關 SQLSERVER 中怎么忽略索引提示,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
當我們想讓某條查詢語句利用某個索引的時候,我們一般會在查詢語句里加索引提示,就像這樣
復制代碼 代碼如下:
SELECT id,name from TB with (index(IX_xttrace_bal)) where bal 100
當在生產環境里面,由于這個索引提示的原因,優化器一般不會再去考慮其他的索引,那有時候這個索引提示可能會導致查詢變慢
經過你的測試,發現確實是因為這個索引提示的關系導致查詢變慢,但是 SQL 服務器已經緩存了這條 SQL 語句的執行計劃,如果修改 SQL 語句的話可能會有影響
而且,可能不單只一條 SQL 語句用了索引提示,還有其他的 SQL 語句也用了索引提示,你不可能馬上去修改這些 SQL 語句的時候可以使用 SQLSERVER 里面的一個 trace flag
這個 trace flag 能忽略 SQL 語句里面的索引提示和存儲過程里面的索引提示
不需要修改 SQL 語句,就可以進行性能排查
運行下面腳本創建數據庫和相關索引
復制代碼 代碼如下:
USE masterGOIF DB_ID(Trace8602) IS NOT NULL DROP DATABASE Trace8602GOCREATE DATABASE Trace8602GOUSE Trace8602GOCREATE TABLE xttrace8602 (id INT IDENTITY(1, 1) PRIMARY KEY , bal INT , name VARCHAR(100) )GOCREATE NONCLUSTERED INDEX IX_xttrace8602_bal_name ON xttrace8602(bal,name)GOCREATE NONCLUSTERED INDEX IX_xttrace8602_bal ON xttrace8602(bal)GOINSERT INTO xttrace8602VALUES (RAND() * 786, cnblogs.com/lyhabc )GO 10000CREATE PROC uspFirstAS SELECT id , name FROM xttrace8602 TF WITH (INDEX ( IX_xttrace8602_bal) ) WHERE bal 100GO
現在執行下面代碼
復制代碼 代碼如下:
– 沒有使用跟蹤標致 EXEC uspFirst GO
復制代碼 代碼如下:
– 使用了跟蹤標志 DBCC TRACEON(8602,-1)GODBCC FREEPROCCACHEGOEXEC uspFirst GO
可以看到,打開 TRACEON(8602,-1) 跟蹤標志之后,SQLSERVER 忽略了索引提示,利用復合索引 IX_xttrace8602_bal_name 把數據查出來
而不需要額外的鍵查找
這個跟蹤標志不需要你修改你的 SQL 語句就可以讓 SQLSERVER 忽略索引提示
在使用這個 8602 跟蹤標志之前記得先在開發環境測試好,確認是否需要忽略索引提示,以便做成性能問題
看完上述內容,你們對 SQLSERVER 中怎么忽略索引提示有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注丸趣 TV 行業資訊頻道,感謝大家的支持。