日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

如何降低SQL语句复杂度

發(fā)布時間:2023/12/10 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何降低SQL语句复杂度 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

SQL語句復(fù)雜度的優(yōu)化就是在結(jié)果正確的前提下,將復(fù)雜、難以維護(hù)的SQL語句拆分成獨立、易懂的SQL片段,當(dāng)然也要充份利用索引,減少表描的I/O次數(shù),盡量避免表搜索的發(fā)生。下面介紹降低SQL語句復(fù)雜度的幾個建議

1、動態(tài)查詢語句

一些應(yīng)用為了實現(xiàn)客戶端的靈活性,會根據(jù)用戶的選擇,動態(tài)拼出TSQL語句,發(fā)給SQL運行。

例如,在用戶界面上列出各種條件,讓用戶根據(jù)自己的喜好,輸入條件,進(jìn)行組合查詢。這樣在功能上來講比較強(qiáng)大,但是在復(fù)雜度控制上就有可能會出問題。如果用戶選擇的條件太多,或者根據(jù)條件返回的記錄太多,就有可能會造成問題。而有些能夠過濾大量數(shù)據(jù),或者在索引上的條件如果沒有被選上,就有可能造成在大表上的table

scan。最好在程序里有動態(tài)語句復(fù)雜度的控制機(jī)制,限制選擇的條件限制返回記錄的數(shù)量。

2、視圖和存儲過程的深度

視圖和存儲過程能夠抽象出一些業(yè)務(wù)邏輯,簡化設(shè)計,是很推薦的做法。但是如果在引用視圖和存儲過程時不加注意,視圖套視圖,存儲過程嵌存儲過程,最后嵌套上四五層,那復(fù)雜度累積起來,可能會超出你想象。對SQL的優(yōu)化,也是很嚴(yán)重的考驗。所以在引用他們的時候,也要考慮累積的復(fù)雜度

3、表格聯(lián)接的數(shù)量

為了支持復(fù)雜的業(yè)務(wù)邏輯,一個應(yīng)用往往會有成百上千的表格,一些查詢往往會聯(lián)接十幾張甚至幾十張表。應(yīng)用設(shè)計的時候?qū)@樣的查詢要很慎重。如果表格很大,十幾張表做聯(lián)接,肯定不會有好的性能。如果應(yīng)用是支持?jǐn)?shù)據(jù)分析系統(tǒng),那可能還好。如果應(yīng)用是一個OLTP系統(tǒng),這樣的設(shè)計失敗的風(fēng)險可能會很大。有時候可能需要降低數(shù)據(jù)庫范式級別,多保存一些冗余數(shù)據(jù)列,以減少表格聯(lián)接的數(shù)量

4、用多個簡單語句替代一個復(fù)雜語句

如果一個復(fù)雜的語句有很多張表要聯(lián)接,要做很多計算,很多時候,要根據(jù)表和表的邏輯關(guān)系,知道某一張表和另一張表如果先做聯(lián)接,可能會過濾掉更多數(shù)據(jù)。得到的小的結(jié)果集再做其他聯(lián)接,會更快。

類似的,有些計算可以先做,也可以后做,我們在了解了表格的邏輯之后會知道是先做好還是后做好。可惜SQL作為一個計算機(jī)程序,在這方面沒有人那么聰明。當(dāng)語句太復(fù)雜的時候,他有可能看不出來了。

為了提高性能,對這種特別復(fù)雜的語句,可以把一句話拆成兩句,甚至三句分步做完,中間結(jié)果集,可以以臨時表的形式存放。這樣做對程序員來講做了很多事,但是對SQL來講,大大簡化了復(fù)雜度。很多時候?qū)π阅芤矔袔椭?/p>

歡迎關(guān)注我的公眾號(同步更新文章):DoNet技術(shù)分享平臺

閱讀原文

總結(jié)

以上是生活随笔為你收集整理的如何降低SQL语句复杂度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。