SQL select 語句優化

2021-08-31 19:29:46 字數 2113 閱讀 6395

關於 select * from o1,o2......

至於為何要進行資料庫優化,就不在這裡重述了。

在這裡,將本著謹慎的,簡單的態度,一點一點的講述sql資料查詢語句的優化問題:

一,關於索引:

使用索引的合理性:

條件子句中變數順序應與索引字鍵順序相同。(盡可能在join和order by 的字段上建立索引)將最具有限制性的條件放在前面,大值在前,小值在後。

eg:...where o.a <1000 and o.a>200 效率高於 where o.a>200 and o.a<1000

...where o.a between 200 and 1000 效率高於 where o.a>200 and o.a<1000

二,關於萬用字元:

避免採用matches和like萬用字元匹配查詢:

由於採用like等萬用字元查詢時,sql優化器實際上還是用順序搜尋的方法來查詢的,也就是說,在被查詢的字段上建立的索引實際上是不起作用的。

eg:...where o.b <『12399』 and o.b>『123000 』 效率高於 where o.b matche 『123*』

三,關於子查詢:

查詢巢狀層次越多,效率越低,因此應當盡量避免子查詢。假如子查詢不可避免,那麼要在子查詢中過濾掉盡可能多的行。

eg:...from o1,o2 where o1.c=o2.c and o2.a=2009 效率高於 from o1 where o1.c in(select o2.c from o2 where o2.a=2009)

四,關於順序訪問時的巢狀查詢:

在進行大資料量的索引歸類時,有些形式的where子句會強迫優化器使用順序訪問,從而使得原索引字段失效。

eg:...where (o.d = 123 and o.a>200 ) union o.b=1010 效率高於 where (o.d = 123 and o.b>200) or o.b=1010

五,關於臨時表:

使用臨時表加速查詢

把錶的乙個子集進行排序並建立臨時表,有時能加速查詢。注意:臨時表建立後不會反映主表的修改。在主表中資料頻繁修改的情況下,注重不要丟失資料。

eg:...select unique to1 into temp to1 "然後(then)"select count(*)from temp to1 效率高於select count(distinct)

六,關於聚集函式:

1.對於大資料量的求和應避免使用單一的sum命令處理,可採用group by方式與其結合,有時會大大提高效率。

2.避免會引起磁碟讀寫的 rowid* 等操作。在where子句中或select語句中,用rowid要產生磁碟讀寫,是乙個物理過程,會影響sql效能。

sql優化比較複雜,且受環境限制,但開發過程中,寫sql要遵循最起碼的原則.如下:

1.oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾.

例如:(低效)

select … from emp e where sal > 50000 and job = 『manager』 and 25 < (select count(*) from emp where mgr=e.empno);

(高效)

select … from emp e where 25 < (select count(*) from emp where mgr=e.empno) and sal > 50000 and job = 『manager』;

2.select子句中避免使用』*』

當在select子句中列出所有的column時,使用動態sql列引用 『*』 是乙個方便的方法.可是,這是乙個非常低效的方法. 實際上,oracle在解析的過程中, 會將』*』 依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的, 這意味著將耗費更多的時間.

3. 使用表的別名(alias)

當在sql語句中連線多個表時, 請使用表的別名並把別名字首於每個column上.這樣一來,就可以減少解析的時間並減少那些由column歧義引起的語法錯誤.

(column歧義指的是由於sql中不同的表具有相同的column名,當sql語句中出現這個column時,sql解析器無法判斷這個column的歸屬)

sql select語句複習

昨天看見了乙個select語句 感覺還可以,拿出來與大家分享一下 當然 字段 表名 僅作參考 供複習用 select dd db table field.field name,dd db table field.ispk,dd db table field.can null,select memo ...

優化SQL SELECT 語句效能的6個簡單技巧

select語句的效能調優有時是乙個非常耗時的任務,在我看來他遵循帕累託原則。20的努力很可能給你帶來 80 的提公升。而為了獲取另外 20 的效能提公升,你可能需要花費 80 的時間。檢查索引 在sql語句中的 where 和join 語句中,用到的所有欄位都加上索引。限制工作資料集的大小 當你的...

SQL SELECT語句的巢狀

問題 現在資料庫中有一張使用者交易表order,其中有userid 使用者id orderid 訂單id amount 訂單金額 paytime 支付時間 請寫出對應的sql語句,查出每個月的新客數 新客指在嚴選首次支付的使用者 當月有複購的新客數,新客當月複購率 公式 當月有複購的新客數 月總新客...