細(xì)數(shù)提高SQL查詢性能的十條戒律
記錄詳細(xì)的需求文檔
在寫(xiě)SQL之前必須弄清楚需求, 具體要取什么數(shù)據(jù), 有些什么具體的約束條件, 在數(shù)據(jù)倉(cāng)庫(kù)環(huán)境中還可以考慮補(bǔ)上這個(gè)需求具體對(duì)應(yīng)哪些報(bào)表, 對(duì)應(yīng)的基礎(chǔ)表如何. 到開(kāi)發(fā)環(huán)境的話, 可以考慮加上這條SQL服務(wù)于哪些業(yè)務(wù)(頁(yè)面),調(diào)用頻率如何.
不要重新制造輪子
對(duì)于一些已經(jīng)比較成熟的解決方案,有比較現(xiàn)成的例子的SQL,要善于利用已有SQL,已有模板.
降低語(yǔ)句的復(fù)雜度
有些同學(xué)可能比較喜歡使用比較炫的技術(shù),比較炫的SQL來(lái)解決問(wèn)題. 但是要切記一點(diǎn), 使用過(guò)于復(fù)雜過(guò)于新的技術(shù), 如果不能在性能(以及其他方面)帶來(lái)好處的話, 只會(huì)使得這條SQL難于維護(hù), 使得其他相關(guān)人員難于理解.
小心處理NULL
NULL在Oracle數(shù)據(jù)庫(kù)中是一個(gè)非常特別的值, 它不等于任何值, 所以如果你的SQL返回的值數(shù)量偏少,或者根本不對(duì)很可能就是使用NULL出現(xiàn)了問(wèn)題..常見(jiàn)的情況是:
1. 查詢的時(shí)候直接使用條件 colx = xxx,而這個(gè)colx里面是有NULL值的, 這種情況下查詢的返回結(jié)果是不會(huì)包含NULL值對(duì)應(yīng)的記錄的, 如果要查詢出NULL對(duì)應(yīng)的記錄, 需要使用 colx is null (is not null).
2. var 為null的時(shí)候, 在plsql中給var賦值, var := var + xxx;這種情況下var的值會(huì)一直是null的, 這一點(diǎn)需要特別注意, 我自己也犯過(guò)好幾次這個(gè)錯(cuò)誤.
自己核對(duì)數(shù)據(jù)類型
在where條件里面要仔細(xì)地核對(duì)數(shù)據(jù)類型, 由于隱形轉(zhuǎn)換的問(wèn)題, 在數(shù)據(jù)類型錯(cuò)誤的時(shí)候, Oracle無(wú)法正確使用索引, 可能會(huì)導(dǎo)致SQL運(yùn)行非常慢.
小心處理重復(fù)數(shù)據(jù)
在需求明確的情況下, 如果你不在乎是否出現(xiàn)重復(fù)記錄, 或者明確知道不會(huì)出現(xiàn)重復(fù)數(shù)據(jù)的情況下, 盡量使用Union All而不是Union進(jìn)行查詢, Union會(huì)涉及到昂貴的排序操作.
避免不必要的優(yōu)化操作
SQL的性能調(diào)優(yōu)可能非常有趣非常帶勁, 但是很多時(shí)候調(diào)優(yōu)可能意義不大, 比如對(duì)于只會(huì)使用一次的查詢, 你可能很少在乎是1秒鐘結(jié)束還是2秒鐘結(jié)束..
不過(guò)一些基本的優(yōu)化規(guī)則還是要用的:
只查詢你需要的字段, 而不要所有的查詢都是用select *來(lái)進(jìn)行.
在通過(guò)索引來(lái)查詢更合適的時(shí)候, 盡量在查詢條件中指定有索引的字段來(lái)查詢. (在返回的記錄條數(shù)很少的時(shí)候, 使用索引一般都能更加快速的得到查詢結(jié)果.不要可以避免使用表連接. 關(guān)系數(shù)據(jù)庫(kù)就是為了表連接而設(shè)計(jì)的.
盡可能使用綁定變量
在開(kāi)發(fā)環(huán)境使用的SQL語(yǔ)句盡量使用綁定變量, 這樣可以大大緩解Oracle數(shù)據(jù)庫(kù)解析SQL的消耗, 也可以大大提高數(shù)據(jù)庫(kù)的可擴(kuò)展性.
使用源碼控制工具
***使用CVS/SVN一類的源碼控制工具來(lái)管理你的SQL/PLSQL代碼, 這對(duì)于后期的維護(hù)有非常大的幫助, 也有助于其他人更好的理解你最初寫(xiě)這條SQL的意圖.
測(cè)試,測(cè)試,測(cè)試.
在SQL寫(xiě)好之后, 要深入的進(jìn)行測(cè)試, 以確保其正常運(yùn)行
原文標(biāo)題:如何提高SQL 查詢技能
鏈接:http://www.dbthink.com/?p=172
【編輯推薦】
- Oracle數(shù)據(jù)庫(kù)索引和SQL Server的闡述
- Oracle更改表空間大小的代碼與實(shí)際操作
- Oracle優(yōu)化器的3不同類型介紹
- Oracle優(yōu)化器三大種類的介紹
- Oracle優(yōu)化器二十六個(gè)參數(shù)



























