INDEX建立方式對SQL的影響

2021-09-05 06:23:39 字數 1321 閱讀 6371

我常常會聽到一些同事對自己的sql很有信心,往往說一句:「你看,已經走索引了」。但是我們真的使用了適合我們的索引嗎?

我抓取到一句sql,消耗了太多的io。

select smin_infoid,nvl(mi.monu_province,

'未知'),

count

(*) i_resultnum

from tbl_wap*** ware,tbl_sms*** smin,tbl_mobile*** mi,tbl_user*** usin

where ware_date > :b2

and ware_date <= :b2 + :b1 /24

and ware.ware_uid_fk=usin.usin_uid_fk

and substr(usin.usin_phnum,1,7)=mi.monu_phonenum(+)

and ware_wruiid_fk=smin.smin_infoid

group

by smin_infoid ,mi.monu_province

因為tbl_wap***資料量比較大,而造成該sql執行緩慢並且io消耗高。看看它的sql執行計畫和成本估算(如下圖)

注意畫框index(為tbl_wap***的相關索引),雖然走了索引,但是成本和cardnility都很高。檢查這個索引發現其實blevel只有2。而再仔細檢視sql並詢問實現的功能,其實索引的字段為date型別,該sql只是檢查最近幾個小時的資訊變化.

在where條件中(ware_date > :b2)因為是範圍查詢,索引使用了(rang scan),加之該錶資料量眾多(千萬級別),直接影響了sql執行效能。

但是通過檢查發現,這個索引就是直接建立的b-tree索引。而我注意到其實該sql檢查的就是最近乙個或幾個小時的資料,終於可以找到一些問題所在了。index建立時預設情況下,索引的字段採用公升序(asc)建立,而這種方法顯然是不適合當前這個sql的,我們可以通過建立基於降序的索引來適應實際的需求。

sql>

create

index idx_ware_date1

on tbl_wap***x(ware_date

desc)

2        tablespace usertbs;

再來檢查執行的sql計畫和預算成本:

執行成本大幅降低。index的建立時索引字段排序的方式其實對特定sql影響還是很大的。尤其是一些歷史流水表,在某些情況下只是查詢近期的資料時,就顯得尤為重要了。

ps:最近總是很忙,忙的只有在睡覺前才有時間寫點東西。但是實在太累,總是無法好好的寫。真的要好好堅持堅持呀 -:),否則年初的目標就很難完成了。

EurekaLog 對Delphi執行緒的影響

eurekalog在delphi中使用後,會對執行緒有影響,主要是對執行緒自動釋放的影響,看下面的例子 判斷執行緒是否結束可以使用下面的方法 if assigned testthread and not testthread.finished then 執行緒沒有結束 如果使用了eurekalog再...

letter spacing屬性對居中的影響

轉,在設計乙個網頁的時候,有時候為了讓頁面的可讀性更好,更加美觀 就會使用到letter spacing屬性 letter spacing屬性是增加 值為正 或減少 值為負 字元間距 也就是說當應用在英文是,就是增加或減少每個字母之間的間距,在中文文字中應用就是每個文字之間的間距 然後我就遇到了問題...

Tab控制項標籤頁的顯示方式對標籤內容的影響

有很多應用是在tab控制項的每個標籤頁中填入內容,通常的做法是,如果啟用預設的標籤頁,預設內容就顯示,而沒有被啟用的標籤頁,內容是不顯示的,這裡可以是動態載入的,比如切換標籤頁的時候,才去載入其內容。有時候,內容的顯示尺寸是動態的,它可能超出你所指定的範圍,假如你固定死它的尺寸,即使出現下拉滾動條也...