再回首 資料庫篇 SQL語句的優化02

2021-10-06 12:40:31 字數 2366 閱讀 6668

2. 對索引列進行運算導致索引失效,我所指的對索引列進行運算包括(+,-,*,/,! 等)

3. 使用oracle內部函式導致索引失效.對於這樣情況應當建立基於函式的索引

4. 以下使用會使索引失效,應避免使用

5.不要將空的變數值直接與比較運算子(符號)比較

6.不要在 sql **中使用雙引號。

7.將索引所在表空間和資料所在表空間分別設於不同的磁碟chunk上,有助於提高索引查詢的效率。

8.oracle預設使用的基於代價的sql優化器(cbo)非常依賴於統計資訊,一旦統計資訊不正常,會導致資料庫查詢時不使用索引或使用錯誤的索引。

9. oracle在進行一次查詢時,一般對乙個表只會使用乙個索引。

10. 優先且盡可能使用分割槽索引。

上節中我們講到sql語句在生活生產中的一些禁區,和一些我們應該規避的錯誤。
我們知道了sql語句的規範,以及sql語句的雷區,那麼我們如何不使用那麼多聯立,如何訪問這些大表才能不影響資料庫執行呢?怎麼才能提高效率呢?

當你引入索引,腰不酸了腿不疼了,沒事走兩步,甚至能起飛了。

就像進了一家飯店了,沒有選單,你說:老闆,來份炒飯。老闆:回你沒有。你說:老闆,來份,蛋炒飯。老闆始終說沒有。於是你試完了所有你知道的菜名,終於點上了。

那你想想,是不是很難受???索引就像那份選單,看到就點高效快捷。

但是很多情況會導致索引失效,同學們在編寫sql語句時一定要注意。
由於表的字段tu_mdn定義為varchar2(20),但在查詢時把該字段作為number型別以where條件傳給oracle,這樣會導致索引失效。

錯誤的例子:

select

*from test where tu_mdn=

13333333333

;

正確的例子:
select

*from test where tu_mdn=

'13333333333'

;

錯誤的例子:
select

*from test where id-1=

9;

正確的例子:
select

*from test where id=

10;

錯誤的例子:

此時id的索引已經不起作用了

select

*from test where

round

(id)=10

;

正確的例子:

首先建立函式索引,再選出資料,這時函式索引起作用了

create

index test_id_fbi_idx on test(

round

(id));

select

*from test where

round

(id)=10

;

a. 使用 <> 、not in 、not exist、!=

b. like 「%_」 百分號在前(可採用在建立索引時用reverse(columnname)這種方法處理)

c. 單獨引用復合索引裡非第一位置的索引列.應總是使用索引的第乙個列,如果索引是建立在多個列上, 只有在它的第乙個列被where子句引用時,優化器才會選擇使用該索引。

d. 字元型字段為數字時在where條件裡不新增引號.

e. 當變數採用的是times變數,而表的字段採用的是date變數時.或相反情況。

如果變數可能為空,應使用 is null 或 is not null 進行比較,或者使用 isnull 函式。

因為字元常量使用單引號。如果沒有必要限定物件名稱,可以使用(非 ansi sql 標準)括號將名稱括起來。

一般來說,oracle的自動任務裡面會包含更新統計資訊的語句,但如果表資料發生了比較大的變化(超過20%),可以考慮立即手動更新統計資訊,例如:analyze table abc compute statistics,但注意,更新統計資訊比較耗費系統資源,建議在系統空閒時執行。

因此,有時候過多的索引可能導致oracle使用錯誤的索引,降低查詢效率。例如某錶有索引1(policyno)和索引2(classcode),如果查詢條件為 policyno = 『xx』 and classcode = 『xx』,則系統有可能會使用索引2,相較於使用索引1,查詢效率明顯降低。

再回首,資料結構 鍊錶上的常見操作

最近在複習資料結構,順便看看大一的時候寫的 看完之後比當初有了更加深刻的體會。希望這些能提供給初學者一些參考。線性表的鏈式儲存結構 typedef struct lnode listnode typedef listnode linklist 單鏈表的查詢運算 linklist locate lin...

再回首,資料結構 鏈棧上的常見操作

最近在複習資料結構,順便看看大一的時候寫的 看完之後比當初有了更加深刻的體會。希望這些能提供給初學者一些參考。棧的鏈式儲存結構 typedef struct snode stacknode typedef stacknode linkstack 初始化棧 linkstack stackinit 判斷...

資料庫優化 sql語句優化

1 group by語句優化 因為mysql對所有group by的字段進行排序,所以如果包含group by但是想要避免排序結果的消耗,可以指定order by null來進行group by的排序。select id,sun moneys from sales group by id expla...