SQLSERVER查詢速度慢的緣由收集以及優化建議

  • SQLSERVER查詢速度慢的緣由收集
  1. 沒有索引或者沒有用到索引(這是查詢慢最多見的問題,是程序設計的缺陷)。
  2. I/O吞吐量小,造成了瓶頸效應。
  3. 沒有建立計算列致使查詢不優化SQL Server數據庫。
  4. 內存不足。
  5. 網絡速度慢。
  6. 查詢出的數據量過大(能夠採用屢次查詢,其餘的方法下降數據量)。
  7. 鎖或者死鎖(這也是查詢慢最多見的問題,是程序設計的缺陷)。
  8. sp_lock,sp_who,活動的用戶查看,緣由是讀寫競爭資源。
  9. 返回了沒必要要的行和列。
  10. 查詢語句很差,沒有優化。
  • 優化建議
  1. 把數據、日誌、索引放到不一樣的I/O設備上,增長讀取速度,之前能夠將Tempdb應放在RAID0上,SQL2000不在支持。數據量(尺寸)越大,提升I/O越重要。
  2. 縱向、橫向分割表,減小表的尺寸(sp_spaceuse)。
  3. 升級硬件。
  4. 根據查詢條件,創建索引,優化索引、優化SQL Server數據庫訪問方式,限制結果集的數據量。注意填充因子要適當(最好是使用默認值0)。索引應該儘可能小,使用字節數小的列建索引好(參照索引的建立),不要對有限的幾個值的字段建單一索引如性別字段。
  5. 提升網速。
  6. 擴大服務器的內存,Windows 2000和SQL server 2000能支持4-8G的內存。配置虛擬內存:虛擬內存大小應基於計算機上併發運行的服務進行配置。運行 Microsoft SQL Server? 2000 時,可考慮將虛擬內存大小設置爲計算機中安裝的物理內存的 1.5 倍。若是另外安裝了全文檢索功能,並打算運行 Microsoft 搜索服務以便執行全文索引和查詢,可考慮:將虛擬內存大小配置爲至少是計算機中安裝的物理內存的 3 倍。將 SQL Server max server memory 服務器配置選項配置爲物理內存的 1.5 倍(虛擬內存大小設置的一半)。
  7. 增長服務器 CPU個數;可是必須明白並行處理串行處理更須要資源例如內存。使用並行仍是串行程是MsSQL自動評估選擇的。單個任務分解成多個任務,就能夠在處理器上運行。例如耽擱查詢的排序、鏈接、掃描和GROUP BY字句同時執行,SQL SERVER根據系統的負載狀況決定最優的並行等級,複雜的須要消耗大量的CPU的查詢最適合並行處理。可是更新操做Update,Insert, Delete還不能並行處理。
  8. 若是是使用like進行查詢的話,簡單的使用index是不行的,可是全文索引,耗空間。 like ‘a%’ 使用索引 like ‘%a’ 不使用索引用 like ‘%a%’ 查詢時,查詢耗時和字段值總長度成正比,因此不能用CHAR類型,而是VARCHAR。對於字段的值很長的建全文索引。
  9. DB Server 和APPLication Server 分離;OLTP和OLAP分離。
  10. 分佈式分區視圖可用於實現數據庫服務器聯合體。聯合體是一組分開管理的服務器,但它們相互協做分擔系統的處理負荷。這種經過分區數據造成數據庫服務器聯合體的機制可以擴大一組服務器,以支持大型的多層 Web 站點的處理須要。有關更多信息,參見設計聯合數據庫服務器。(參照SQL幫助文件’分區視圖’)在實現分區視圖以前,必須先水平分區表。
  11. 在建立成員表後,在每一個成員服務器上定義一個分佈式分區視圖,而且每一個視圖具備相同的名稱。這樣,引用分佈式分區視圖名的查詢能夠在任何一個成員服務器上運行。系統操做如同每一個成員服務器上都有一個原始表的複本同樣,但其實每一個服務器上只有一個成員表和一個分佈式分區視圖。數據的位置對應用程序是透明的。
  12. 重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收縮數據和日誌 DBCC SHRINKDB,DBCC SHRINKFILE. 設置自動收縮日誌.對於大的數據庫不要設置數據庫自動增加,它會下降服務器的性能。在T-sql的寫法上有很大的講究,下面列出常見的要點:首先,DBMS處理查詢計劃的過程是這樣的:查詢語句的詞法、語法檢查。將語句提交給DBMS的查詢優化器。優化器作代數優化和存取路徑的優化SQL Server數據庫。由預編譯模塊生成查詢規劃。而後在合適的時間提交給系統處理執行。最後將執行結果返回給用戶其次,看一下SQL SERVER的數據存放的結構:一個頁面的大小爲8K(8060)字節,8個頁面爲一個盤區,按照B樹存放。
  13. Commit和rollback的區別 Rollback:回滾全部的事物。 Commit:提交當前的事物. 沒有必要在動態SQL裏寫事物,若是要寫請寫在外面如: begin tran exec(@s) commit trans 或者將動態SQL 寫成函數或者存儲過程。[SPAN]
  14. 在查詢Select語句中用Where字句限制返回的行數,避免表掃描,若是返回沒必要要的數據,浪費了服務器的I/O資源,加劇了網絡的負擔下降性能。若是表很大,在表掃描的期間將表鎖住,禁止其餘的聯接訪問表,後果嚴重。
相關文章
相關標籤/搜索