Atitit 如何利用先有索引項進行查詢效能優化

2021-09-07 07:59:08 字數 2768 閱讀 2647

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的普及太快,很多 都會因為大流量的資料而發生伺服器習慣性宕機,乙個查詢語句只能適用於一定的網路環境.沒有優化的查詢當遇上大資料量時就不適用了.本文主旨 討論什麼情況下能利用上索引.索引 建立索引可以根據查詢業務的不同分為兩種 單一列的索引,聯合索引.顧名思義,單一列索引就是指在表的某...