查詢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條資...