2009-08-10 66 views
7

每次我發現從我的數據庫檢索數據的性能很慢。我試圖找出我的SQL查詢中哪個部分存在問題,我嘗試對其進行優化,並在表中添加一些索引。但這並不總能解決問題。什麼會導致錯誤的SQL服務器性能?

我的問題是:

是否還有其他技巧,使SQL服務器性能更好?

導致SQL服務器性能變差的其他原因是什麼?

+0

運行探查器,讓它告訴你的查詢速度很慢。 – 2009-08-10 01:29:55

+0

這也應該是CW。我只是說。 – Kredns 2009-08-10 01:30:33

+0

我可以知道它爲什麼被標記爲關閉嗎? – pang 2009-08-10 02:15:35

回答

20
  • 低效的查詢設計
  • 自動增長的文件
  • 太多的索引在表上維持
  • 表上太少指標
  • 沒有做很好的選擇你的聚集索引
  • 指數由於維護不善造成的碎片
  • 由於沒有集羣索引而導致的堆碎片
  • 個過高填充因子用於對索引,從而導致過度的頁拆分
  • 太低上索引使用一個FILLFACTOR,引起過度的空間使用和增加的掃描時間
  • 不使用覆蓋索引,其中使用適當
  • 非選擇性索引
  • 保養不當統計(過時的統計數據)
  • 數據庫無法正常歸
  • 事務日誌和數據共享同一個驅動主軸
  • 個錯誤的內存配置
  • 內存太少
  • 太少CPU
  • 緩慢的硬盤驅動器
  • 故障的硬盤驅動器或其它硬件
  • 數據庫服務器嚼了你的CPU
  • 共享上
  • 三維屏保與其他進程競爭CPU和內存的數據庫服務器
  • 鎖定查詢之間的爭用
  • 查詢哪些掃描整個大表
  • 前端代碼(由行嵌套循環,行)搜索在inefficent方式數據
  • CURSORS其不是必要的和/或不FAST_FORWARD
  • 未設置NOCOUNT當你已經被光標指示的大表通過。
  • 使用事務隔離級別太高(如使用SERIALIZABLE時,它不是必要的)客戶端和SQL Server之間的
  • 太多往返(一個健談的接口)
  • 一個不必要的鏈接的服務器查詢
  • 鏈接的服務器查詢其靶向的表的遠程服務器上沒有主或候選鍵定義
  • 選擇太多的數據
  • 過度查詢重新編譯

哦,也可能有其他一些。

+0

我喜歡那些點形式的答案 – 2009-08-10 01:52:30

+0

這是一個helluva列表。 ;-) – Kredns 2009-08-10 01:59:50

+0

LOL也許明天我可能會再添加一些:) – 2009-08-10 02:05:11

0

如果您不熟悉數據庫,並且有權訪問數據庫引擎優化顧問,則可以啓發式地調整數據庫。

您基本上捕獲SQL Profiler中針對您的數據庫運行的SQL查詢,然後將這些查詢提供給DETA。 DETA有效地運行查詢(不改變數據),然後計算出數據庫缺失的信息(視圖,索引,分區,統計數據等)以更好地執行查詢。

然後,它可以將它們應用於您並在將來監視它們。我並不是說DETA總是正確的,或者是在沒有理解的情況下做事,但我發現它確實是一種很好的方式,可以查看您的查詢在做什麼,它們需要多長時間,以及如何爲數據庫建立索引適當。注:儘管如此,在一個項目開始時投資一個好的DBA要好得多,這樣你就可以擁有良好的結構和索引。但那不是你現在所處的位置......

2

當我與有這個問題的新開發人員談話時,我通常會發現這是因爲兩個問題之一。如果你遵循這兩條規則,它們都是固定的。

首先,不要檢索任何你不需要的數據。例如,如果您正在進行分頁,則不要帶回100行,然後計算哪些頁面屬於該頁面。讓存儲的proc找出它,只檢索你需要的10個。

其次,沒有什麼比你不做的工作更快。例如,我研究了一個系統,在這個系統中,每個請求頁面都檢索了用戶的全部角色和權限 - 對於某些用戶來說,這是100行。即使只是將它保存到第一個請求的會話狀態,然後從那裏用於後續請求,也會從數據庫中獲得有意義的權重。

0

建議您獲得一本關於您使用的數據庫性能調優的好書(這是非常特定的數據庫)。這是一個非常複雜的主題,除了網絡上的普遍性之外,不能真正回答。

例如,戴夫馬克爾告訴你低效的查詢可能會導致問題,並且有許多方法可以編寫低效的查詢和更多的方法來修復它們。

0

這是一個非常廣泛的問題。而且已經有很多答案。我還想補充一個重要的因素 - Page Split。問題是 - 有好的分裂和糟糕的分裂。以下是好文章,解釋如何使用transaction_log擴展事件識別壞/討厭頁拆分

  1. Tracking Problematic Pages Splits in SQL Server 2012 Extended Events - Jonathan Kehayias
  2. Tracking page splits using the transaction log - Paul Randal

你提到:

我嘗試優化它,還加了一些指標

但是,有時刪除未使用的非聚簇索引可能有助於提高性能,因爲它有助於減少事務日誌。閱讀Top Reasons for Log Performance Problems

Wait statistics, or please tell me where it hurts給出了使用等待統計進行性能分析的想法。

要看到一些新鮮的想法性能,看看 Performance Considerations - sqlmag.com

  1. 單獨的表中加入到不同的磁盤(並行磁盤I/O - 文件組)。
  2. 避免加入含有少量唯一值的列。

要了解JOIN,讀Advanced JOIN Techniques

+0

擴展事件疑難解答[使用擴展事件等待信息事件解決運行速度慢的查詢](https://blogs.msdn.microsoft.com/sqlsakthi/2011/02/20/troubleshooting-slow-running-query-using-extended-events - 等待 - 信息事件/) – Lijo 2016-09-26 15:54:43

相關問題