SQL Server效能調優雜記(一)----傻瓜機的失效效應

來源:互聯網
上載者:User

最近,下面的一個項目遇到緊急問題,我這匹老馬也要和年輕人一起奮鬥一下。問題是當把一倍壓力 資料灌入資料庫,很多查詢都奇慢無比。

說道這裡必須要說一下效能問題的基本準則。效能問題 Tunning的次序

1)架構設計(軟體架構和資料庫設計,糟糕的設計幾乎是致命的)

2)代碼缺 陷(導致效能問題的90%)

3)增加索引(這個是要根據實際情況來確定)

4)資源調優(CPU- >記憶體->Disk IO)

這裡網路不是考慮因素。

把程式的SQL文拿出來一看,有的一看一 堆子查詢構成的JOIN,基本上一眼就可以斷定,需要重寫。我們這個運用系統把SQL文都配置成動態, 這個設計給現在的調優帶來了方便。

突然出現了一個很有趣的現象。有一個查詢很慢(一分鐘才 出來),檢查SQL文。這句SQL文是這樣

SELECT ISNULL(a.CWB_NO,b.CWB_NO) AS CWB_NO,a.IMPORT_AWB_NO,
a.IMPORT_BWB_NO,ISNULL(a.PCS,0) AS RS2PCS,ISNULL(b.PCS,0) AS DECPCS,a.CCC_STATUS
FROM 
(SELECT * FROM  TB_CWB WHERE IMPORT_AWB_NO = @IMPORT_AWB_NO) a
FULL JOIN 
(SELECT * FROM  TP_DECSUMMARY WHERE AWB_NO = @IMPORT_AWB_NO) b
ON  a.CWB_NO = b.CWB_NO AND  b.AVAILABLE = 'Y'
WHERE  a.AVAILABLE = 'Y'

FULL JOIN不是問題核心(因為商務規則就是這樣),也不是 SELECT *,其實SELECT *和指定欄位或許有差異,但是絕對不會有很大差別。

我在後台運行了一 下,0秒都不到。但是另外一個程式員說同樣運行要59秒。奇怪!!!

拿過來對比一下,就發現差 異了。

因為,我們的系統採取的是用.NET中cmd指定參數的寫法,轉換成後台sql文,等於運行 sp_executesql的方法。更簡單說就是替換變數。

即等價的SQL文應該是

SELECT ISNULL(a.CWB_NO,b.CWB_NO) AS CWB_NO,a.IMPORT_AWB_NO,
a.IMPORT_BWB_NO,ISNULL(a.PCS,0) AS RS2PCS,ISNULL(b.PCS,0) AS DECPCS,a.CCC_STATUS
FROM 
(SELECT * FROM  TB_CWB WHERE  IMPORT_AWB_NO = '25200000011') a
FULL JOIN 
(SELECT * FROM  TP_DECSUMMARY WHERE AWB_NO ='25200000011') b
ON  a.CWB_NO = b.CWB_NO AND  b.AVAILABLE = 'Y'
WHERE a.AVAILABLE = 'Y'

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.