atitit
如何利用先有索引項進行查詢效能優化
1.1. 再分析的話就是我們所寫的查詢條件,其實大部分情況也無非以下幾種:
11.2.
範圍查詢
動態索引查詢
11.2.1.
索引聯合
所謂的索引聯合,就是根據就是根據篩選條件的不同,拆分成不同的條件,去匹配不同的索引項。
21.3.
索引交叉2
1、等於謂詞:
select ...where...column=@parameter
2、比較謂詞:
select ...where...column> or < or <> or <= or >= @parameter
3、範圍謂詞:
select ...where...column in or not in or between and @parameter
4、邏輯謂詞:
select ...where...
乙個謂詞 or、
and
其它謂詞 or、
and
更多謂詞
....
我們就依次分析上面幾種情況下,如何利用索引進行查詢優化的
select orderid
from orders
where shippostalcode in (n
'05022'
,n'99362')
所以sql server盡量想採取索引查詢的方式,其實
in關鍵字和
or關鍵字邏輯是一樣的。
於是上面的查詢條件就轉換成了:
[northwind].[dbo].[orders].[shippostalcode]=n'05022'
or [northwind].[dbo].[orders].[shippostalcode]=n'99362'
這樣就可以採用索引查詢了,先查詢第乙個結果,然後再查詢第二個,而這個過程在sql server中就被稱為:
動態索引查詢
所以變成引數後首先解決的問題就是去重問題,2個一樣的變成1個。
select orderid
from orders
where orderdate between
'1998-01-01'
and
'1998-01-07'
or shippeddate between
'1998-01-01'
and
'1998-01-07'
這段**是查詢出訂單中的訂單日期在2023年1月
1日到2023年1
月7日的或者發貨日期同樣在
2023年1
月1日到2023年1
月7日的。邏輯很簡單,我們知道在這種表裡面這兩個欄位都有索引項。所以這個查詢在sql server中就有了兩個選擇:
1、一次性的來個索引掃瞄根據匹配結果項輸出,這樣簡單有效,但是如果訂單表資料量比較大的話,效能就會很差,因為大部分資料就根本不是我們想要的,還要浪費時間去掃瞄。
2、就是通過兩列的索引字段直接查詢獲取這部分資料,這樣可以直接減少資料表的掃瞄量,但是帶來的問題就是,如果分開掃瞄,有一部分資料就是重複的:那些同時在
2023年1
月1日到2023年1
月7日的訂單,發貨日期也在這段時間內,因為兩個掃瞄項都包含,所以再輸出的時候需要將這部分重複資料去掉。
奉上乙個and的乙個連線謂詞的操作方式,這個方式被稱為:
索引交叉
,意思就是說如果兩個或多個篩選條件如果採用的索引是交叉進行的,那麼使用乙個就可以進行查詢。
來看個語句就明白了
這裡我們採用了的謂詞連線方式為and,所以在實際執行的時候,雖然兩列都存在非聚集索引,理論都可以使用,但是我們只要選乙個最優的索引進行查詢,另外乙個直接使用書籤查詢出來就可以。省去了前面介紹的各種神馬排序去重
....
流聚合去重
....
等等不人性的操作。
sql server調優系列基礎篇(索引運算總結)
- 指尖流淌
- .html
sql server調優系列基礎篇(索引運算總結)
- 指尖流淌
- .html
作者:: 綽號:
老哇的爪子claw
of eagle
偶像破壞者iconoclast
image-smasher
捕鳥王"
bird
catcher
王中之王king of kings
虔誠者pious
宗教信仰
捍衛者defender
of the faith
.卡拉卡拉
紅斗篷caracalla
red cloak
簡稱::emir
attilax
akbar
埃公尺爾阿提拉克斯
阿克巴全名:
:emir
attilax
akbar
bin
mahmud
bin attila bin
solomon
al rapanui
埃公尺爾阿提拉克斯
阿克巴本
馬哈茂德
本阿提拉
本所羅門
阿爾 拉帕努伊
常用名:艾提拉(
艾龍),
email:[email protected]
attilax的專欄
--atiend
如何高效地利用MySQL索引
1 在經常做搜尋的列上,也就是where子句裡經常出現的列,考慮加上索引,加快搜尋速度。2 唯一標識記錄的列,應該加上唯一索引,強制該列的唯一性並且加快按該列查詢記錄的速度。3 在內連線使用的列上加上索引,最好是在內連線用到欄位都加上,因為mysql優化器會自動地選擇連線順序,然後觀察索引的使用情況...
如何利用NumPy進行索引和切片
處理多維陣列,如何利用numpy進行索引和切片?今天番茄加速就來跟大家講解下。平時遇到關於numpy的bug,解決不了的,可以先去檢視api的使用說明。理解numpy的向量化能力,這正是賦予它簡潔的重要原因之一。使用python原生api會經常寫些for,但是numpy讓它變得不再需要,numpy一...
如何才能充分利用SQL索引
背景 目前web的普及太快,很多 都會因為大流量的資料而發生伺服器習慣性宕機,乙個查詢語句只能適用於一定的網路環境.沒有優化的查詢當遇上大資料量時就不適用了.本文主旨 討論什麼情況下能利用上索引.索引 建立索引可以根據查詢業務的不同分為兩種 單一列的索引,聯合索引.顧名思義,單一列索引就是指在表的某...