查詢速度慢的緣由不少,常見以下幾種

一、沒有索引或者沒有用到索引(這是查詢慢最多見的問題,是程序設計的缺陷)  sql

二、I/O吞吐量小,造成了瓶頸效應。  數據庫

三、沒有建立計算列致使查詢不優化。  服務器

四、內存不足  網絡

五、網絡速度慢  併發

六、查詢出的數據量過大(能夠採用屢次查詢,其餘的方法下降數據量)  分佈式

七、鎖或者死鎖(這也是查詢慢最多見的問題,是程序設計的缺陷)  函數

八、sp_lock,sp_who,活動的用戶查看,緣由是讀寫競爭資源。  性能

九、返回了沒必要要的行和列  優化

十、查詢語句很差,沒有優化  spa

能夠經過以下方法來優化查詢 :  

一、把數據、日誌、索引放到不一樣的I/O設備上,增長讀取速度,之前能夠將Tempdb應放在RAID0上,SQL2000不在支持。數據量(尺寸)越大,提升I/O越重要.  

二、縱向、橫向分割表,減小表的尺寸(sp_spaceuse)  

三、升級硬件  

四、根據查詢條件,創建索引,優化索引、優化訪問方式,限制結果集的數據量。注意填充因子要適當(最好是使用默認值0)。索引應該儘可能小,使用字節數小的列建索引好(參照索引的建立),不要對有限的幾個值的字段建單一索引如性別字段  

五、提升網速;  

六、擴大服務器的內存,Windows 2000和SQL server 2000能支持4-8G的內存。配置虛擬內存:虛擬內存大小應基於計算機上併發運行的服務進行配置。運行 Microsoft SQL Server? 2000 時,可考慮將虛擬內存大小設置爲計算機中安裝的物理內存的 1.5 倍。

若是另外安裝了全文檢索功能,並打算運行 Microsoft 搜索服務以便執行全文索引和查詢,可考慮:將虛擬內存大小配置爲至少是計算機中安裝的物理內存的 3 倍。

將 SQL Server max server memory 服務器配置選項配置爲物理內存的 1.5 倍(虛擬內存大小設置的一半)。  

七、增長服務器 CPU個數;可是必須明白並行處理串行處理更須要資源例如內存。使用並行仍是串行程是MsSQL自動評估選擇的。單個任務分解成多個任務,就能夠在處理器上運行。

例如耽擱查詢的排序、鏈接、掃描和GROUP BY字句同時執行,SQL SERVER根據系統的負載狀況決定最優的並行等級,複雜的須要消耗大量的CPU的查詢最適合並行處理。

可是更新操做Update,Insert, Delete還不能並行處理。  

八、若是是使用like進行查詢的話,簡單的使用index是不行的,可是全文索引,耗空間。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查詢時,查詢耗時和字段值總長度成正比,因此不能用CHAR類型,而是VARCHAR。對於字段的值很長的建全文索引。  

九、DB Server 和APPLication Server 分離;OLTP和OLAP分離  

十、分佈式分區視圖可用於實現數據庫服務器聯合體。聯合體是一組分開管理的服務器,但它們相互協做分擔系統的處理負荷。這種經過分區數據造成數據庫服務器聯合體的機制可以擴大一組服務器,以支持大型的多層 Web 站點的處理須要。有關更多信息,參見設計聯合數據庫服務器。(參照SQL幫助文件'分區視圖')  

a、在實現分區視圖以前,必須先水平分區表  

b、在建立成員表後,在每一個成員服務器上定義一個分佈式分區視圖,而且每一個視圖具備相同的名稱。

這樣,引用分佈式分區視圖名的查詢能夠在任何一個成員服務器上運行。系統操做如同每一個成員服務器上都有一個原始表的複本同樣,但其實每一個服務器上只有一個成員表和一個分佈式分區視圖。數據的位置對應用程序是透明的。  

十一、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收縮數據和日誌 DBCC SHRINKDB,DBCC SHRINKFILE. 設置自動收縮日誌.對於大的數據庫不要設置數據庫自動增加,它會下降服務器的性能。

在T-sql的寫法上有很大的講究,下面列出常見的要點:

首先,DBMS處理查詢計劃的過程是這樣的:  

一、 查詢語句的詞法、語法檢查  

二、 將語句提交給DBMS的查詢優化器  

三、 優化器作代數優化和存取路徑的優化  

四、 由預編譯模塊生成查詢規劃  

五、 而後在合適的時間提交給系統處理執行  

六、 最後將執行結果返回給用戶其次,看一下SQL SERVER的數據存放的結構:一個頁面的大小爲8K(8060)字節,8個頁面爲一個盤區,按照B樹存放。

十二、Commit和rollback的區別 Rollback:回滾全部的事物。 Commit:提交當前的事物. 沒有必要在動態SQL裏寫事物,若是要寫請寫在外面如: begin tran exec(@s) commit trans 或者將動態SQL 寫成函數或者存儲過程。  

1三、在查詢Select語句中用Where字句限制返回的行數,避免表掃描,若是返回沒必要要的數據,浪費了服務器的I/O資源,加劇了網絡的負擔下降性能。若是表很大,在表掃描的期間將表鎖住,禁止其餘的聯接訪問表,後果嚴重。  

1四、SQL的註釋申明對執行沒有任何影響

1五、儘量不使用光標,它佔用大量的資源。若是須要row-by-row地執行,儘可能採用非光標技術,如:在客戶端循環,用臨時表,Table變量,用子查詢,用Case語句等等。遊標能夠按照它所支持的提取選項進行分類: 只進 必須按照從第一行到最後一行的順序提取行。

FETCH NEXT 是惟一容許的提取操做,也是默認方式。

可滾動性能夠在遊標中任何地方隨機提取任意行。

遊標的技術在SQL2000下變得功能很強大,他的目的是支持循環。

有四個併發選項 READ_ONLY:不容許經過遊標定位更新(Update),且在組成結果集的行中沒有鎖。

OPTIMISTIC WITH valueS:樂觀併發控制是事務控制理論的一個標準部分。

樂觀併發控制用於這樣的情形,即在打開遊標及更新行的間隔中,只有很小的機會讓第二個用戶更新某一行。

當某個遊標以此選項打開時,沒有鎖控制其中的行,這將有助於最大化其處理能力。

若是用戶試圖修改某一行,則此行的當前值會與最後一次提取此行時獲取的值進行比較。

若是任何值發生改變,則服務器就會知道其餘人已更新了此行,並會返回一個錯誤。

若是值是同樣的,服務器就執行修改。

選擇這個併發選項

相關文章
相關標籤/搜索