每次我發現從我的數據庫檢索數據的性能很慢。我試圖找出我的SQL查詢中哪個部分存在問題,我嘗試對其進行優化,並在表中添加一些索引。但這並不總能解決問題。什麼會導致錯誤的SQL服務器性能?
我的問題是:
是否還有其他技巧,使SQL服務器性能更好?
導致SQL服務器性能變差的其他原因是什麼?
每次我發現從我的數據庫檢索數據的性能很慢。我試圖找出我的SQL查詢中哪個部分存在問題,我嘗試對其進行優化,並在表中添加一些索引。但這並不總能解決問題。什麼會導致錯誤的SQL服務器性能?
我的問題是:
是否還有其他技巧,使SQL服務器性能更好?
導致SQL服務器性能變差的其他原因是什麼?
哦,也可能有其他一些。
我喜歡那些點形式的答案 – 2009-08-10 01:52:30
這是一個helluva列表。 ;-) – Kredns 2009-08-10 01:59:50
LOL也許明天我可能會再添加一些:) – 2009-08-10 02:05:11
如果您不熟悉數據庫,並且有權訪問數據庫引擎優化顧問,則可以啓發式地調整數據庫。
您基本上捕獲SQL Profiler中針對您的數據庫運行的SQL查詢,然後將這些查詢提供給DETA。 DETA有效地運行查詢(不改變數據),然後計算出數據庫缺失的信息(視圖,索引,分區,統計數據等)以更好地執行查詢。
然後,它可以將它們應用於您並在將來監視它們。我並不是說DETA總是正確的,或者是在沒有理解的情況下做事,但我發現它確實是一種很好的方式,可以查看您的查詢在做什麼,它們需要多長時間,以及如何爲數據庫建立索引適當。注:儘管如此,在一個項目開始時投資一個好的DBA要好得多,這樣你就可以擁有良好的結構和索引。但那不是你現在所處的位置......
當我與有這個問題的新開發人員談話時,我通常會發現這是因爲兩個問題之一。如果你遵循這兩條規則,它們都是固定的。
首先,不要檢索任何你不需要的數據。例如,如果您正在進行分頁,則不要帶回100行,然後計算哪些頁面屬於該頁面。讓存儲的proc找出它,只檢索你需要的10個。
其次,沒有什麼比你不做的工作更快。例如,我研究了一個系統,在這個系統中,每個請求頁面都檢索了用戶的全部角色和權限 - 對於某些用戶來說,這是100行。即使只是將它保存到第一個請求的會話狀態,然後從那裏用於後續請求,也會從數據庫中獲得有意義的權重。
建議您獲得一本關於您使用的數據庫性能調優的好書(這是非常特定的數據庫)。這是一個非常複雜的主題,除了網絡上的普遍性之外,不能真正回答。
例如,戴夫馬克爾告訴你低效的查詢可能會導致問題,並且有許多方法可以編寫低效的查詢和更多的方法來修復它們。
這是一個非常廣泛的問題。而且已經有很多答案。我還想補充一個重要的因素 - Page Split
。問題是 - 有好的分裂和糟糕的分裂。以下是好文章,解釋如何使用transaction_log
擴展事件識別壞/討厭頁拆分
你提到:
我嘗試優化它,還加了一些指標
但是,有時刪除未使用的非聚簇索引可能有助於提高性能,因爲它有助於減少事務日誌。閱讀Top Reasons for Log Performance Problems
Wait statistics, or please tell me where it hurts給出了使用等待統計進行性能分析的想法。
要看到一些新鮮的想法性能,看看 Performance Considerations - sqlmag.com
- 單獨的表中加入到不同的磁盤(並行磁盤I/O - 文件組)。
- 避免加入含有少量唯一值的列。
要了解JOIN
,讀Advanced JOIN Techniques
擴展事件疑難解答[使用擴展事件等待信息事件解決運行速度慢的查詢](https://blogs.msdn.microsoft.com/sqlsakthi/2011/02/20/troubleshooting-slow-running-query-using-extended-events - 等待 - 信息事件/) – Lijo 2016-09-26 15:54:43
運行探查器,讓它告訴你的查詢速度很慢。 – 2009-08-10 01:29:55
這也應該是CW。我只是說。 – Kredns 2009-08-10 01:30:33
我可以知道它爲什麼被標記爲關閉嗎? – pang 2009-08-10 02:15:35