下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、SQL Server查詢速度慢的原因及優(yōu)化方 法時間:2008-05-30 12:01:30來源:作者:點擊量:酸酸繁醴中文 SQL Server查詢速度慢的原因有很,常見的有以下幾種:1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設(shè)計的缺陷)2、I/O吞吐量小,形成了瓶頸效應(yīng)。3、沒有創(chuàng)建計算列導(dǎo)致查詢不優(yōu)化。4、內(nèi)存不足5、網(wǎng)絡(luò)速度慢6、查詢出的數(shù)據(jù)量過大(可以采用多次查詢,其他的方法降低數(shù)據(jù)量)7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設(shè)計的缺陷)8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。9、返回了不必要的行和列10、查詢語句不好,沒有優(yōu)化
2、8以通過以下方法來優(yōu)化查詢:1、把數(shù)據(jù)、日志、索引放到不同的I/O設(shè)備上,增加讀取速度,以前可以將 Tempdb應(yīng)放在RAID0上,SQL2000不在支持。數(shù)據(jù)量(尺寸)越大,提高 I/O越重要.2、縱向、橫向分割表,減少表的尺寸(sp_spaceuse)3、升級硬件4、根據(jù)查詢條件,建立索引,優(yōu)化索引、優(yōu)化訪問方式,限制結(jié)果集的數(shù)據(jù)量。注意填充因子要適當(dāng)(最好是使用默認(rèn)值0)。索引應(yīng)該盡量小,使用字節(jié)數(shù)小 的列建索引好(參照索引的創(chuàng)建),不要對有限的幾個值的字段建單一索引如性 別字段5、提高網(wǎng)速;6、擴(kuò)大服務(wù)器的內(nèi)存,Windows 2000和SQL server 2000能支持4-8G的
3、內(nèi)存。配 置虛擬內(nèi)存:虛擬內(nèi)存大小應(yīng)基于計算機(jī)上并發(fā)運(yùn)行的服務(wù)進(jìn)行配置。運(yùn)行 Microsoft SQL Server? 2000時,可考慮將虛擬內(nèi)存大小設(shè)置為計算機(jī)中安 裝的物理內(nèi)存的1.5倍。如果另外安裝了全文檢索功能,并打算運(yùn)行Microsoft搜索服務(wù)以便執(zhí)行全文索引和查詢,可考慮:將虛擬內(nèi)存大小配置為 至少是計算機(jī)中安裝的物理內(nèi)存的3倍。將SQL Server max server memory服務(wù)器配置選項配置為物理內(nèi)存的1.5倍(虛擬內(nèi)存大小設(shè)置的一 半)。7、增加服務(wù)器CPU個數(shù);但是必須明白并行處理串行處理更需要資源例如內(nèi) 存。使用并行還是串行程是MsSQL自動評估選擇的。單
4、個任務(wù)分解成多個任務(wù), 就可以在處理器上運(yùn)行。例如耽擱查詢的排序、連接、掃描和GROUP BY字 句同時執(zhí)行,SQL SERVER根據(jù)系統(tǒng)的負(fù)載情況決定最優(yōu)的并行等級,復(fù)雜的 需要消耗大量的CPU的查詢最適合并行處理。但是更新操作UPDATE,INSERT, DELETE還不能并行處理。8、如果是使用like進(jìn)行查詢的話,簡單的使用index是不行的,但是全文索引, 耗空間。like a%使用索引like %a不使用索引用like %a%查詢 時,查詢耗時和字段值總長度成正比,所以不能用CHAR類型,而是VARCHAR。 對于字段的值很長的建全文索引。9、DB Server 和 APPLica
5、tion Server 分離;OLTP 和 OLAP 分離10、分布式分區(qū)視圖可用于實現(xiàn)數(shù)據(jù)庫服務(wù)器聯(lián)合體。聯(lián)合體是一組分開管理的服務(wù)器,但它們相互協(xié)作分擔(dān)系統(tǒng)的處理負(fù)荷。這種通 過分區(qū)數(shù)據(jù)形成數(shù)據(jù)庫服務(wù)器聯(lián)合體的機(jī)制能夠擴(kuò)大一組服務(wù)器,以支持大型的 多層Web站點的處理需要。有關(guān)更多信息,參見設(shè)計聯(lián)合數(shù)據(jù)庫服務(wù)器。(參 照SQL幫助文件分區(qū)視圖)a、在實現(xiàn)分區(qū)視圖之前,必須先水平分區(qū)表b、在創(chuàng)建成員表后,在每個成員服務(wù)器上定義一個分布式分區(qū)視圖,并且每 個視圖具有相同的名稱。這樣,引用分布式分區(qū)視圖名的查詢可以在任何一個成 員服務(wù)器上運(yùn)行。系統(tǒng)操作如同每個成員服務(wù)器上都有一個原始表的復(fù)本一樣
6、, 但其實每個服務(wù)器上只有一個成員表和一個分布式分區(qū)視圖。數(shù)據(jù)的位置對應(yīng)用 程序是透明的。11、重建索引DBCC REINDEX ,DBCC INDEXDEFRAG,收縮數(shù)據(jù)和日志 DBCC SHRINKDB,DBCC SHRINKFILE,設(shè)置自動收縮日志.對于大的數(shù)據(jù)庫 不要設(shè)置數(shù)據(jù)庫自動增長,它會降低服務(wù)器的性能。在T-sql的寫法上有很大的講究,下面列出常見的要點:首先,DBMS處理查 詢計劃的過程是這樣的:1、查詢語句的詞法、語法檢查2、將語句提交給DBMS的查詢優(yōu)化器3、優(yōu)化器做代數(shù)優(yōu)化和存取路徑的優(yōu)化4、由預(yù)編譯模塊生成查詢規(guī)劃5、然后在合適的時間提交給系統(tǒng)處理執(zhí)行6、最后將執(zhí)行
7、結(jié)果返回給用戶。其次,看一下SQL SERVER的數(shù)據(jù)存放的結(jié)構(gòu):一個頁面的大小為8K(8060) 字節(jié),8個頁面為一個盤區(qū),按照B樹存放。12、Commit和rollback的區(qū)別Rollback:回滾所有的事物。Commit:提 交當(dāng)前的事物.沒有必要在動態(tài)SQL里寫事物,如果要寫請寫在外面如:begin tran exec(s) commit trans或者將動態(tài)SQL寫成函數(shù)或者存儲過程。13、在查詢Select語句中用Where字句限制返回的行數(shù),避免表掃描,如果返 回不必要的數(shù)據(jù),浪費(fèi)了服務(wù)器的I/O資源,加重了網(wǎng)絡(luò)的負(fù)擔(dān)降低性能。如 果表很大,在表掃描的期間將表鎖住,禁止其他的聯(lián)
8、接訪問表,后果嚴(yán)重。14、SQL的注釋申明對執(zhí)行沒有任何影響15、盡可能不使用光標(biāo),它占用大量的資源。如果需要row-by-row地執(zhí)行, 盡量采用非光標(biāo)技術(shù),如:在客戶端循環(huán),用臨時表,Table變量,用子查詢, 用Case語句等等。游標(biāo)可以按照它所支持的提取選項進(jìn)行分類:只進(jìn)必須按 照從第一行到最后一行的順序提取行。FETCH NEXT是唯一允許的提取操作, 也是默認(rèn)方式??蓾L動性可以在游標(biāo)中任何地方隨機(jī)提取任意行。游標(biāo)的技術(shù) 在SQL2000下變得功能很強(qiáng)大,他的目的是支持循環(huán)。有四個并發(fā)選項 READ_ONLY :不允許通過游標(biāo)定位更新(Update),且在組成結(jié)果集的行中沒 有鎖。O
9、PTIMISTIC WITH valueS:樂觀并發(fā)控制是事務(wù)控制理論的一個標(biāo)準(zhǔn) 部分。樂觀并發(fā)控制用于這樣的情形,即在打開游標(biāo)及更新行的間隔中,只有很 小的機(jī)會讓第二個用戶更新某一行。當(dāng)某個游標(biāo)以此選項打開時,沒有鎖控制 其中的行,這將有助于最大化其處理能力。如果用戶試圖修改某一行,則此行的 當(dāng)前值會與最后一次提取此行時獲取的值進(jìn)行比較。如果任何值發(fā)生改變,則 服務(wù)器就會知道其他人已更新了此行,并會返回一個錯誤。如果值是一樣的,服 務(wù)器就執(zhí)行修改。選擇這個并發(fā)選項OPTIMISTIC WITH ROWVERSIONING:此樂觀并發(fā)控制選項基于行版本控制。使用行版本控制,其中的 表必須具有某
10、種版本標(biāo)識符,服務(wù)器可用它來確定該行在讀入游標(biāo)后是否有所 更改。在SQL Server中,這個性能由timestamp數(shù)據(jù)類型提供,它是一個 二進(jìn)制數(shù)字,表示數(shù)據(jù)庫中更改的相對順序。每個數(shù)據(jù)庫都有一個全局當(dāng)前時間 戳值:DBTS。每次以任何方式更改帶有timestamp列的行時,SQL Server先在時間戳列中存儲當(dāng)前的DBTS值,然后增加DBTS的 值。如果某個表具有timestamp列,則時間戳?xí)挥浀叫屑墶7?wù)器就可以 比較某行的當(dāng)前時間戳值和上次提取時所存儲的時間戳值,從而確定該行是否已 更新。服務(wù)器不必比較所有列的值,只需比較timestamp列即可。如果應(yīng)用 程序?qū)]有times
11、tamp列的表要求基于行版本控制的樂觀并發(fā),則游標(biāo)默認(rèn) 為基于數(shù)值的樂觀并發(fā)控制。SCROLL LOCKS這個選項實現(xiàn)悲觀并發(fā)控制。 在悲觀并發(fā)控制中,在把數(shù)據(jù)庫的行讀入游標(biāo)結(jié)果集時,應(yīng)用程序?qū)⒃噲D鎖定數(shù) 據(jù)庫行。在使用服務(wù)器游標(biāo)時,將行讀入游標(biāo)時會在其上放置一個更新鎖。如 果在事務(wù)內(nèi)打開游標(biāo),則該事務(wù)更新鎖將一直保持到事務(wù)被提交或回滾;當(dāng)提取 下一行時,將除去游標(biāo)鎖。如果在事務(wù)外打開游標(biāo),則提取下一行時,鎖就被 丟棄。因此,每當(dāng)用戶需要完全的悲觀并發(fā)控制時,游標(biāo)都應(yīng)在事務(wù)內(nèi)打開。更 新鎖將阻止任何其它任務(wù)獲取更新鎖或排它鎖,從而阻止其它任務(wù)更新該行。 然而,更新鎖并不阻止共享鎖,所以它不會阻
12、止其它任務(wù)讀取行,除非第二個任 務(wù)也在要求帶更新鎖的讀取。滾動鎖根據(jù)在游標(biāo)定義的SELECT語句中指定的 鎖提示,這些游標(biāo)并發(fā)選項可以生成滾動鎖。滾動鎖在提取時在每行上獲取,并 保持到下次提取或者游標(biāo)關(guān)閉,以先發(fā)生者為準(zhǔn)。下次提取時,服務(wù)器為新提 取中的行獲取滾動鎖,并釋放上次提取中行的滾動鎖。滾動鎖獨(dú)立于事務(wù)鎖,并 可以保持到一個提交或回滾操作之后。如果提交時關(guān)閉游標(biāo)的選項為關(guān),則 COMMIT語句并不關(guān)閉任何打開的游標(biāo),而且滾動鎖被保留到提交之后,以維 護(hù)對所提取數(shù)據(jù)的隔離。所獲取滾動鎖的類型取決于游標(biāo)并發(fā)選項和游標(biāo) SELECT語句中的鎖提示。鎖提示只讀樂觀數(shù)值樂觀行版本控制鎖定無提 示
13、未鎖定未鎖定未鎖定更新NOLOCK未鎖定未鎖定未鎖定未鎖定 HOLDLOCK共享共享共享更新UPDLOCK錯誤更新更新更新 TABLOCKX錯誤未鎖定未鎖定更新其它未鎖定未鎖定未鎖定更新*指 定NOLOCK提示將使指定了該提示的表在游標(biāo)內(nèi)是只讀的。16、用Profiler來跟蹤查詢,得到查詢所需的時間,找出SQL的問題所在;用 索引優(yōu)化器優(yōu)化索引17、注意 UNion 和 UNion all 的區(qū)別。UNION all 好18、注意使用DISTINCT,在沒有必要時不要用,它同UNION 一樣會使查詢 變慢。重復(fù)的記錄在查詢里是沒有問題的19、查詢時不要返回不需要的行、列20、用 sp_con
14、figure query governor cost limit或者 SETQUERY_GOVERNOR_COST_LIMIT來限制查詢消耗的資源。當(dāng)評估查詢消耗 的資源超出限制時,服務(wù)器自動取消查詢,在查詢之前就扼殺掉。SETLOCKTIME設(shè)置鎖的時間21、用select top 100 / 10 Percent來限制用戶返回的行數(shù)或者SET ROWCOUNT來限制操作的行22、在SQL2000以前,一般不要用如下的字句:IS NULL, , !=, !, !, NOT, NOT EXISTS, NOT IN, NOT LIKE, and LIKE %500,因為他們不走索引全是表掃描。也
15、不要在WHere字句中的列名加 函數(shù),如Convert,substring等,如果必須用函數(shù)的時候,創(chuàng)建計算列再創(chuàng)建 索引來替代.還可以變通寫法:WHERE SUBSTRING(firstname,1,1) = m 改為WHERE firstname like m%(索引掃描),一定要將函數(shù)和列名分開。 并且索引不能建得太多和太大。NOT IN會多次掃描表,使用EXISTS、NOT EXISTS,IN , LEFT OUTER JOIN來替代,特別是左連接,而Exists比IN 更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,現(xiàn)在2000的優(yōu)化器能夠處理了。相同的是IS NU
16、LL, “NOT, NOT EXISTS, NOT IN能優(yōu)化她,而等還是不能優(yōu)化,用不到索引。23、使用Query Analyzer,查看SQL語句的查詢計劃和評估分析是否是優(yōu)化 的SQL。一般的20%的代碼占據(jù)了 80%的資源,我們優(yōu)化的重點是這些慢的 地方。24、如果使用了 IN或者OR等時發(fā)現(xiàn)查詢沒有走索引,使用顯示申明指定索引: SELECT * FROM PersonMember (INDEX = IX_Title) WHERE processid IN (男,女)25、將需要查詢的結(jié)果預(yù)先計算好放在表中,查詢的時候再SELECT。這在 SQL7.0以前是最重要的手段。例如醫(yī)院的住院費(fèi)計算。26、MIN()和MAX()能使用到合適的索引。27、數(shù)據(jù)庫有一個原則是代碼離數(shù)據(jù)越近越好,所以優(yōu)先選擇Default,依次為 Rules,Triggers, Constraint (約束如外健主健 CheckUNIQUE ,數(shù)據(jù)類型 的最大長度等等都是約束),Proc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 經(jīng)營公司企業(yè)年度工作計劃
- 小學(xué)六年級期中考試復(fù)習(xí)計劃
- 加油站201年下半年工作計劃
- 防疫及衛(wèi)生協(xié)管工作計劃
- 教師信息技術(shù)校本研修工作計劃范文
- 2025學(xué)年數(shù)學(xué)備課組工作計劃
- 《水處理技術(shù)介紹》課件
- 《大吸收波長的計算》課件
- 《EXO成員總介紹》課件
- 《外盤期貨介紹》課件
- 東方甄選直播用戶畫像及抖音搜索指數(shù)2023
- 上海年某單層廠房造價指標(biāo)
- 制度-xxxxx有限公司反商業(yè)賄賂管理制度
- 零基礎(chǔ)的住宅和城市設(shè)計智慧樹知到答案章節(jié)測試2023年同濟(jì)大學(xué)
- 2022年湖北省武漢市中考英語試卷及答案
- casio-5800p程序集錦(卡西歐5800編程計算機(jī))
- 酒店安全整改報告
- 陳淑惠中文網(wǎng)絡(luò)成癮量表
- 先找財源還是先找人源財源源
- 黑布林英語 Can I play閱讀課件
- 《智能家居系統(tǒng)設(shè)計開題報告(含提綱)》
評論
0/150
提交評論