查詢優化 sql

2021-04-07 13:25:51 字數 1990 閱讀 4220

查詢1:

declare @d datetime

set @d = getdate()

select top 1000 * from product where contains(name,'男上裝') or contains(text,'男上裝')

select datediff(ms,@d,getdate())

set @d = getdate()

select * from product where contains(name,'男上裝') or contains(text,'男上裝')

select datediff(ms,@d,getdate())

結果1:(總數:14條)

14條資料用時3610(這是使用了top 1000後)

14條資料用時266  (這是沒有使用top 1000的)

查詢2:

declare @d datetime

set @d = getdate()

select top 1000 * from product where contains(name,'公司') or contains(text,'公司')

select datediff(ms,@d,getdate())

set @d = getdate()

select * from product where contains(name,'公司') or contains(text,'公司')

select datediff(ms,@d,getdate())

結果2:(總數:165949條)

1000條資料用時4233(這是用了top 1000後)

165949條資料用時8330(這是沒用top 1000後)

樓主的查詢使用了 or 條件, 這個查詢大致上會這樣生成這樣的執行計畫:

1. 執行兩句:

select top 1000 * from product where contains(name,'男上裝')

select top 1000 * from product where contains(text,'男上裝')

2. 對結果做乙個join

這樣就涉及取兩表join聯接的演算法了

有top 的情況下, 一般使用的是巢狀迴圈, 沒有top的情況下, 多半使用的是雜湊聯接

巢狀迴圈使用的搜尋方法是:

將乙個聯接輸入用作外部輸入表(顯示為圖形執行計畫中的頂端輸入),將另乙個聯接輸入用作內部(底端)輸入表。外部迴圈逐行處理外部輸入表。內部迴圈會針對每個外部行執行,在內部輸入表中搜尋匹配行。

很顯然, 如果匹配的資料很少的話(準確地說匹配的資料在掃瞄順序的尾部, 匹配的資料越少, 發生這種情況的可能性越高), 那麼掃瞄勢必會遍歷完整個表, 這樣的效率顯然不高.

而雜湊聯接不存在這種問題

所以你會發覺, 匹配的資料量少的情況下, top 的執行效率反而低.

option 子句

指定應在整個查詢中使用所指定的查詢提示。每個查詢提示只能指定一次,但允許指定多個查詢提示。用該語句只可能指定乙個 option 子句。查詢提示影響語句中的所有運算子。如果主查詢中涉及 union,則只有涉及 union 運算子的最後乙個查詢可以有 option 子句。如果乙個或多個查詢提示導致查詢優化器不生成有效計畫,則產生 8622 錯誤。

注意  由於查詢優化器通常為查詢選擇最優執行計畫,所以建議只把 , 和 作為經驗豐富的資料庫管理員的最終手段。

語法[ option ( < query_hint > [ ,...n ] ) ]

< query_hint > ::=

group

| union

| join

| fast number_rows

| force order

| maxdop number

| robust plan

| keep plan

| keepfixed plan

| expand views

}

查詢優化 SQL優化

查詢優化注意點 代表查詢速度比較 1 所有查詢必須注意 的使用必要性 cout 1 cout 2 字段 主鍵索引 字段 普通索引 字段 沒有索引 3 乙個字段 多個字段 欄位多越慢 4 大於10000和大於10001的區別 後者大於前者 5 列沒別名 列 有別名6 兩個條件,where時應該將符合資...

優化sql查詢

如何寫出高效能的sql語句 執行計畫是資料庫根據sql語句和相關表的統計資訊坐出的乙個查詢方案,這個方案是由查詢優化器自動分析產生的,比如一條sql語句如果用來從乙個n條記錄中查詢其中一條,那查詢優化器會選擇 索引掃瞄 方式。該錶如果使用了歸檔,那查詢優化器就會改變方案,採用 全表掃瞄 方式。執行計...

SQL查詢優化

避免使用 select 的做法這樣,很多時候查詢出來的字段,資料是冗餘的,是沒有意義的,會消耗網路 cpu 記憶體等等。如果要查詢某些字段,但是查詢這些欄位的資料時,會大量的掃瞄這個表,耗費的資源太大了,怎麼辦呢?我們應該建立合適的索引,避免大量的掃瞄表。比如,我每3個月要刪除大約1000000條資...