一次SQL調(diào)優(yōu)數(shù)據(jù)庫性能問題后的過程(300W)
更新時(shí)間:2010年03月30日 14:26:55 作者:
對(duì)單表超過300w+數(shù)據(jù)的Web應(yīng)用程序進(jìn)行測(cè)試后發(fā)現(xiàn)了一些功能、性能問題,采取了以下辦法來進(jìn)行調(diào)整
將絕大部分的SQL查詢改為存儲(chǔ)過程,這樣的操作毫無疑問可以提高部分性能。
凡是使用“select * from xxx”的操作一律具體到所需字段。
使用join連接2個(gè)以上大量數(shù)據(jù)的表,且基礎(chǔ)數(shù)據(jù)表變化不大的查詢一律使用視圖,并為此視圖建立索引。理由來自SQL Server聯(lián)機(jī)幫助手冊(cè): “對(duì)于標(biāo)準(zhǔn)視圖而言,為每個(gè)引用視圖的查詢動(dòng)態(tài)生成結(jié)果集的開銷很大,特別是對(duì)于那些涉及對(duì)大量行進(jìn)行復(fù)雜處理(如聚合大量數(shù)據(jù)或聯(lián)接許多行)的視圖。如果在查詢中頻繁地引用這類視圖,可通過對(duì)視圖創(chuàng)建唯一聚集索引來提高性能。對(duì)視圖創(chuàng)建唯一聚集索引后,結(jié)果集將存儲(chǔ)在數(shù)據(jù)庫中,就像帶有聚集索引的表一樣。
對(duì)視圖創(chuàng)建索引的另一個(gè)好處是:優(yōu)化器可以在未直接在 FROM 子句中指定某一視圖的查詢中使用該視圖的索引。這樣一來,可從索引視圖檢索數(shù)據(jù)而無需重新編碼,由此帶來的高效率也使現(xiàn)有查詢獲益?!?
凡是使用 "select count(*) from xxx" 或是"select count(id) from xxx”(此處id為主鍵)的查詢,一律改為”select count(1) from xxx”,理論上采用*來做聚合值,SQL Server會(huì)自動(dòng)尋覓最合適的字段以進(jìn)行聚合,但這樣仍然會(huì)占用系統(tǒng)開銷,即使主鍵也沒有1來得快。
對(duì)于多條件的組合查詢,我們一般會(huì)寫成”where ((@condition is null) or (condition=@condition))”形式的存儲(chǔ)過程條件來進(jìn)行查詢,但這樣的操作會(huì)因?yàn)椤眎s null ”導(dǎo)致性能問題,反復(fù)實(shí)地檢測(cè)后采用了”where 1 = 1 ”,然后根據(jù)條件“IF @condition IS NOT NULL SET @sqlText=@sqlText+' AND Condition=''' + @Condition +'''',最后 “exec sp_executesql @sqlText” 的方式,這樣確實(shí)可帶來明顯的性能提升,分析應(yīng)是”is null ”或”is not null”導(dǎo)致了索引失效,進(jìn)行了全表掃描。
對(duì)使用row_number()函數(shù)的表建立合適的索引,必須要有最合適的索引才能避免重建索引時(shí)的全表row_number()運(yùn)算帶來的性能問題,而且索引的方向也很重要,比如時(shí)間類的索引用降序往往比升序性能高。
這個(gè)不是性能問題,但也很重要,在存儲(chǔ)過程中應(yīng)使用scope_identity()函數(shù)來獲得最新的標(biāo)量,而不是@@Identity這個(gè)全局變量,因?yàn)锧@Identity會(huì)受到觸發(fā)器的影響而失去正確值。
凡是使用“select * from xxx”的操作一律具體到所需字段。
使用join連接2個(gè)以上大量數(shù)據(jù)的表,且基礎(chǔ)數(shù)據(jù)表變化不大的查詢一律使用視圖,并為此視圖建立索引。理由來自SQL Server聯(lián)機(jī)幫助手冊(cè): “對(duì)于標(biāo)準(zhǔn)視圖而言,為每個(gè)引用視圖的查詢動(dòng)態(tài)生成結(jié)果集的開銷很大,特別是對(duì)于那些涉及對(duì)大量行進(jìn)行復(fù)雜處理(如聚合大量數(shù)據(jù)或聯(lián)接許多行)的視圖。如果在查詢中頻繁地引用這類視圖,可通過對(duì)視圖創(chuàng)建唯一聚集索引來提高性能。對(duì)視圖創(chuàng)建唯一聚集索引后,結(jié)果集將存儲(chǔ)在數(shù)據(jù)庫中,就像帶有聚集索引的表一樣。
對(duì)視圖創(chuàng)建索引的另一個(gè)好處是:優(yōu)化器可以在未直接在 FROM 子句中指定某一視圖的查詢中使用該視圖的索引。這樣一來,可從索引視圖檢索數(shù)據(jù)而無需重新編碼,由此帶來的高效率也使現(xiàn)有查詢獲益?!?
凡是使用 "select count(*) from xxx" 或是"select count(id) from xxx”(此處id為主鍵)的查詢,一律改為”select count(1) from xxx”,理論上采用*來做聚合值,SQL Server會(huì)自動(dòng)尋覓最合適的字段以進(jìn)行聚合,但這樣仍然會(huì)占用系統(tǒng)開銷,即使主鍵也沒有1來得快。
對(duì)于多條件的組合查詢,我們一般會(huì)寫成”where ((@condition is null) or (condition=@condition))”形式的存儲(chǔ)過程條件來進(jìn)行查詢,但這樣的操作會(huì)因?yàn)椤眎s null ”導(dǎo)致性能問題,反復(fù)實(shí)地檢測(cè)后采用了”where 1 = 1 ”,然后根據(jù)條件“IF @condition IS NOT NULL SET @sqlText=@sqlText+' AND Condition=''' + @Condition +'''',最后 “exec sp_executesql @sqlText” 的方式,這樣確實(shí)可帶來明顯的性能提升,分析應(yīng)是”is null ”或”is not null”導(dǎo)致了索引失效,進(jìn)行了全表掃描。
對(duì)使用row_number()函數(shù)的表建立合適的索引,必須要有最合適的索引才能避免重建索引時(shí)的全表row_number()運(yùn)算帶來的性能問題,而且索引的方向也很重要,比如時(shí)間類的索引用降序往往比升序性能高。
這個(gè)不是性能問題,但也很重要,在存儲(chǔ)過程中應(yīng)使用scope_identity()函數(shù)來獲得最新的標(biāo)量,而不是@@Identity這個(gè)全局變量,因?yàn)锧@Identity會(huì)受到觸發(fā)器的影響而失去正確值。
您可能感興趣的文章:
- mysql 性能的檢查和調(diào)優(yōu)方法
- Sql server2005 優(yōu)化查詢速度50個(gè)方法小結(jié)
- SqlServer 執(zhí)行計(jì)劃及Sql查詢優(yōu)化初探
- MySQL慢查詢查找和調(diào)優(yōu)測(cè)試
- sqlserver性能調(diào)優(yōu)經(jīng)驗(yàn)總結(jié)
- Mysql優(yōu)化調(diào)優(yōu)中兩個(gè)重要參數(shù)table_cache和key_buffer
- 10個(gè)MySQL性能調(diào)優(yōu)的方法
- 如何調(diào)優(yōu)SQL Server查詢
相關(guān)文章
SQL?Server數(shù)據(jù)庫備份和恢復(fù)數(shù)據(jù)庫的全過程
最近在功能調(diào)試前需要先將測(cè)試數(shù)據(jù)庫備份,然后功能調(diào)試之后再將測(cè)試數(shù)據(jù)庫還原,這樣就可以重復(fù)的進(jìn)行功能調(diào)試,這篇文章主要給大家介紹了關(guān)于SQL?Server數(shù)據(jù)庫備份和恢復(fù)數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2022-06-06
詳解SQL Server如何修改數(shù)據(jù)庫物理文件的存在位置
這篇文章主要給大家介紹了關(guān)于SQL Server如何修改數(shù)據(jù)庫物理文件存在位置的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來看看吧。2017-06-06
如何將sql執(zhí)行的錯(cuò)誤消息記錄到本地文件中實(shí)現(xiàn)過程
sql語句的錯(cuò)誤信息都可以在sys.messages表里面找到,下面與大家分享下將sql 執(zhí)行的錯(cuò)誤消息記錄到本地文件中,不會(huì)的朋友可以參考下哈2013-05-05
SQL Server日期時(shí)間格式轉(zhuǎn)化的方式小結(jié)
在SQL Server中,日期格式轉(zhuǎn)換可以使用CONVERT函數(shù)和CAST函數(shù),本文呢給大家介紹了SQL Server日期時(shí)間格式轉(zhuǎn)化的方式,并通過代碼示例講解非常詳細(xì),需要的朋友可以參考下2024-03-03
SQL Server實(shí)現(xiàn)用觸發(fā)器捕獲DML操作的會(huì)話信息【實(shí)例】
下面小編就為大家?guī)硪黄猄QL Server實(shí)現(xiàn)用觸發(fā)器捕獲DML操作的會(huì)話信息【實(shí)例】。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03

