系統調優之查詢優化日記開篇

2021-04-23 20:43:05 字數 2386 閱讀 4431

從今天開始,**比較經典的資料庫查詢問題,並提供解決方法,希望對大家有幫助,同時大家也可以跟帖多提建議和更好的解決方案

所有語句都是用sql的事件探查器結合查詢分析器進行

建議大家對所有問題語句先仔細看,跟周圍人一起看來理解查詢的意思,然後再看後面的分析,否則不利於理解

對於索引的建立和優化修改因情況複雜,在每個案例中不做詳細解釋,會集中講解

對於大併發環境使用sql語句,要嚴格養成和遵守以下規則:

1、所有系統都是要定期優化的,但這決不是我們初期可以隨便設計和隨便寫的理由,嘴在你身上,該用的時候就用,在不知道學習方法時,最好的方法就是詢問和討論

2、硬體是可以公升級的,但不是買個伺服器那麼簡單,很多查詢,伺服器沒我們想像的永遠那麼快,因為他不是只做這個查詢,就象研發也不是天天在那裡等任務一樣

3、開發速度和系統的嚴謹高效不矛盾,缺的只是好的習慣和對自己的要求

4、只要是查詢,就使用客戶端游標而不是預設的伺服器端游標

5、每個查詢無論簡單與否,都要認真到查詢分析器裡分析執行過程後再決定使用,因為你不是資料庫

6、在查詢時,只查詢和返回要的資料,不要的資料就不要把他弄進來,做分頁顯示時尤其如此

7、優化(建索引)不只是為了select查詢,對於delete和update也是非常重要的(delete和update其實也是先找到記錄才做動作的)

8、建立普通的檢視只是幫你把複雜的查詢封裝了,並不能提高查詢速度,每次呼叫檢視,檢視都是要去實際查詢一下的。

9、在我們要更新或刪除大量資料時(一般情況下絕對不建議啊,除非經至少部門經理同意),如果記錄可每5000條做一下,那就不要每10000條做下(此處數字只是做個例子),因為資料庫是要記錄操作日誌的,這也是很耗資源的,雖然我們分開做的完成速度慢了些,但至少可以保證完成,而一次操作大量資料很可能因影響範圍太大而完不成,資料庫再回滾,一場災難產生了。

10、修改資料表結構、修改欄位名和字段型別,甚至調整下欄位順序(其實沒必要),都是把資料表重新複製了一遍,然後把舊表刪除,把新錶再改回原名,所以大表修改時的後果可想而知,想想第8條。但給已有字段新增修改注釋還是可以接受的

11、sqlserver提供的很多內建函式和運算表示式,沒你想像的那麼好,至少在sql語句的查詢和排序條件裡堅決不要出現,你一定可以有其他替代辦法的,比如最常用的日期比較函式就是個典型的容易讓人出問題的函式

12、盡量避免出現 not、<>、or、in  等等讓事情變複雜的符號,而是多用=、>、>=、<、<=等等結果和範圍明確的符號,因為索引本來就是為符合條件而生,當我們跟資料庫說要不符合條件的,索引就不那麼高效了

13、like關鍵字不能隨便用,但如果有其他條件可以把like的範圍縮小,比如篩選到只有幾百條記錄要like,那麼效能基本可以接受,千萬不要對乙個大表直接就上like

14、所有非關鍵查詢(不涉及錢和名額的我覺得都不算關鍵)建議加上with (nolock)的查詢提示,減少阻塞(這不是提速語句,但阻塞少了,系統也會變快)

15、所有直接提交的sql語句務必在語句結尾加上注釋(說明是哪個頁面裡的哪個函式裡用的),便於sql事件探查器捕捉到後,可以快速定位問題語句的位置

16、優化不是單純用索引就可以搞定的,優化是個枯燥長期但有成就感的事情,當需要改動資料庫結構才能起作用時,就需要跟團隊一起討論,盡快制訂完善的改動計畫,讓團隊的人都知道如何改動,哪些地方要改動,而不是乙個人就直接動手改,別人都不知道,否則最後的結果就是錯誤一大堆,老的查詢語句沒全部改掉,大家再來擦pp

上面的如果你做不到,下面的你也沒必要看了,改行吧

不想改行的各位,首先發上今天的經典問題語句

select top 10 c.memberid,d.username as membername,c.finance,c.dpnum,d.user_photo as userpic from  (select top 10 a.memberid, sum(a.amount) as finance,(select count(*) from [17uebooking].[dbo].[hoteldianping] e where a.memberid=e.memberid) as dpnum from [17uebooking].[dbo].[memberamountdetail] a inner join [17uebooking].[dbo].[memberinfo] b on a.memberid =b.memberid where a.createdate>'2007-8-1' and a.createdate <'2009-7-31' and a.flag='1' and a.amounttype='houseprize' group by a.memberid order by a.finance desc) c left outer join b2c_user d on c.memberid = d.[id] order by finance desc ;

以上句子請認真看,腦子裡模仿下資料庫把各個表進行連線,一定會發現乙個低階問題

mysql調優之schema優化

mysql的三正規化 1nf 第一正規化 字段不可分 2nf 第二正規化 有主鍵,非主鍵字段依賴主鍵 3nf 第三正規化 非主鍵字段不能相互依賴 解釋 1nf 原子性 字段不可再分,否則就不是關聯式資料庫 2nf 唯一性 乙個表只說明乙個事物 3nf 每列都與主鍵有直接關係,不存在傳遞依賴 在企業中...

python效能調優 優化字典查詢

chartosoundex def soundex source input check omitted for brevity source source 0 upper source 1 digits source 0 for s in source 1 s s.upper digits cha...

linux系統之核心調優

1 編輯核心配置檔案 永久性 vim etc sysctl.con2 引數及簡單說明 net.ipv4.tcp fin timeout 2 保持在fin wait 2狀態的時間,使系統可以處理更多的連線。此引數值為整數,單位為秒。net.ipv4.tcp tw reuse 1 開啟重用,允許將tim...