定義索引時, 應該考慮索引鍵列的資料是按公升序還是按降序儲存. 公升序是預設設定, 保持與 sql server 早期版本的相容性. create index, create table 和 alter table 語句的語法在索引和約束中的各列上支援關鍵字 asc(公升序)和 desc(降序):
當引用表的查詢包含用以指定索引中鍵列的不同方向的 order by 子句時, 指定鍵值儲存在該索引中的順序很有用. 在這些情況下, 索引就無需在查詢計畫中使用 sort 運算子. 因此, 使得查詢更有效. 例如, adventure works cycles 採購部門的買方不得不評估他們從**商處購買的產品的質量. 買方傾向於查驗那些由具有高拒絕率的**商傳送的產品. 檢索資料以滿足此條件需要將 purchasing.purchaseorderdetail 表中的 rejectedqty 列按降序(由大到小)排序, 並且將 productid 列按公升序(由小到大)排序, 如下列查詢所示 :
use此查詢的下列執行計畫顯示了查詢優化器使用 sort 運算子按 order by 子句指定的順序返回結果集.adventureworks2008r2;
goselect
rejectedqty,
((rejectedqty
/orderqty)*
100) as
rejectionrate,
productid,
duedate
from
purchasing.purchaseorderdetail
order
by rejectedqty desc
, productid
asc;
如果使用與查詢的 order by 子句中的鍵列匹配的鍵列建立索引, 則無需在查詢計畫中使用 sort 運算子,從而使查詢計畫更有效.
create再次執行查詢後,下列執行計畫顯示未使用 sort 運算子,而使用了新建立的非聚集索引.nonclustered
index
ix_purchaseorderdetail_rejectedqty
on purchasing.purchaseorderdetail (rejectedqty desc, productid asc, duedate, orderqty);
資料庫引擎 可以在兩個方向上同樣有效地移動. 對於乙個在 order by 子句中列的排序方向倒排的查詢,仍然可以使用定義為 (rejectedqty desc, productid asc) 的索引. 例如,包含 order by 子句 order by rejectedqty asc, productid desc 的查詢可以使用該索引.
只可以為鍵列指定排序順序,sys.index_columns目錄檢視和 indexkey_property 函式報告索引列是按公升序還是降序儲存.
復合索引 復合索引順序選擇問題
color red b 注意!在較高版本的oracle中不存在下述的問題!b color 復合索引第乙個原則 字首性 prefixing color red 復合索引的字首性是指只有當復合索引的第乙個字段出現在sql語句的謂詞條件中時,該索引才會被用到。如復合索引為 ename,job,mgr 只要...
聯合索引區分順序
select from t where b 5,c 3,a 4 建立聯合索引a,b,c和建立聯合索引b,c,a有區別嗎?答案是有的。如果建立時間放在第一位,不會走索引。由於這一天是壓測,建立時間都集中在那一天。如果status放第一位,會走索引。因為聯合索引是根據順序來排序的,先搜尋a,再搜尋b,再...
索引與排序
索引與排序 排序可能發生2種情況 1 對於覆蓋索引,直接在索引上查詢時,就是有順序的,using index 2 先取出資料,形成臨時表做filesort 檔案排序,但檔案可能在磁碟上,也可能在記憶體中 我們的爭取目標 取出來的資料本身就是有序的 利用索引來排序.盡量不要出現filesort 比如 ...