一、檢視和儲存過程的深度
檢視和儲存過程能夠抽象出一些業務邏輯,簡化設計,是很推薦的做法。但是如果在引用檢視和儲存過程時不加注意,檢視套檢視,儲存過程嵌儲存過程,最後巢狀上四五層,那複雜度累積起來,可能會超出你想象。對sql的優化,也是很嚴重的考驗。所以在引用他們的時候,也要考慮累積的複雜度
二、**聯接的數量
為了支援複雜的業務邏輯,乙個應用往往會有成百上千的**,一些查詢往往會聯接十幾張甚至幾十張表。應用設計的時候對這樣的查詢要很慎重。如果**很大,十幾張表做聯接,肯定不會有好的效能。如果應用是支援資料分析系統,那可能還好。如果應用是乙個oltp系統,這樣的設計失敗的風險可能會很大。有時候可能需要降低資料庫正規化級別,多儲存一些冗餘資料列,以減少**聯接的數量
三、用多個簡單語句替代乙個複雜語句
如果乙個複雜的語句有很多張表要聯接,要做很多計算,很多時候,要根據表和表的邏輯關係,知道某一張表和另一張表如果先做聯接,可能會過濾掉更多資料。得到的小的結果集再做其他聯接,會更快。
類似的,有些計算可以先做,也可以後做,我們在了解了**的邏輯之後會知道是先做好還是後做好。可惜sql作為乙個電腦程式,在這方面沒有人那麼聰明。當語句太複雜的時候,他有可能看不出來了。
為了提高效能,對這種特別複雜的語句,可以把一句話拆成兩句,甚至三句分步做完,中間結果集,可以以臨時表的形式存放。這樣做對程式設計師來講做了很多事,但是對sql來講,大大簡化了複雜度。很多時候對效能也會有幫助
參考資料: 如何降低sql語句複雜度
複雜SQL語句提問
table t1 和 table t2 表結構相同,但資料不同 t1 create table t1 id int,tm datetime,data varchar 200 資料 1 2009 11 11 資料1 1 2009 11 12 資料2 2 2009 11 12 資料3 3 2009 11...
sql複雜查詢語句
1.描述 在資料庫中使用sql語句查詢資料,常常需要做報表和統計分析。難免需要做很多的複雜查詢。解決方案 呼叫資料庫的自帶函式 我用的是mysql的函式 來查詢 函式中巢狀函式來實現複雜查詢 2.例項 求差函式 sum 函式巢狀函式查詢 使用timestampdiff函式查詢2002 01 01到現...
SQL 語句優化 OR 語句優化案例
從上海來到溫州,看了前幾天監控的sql語句和資料變化,發現有一條語句的io次數很大,達到了150萬次io,而兩個表的資料也就不到20萬,為何有如此多的io次數,下面是執行語句 select ws.nodeid,wi.laststepid,wi.curstepid from workflowinfo ...