日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

K3数据库优化方案

發(fā)布時(shí)間:2023/12/20 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 K3数据库优化方案 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

K/3 系統(tǒng)性能優(yōu)化解決方案?作者:詩(shī)歡

--重建索引速度較慢,請(qǐng)?jiān)谙到y(tǒng)空閑時(shí)間進(jìn)行

DBCC DBREINDEX(t_icitem)

DBCC DBREINDEX(t_item)

DBCC DBREINDEX(t_itemclass)

DBCC DBREINDEX(t_itemright)

DBCC DBREINDEX(t_user)

DBCC DBREINDEX(t_group)

go

if not exists(select 1 from sysindexes where name='ix_group_fgroupid')

create index ix_group_fgroupid on t_group(fgroupid)

go

if not exists(select 1 from sysindexes where name='ix_itemright_ftypeid')

create index ix_itemright_ftypeid on t_itemright(ftypeid)

go

1 SQL Server調(diào)整

當(dāng)用戶使用K3系統(tǒng)一段時(shí)間以后,發(fā)現(xiàn)系統(tǒng)的響應(yīng)時(shí)間越來(lái)越長(zhǎng)。這種情形往往是由于賬套數(shù)據(jù)庫(kù)缺乏維護(hù)引起的。缺乏維護(hù)的數(shù)據(jù)庫(kù)會(huì)存在過(guò)多地碎片、過(guò)期的統(tǒng)計(jì)、隱含著可能的錯(cuò)誤查詢結(jié)果的數(shù)據(jù)庫(kù)的邏輯和物理的不一致性,這些都會(huì)直接影響系統(tǒng)的性能。這里介紹解決上述賬套數(shù)據(jù)庫(kù)性能問(wèn)題常用的方法。

1.1 使用DBCC語(yǔ)句發(fā)現(xiàn)和解決上述問(wèn)題。

DBCC:?數(shù)據(jù)庫(kù)一致性檢查器。

打開(kāi)SQL?查詢分析器?,執(zhí)行如下語(yǔ)句。

?

u?DBCC SHOWCONTIG?顯示指定表的數(shù)據(jù)和索引的有關(guān)數(shù)據(jù)碎片的信息DBCC SHOWCONTIG(表名[,索引名])

在有大的改動(dòng)的表,引入數(shù)據(jù)的表,或者引起低效查詢的表上使用該語(yǔ)句。

例:DBCC SHOWCONTIG(’T_ITEM’)

u?DBCC DBREINDEX?重建指定數(shù)據(jù)庫(kù)中表的一個(gè)或多個(gè)索引。

例1:重建某個(gè)索引

???????????????????????????????DBCC?DBREINDEX?('T_ITEM',?uk_item2,?80)

例2:重建所有索引

DBCC DBREINDEX ('T_ITEM',’’,80)

?

u?DBCC SHOW_STATISTICS?顯示指定表上的指定目標(biāo)(例如一個(gè)索引名稱))的當(dāng)前分布統(tǒng)計(jì)信息。這些統(tǒng)計(jì)信息是被SQL Server查詢優(yōu)化器使用的DBCC SHOW_STATISTICS(表名,目標(biāo))

例:DBCC SHOW_STATISTICs('t_item','pk_item')

u?sp_updatestats & UPDATE STATISTICS?更新統(tǒng)計(jì)信息;?sp_updatestats?對(duì)當(dāng)前數(shù)據(jù)庫(kù)中所有?用戶定義的表運(yùn)行 UPDATE STATISTICS.

使用UPDATE STATISTICS?語(yǔ)句的時(shí)機(jī):在一個(gè)空表上創(chuàng)建一個(gè)索引,然后在以后應(yīng)用它。執(zhí)行TRUNCATE TABLE語(yǔ)句,然后在以后重新應(yīng)用該表。通過(guò)使用FULLSCAN或SAMPLE選項(xiàng)請(qǐng)求明細(xì)的索引統(tǒng)計(jì)信息。

例1. UPDATE STATISTICS T_ITEM

例2. UPDATE STATISTICS T_ITEM(PK_ITEM)

?3.?USE?AIS20011203150410

EXEC sp_updatestats

?

u?DBCC CHECKTABLE?檢查指定表或索引視圖的數(shù)據(jù)、索引及?text?、ntext?和?p_w_picpath?頁(yè)的完整性。如果你相信一個(gè)指定的表可能被破壞了,這條命令非常有用。

u?DBCC CHECKDB?檢查指定數(shù)據(jù)庫(kù)中的所有對(duì)象的分配和結(jié)構(gòu)完整性。這條命令發(fā)現(xiàn)并修復(fù)數(shù)據(jù)庫(kù)地址分配和表內(nèi)部的全部錯(cuò)誤。實(shí)際上,CHECKDB驗(yàn)證數(shù)據(jù)庫(kù)內(nèi)部一切事物的完整性,但是,DBCC CHECKDB是一個(gè)耗費(fèi)CPU和磁盤資源的操作,每個(gè)需要檢查的數(shù)據(jù)都必須首先從磁盤中讀出到內(nèi)存中。而且,DBCC CHECKDB 使用tempdb進(jìn)行排序 。要獲得較高的DBCC性能,推薦在下面的情況下運(yùn)行DBCC:

?

l 在系統(tǒng)使用率較低的情況下運(yùn)行CHECKDB;

l 確信當(dāng)前沒(méi)有執(zhí)行其他磁盤I/O操作,如磁盤備份操作;

l 將tempdb放在另一個(gè)磁盤系統(tǒng)上,或者放在一個(gè)快速磁盤子系統(tǒng)上;

l 為tempdb提供足夠的空間,運(yùn)行DBCC帶上參數(shù)ESTIMATE ONLY(顯示執(zhí)行?DBCC CHECKDB?操作所需tempdb?空間的數(shù)量?),估計(jì)tempdb需要多少磁盤空間;

l 避免運(yùn)行消耗大量CPU時(shí)間的查詢和批處理;

l 在DBCC命令運(yùn)行時(shí),減少事物活動(dòng);

l 使用NO_INFOMSGS選項(xiàng)(壓縮使用空間使用的信息和報(bào)告?)減少處理和tempdb使用率。

例:DBCC CHECKDB ('AIS20011203150410') WITH NO_INFOMSGS,ESTIMATEONLY

u?DBCC SQLPERF?提供有關(guān)所有數(shù)據(jù)庫(kù)中的事務(wù)日志空間使用情況的統(tǒng)計(jì)信息。日志文件的閑余空間的減少,會(huì)降低系統(tǒng)的性能。系統(tǒng)會(huì)在備份時(shí)日志截?cái)嗳罩疚募?#xff0c;所以要求用戶要制定一份良好的備份方案。

例:DBCC SQLPERF ( LOGSPACE )

1.2 使用數(shù)據(jù)庫(kù)維護(hù)計(jì)劃

使用數(shù)據(jù)庫(kù)維護(hù)計(jì)劃器是一種標(biāo)準(zhǔn)且方便的可對(duì)多個(gè)賬套數(shù)據(jù)庫(kù)同時(shí)設(shè)置維護(hù)任務(wù)維護(hù)模式。下面介紹其建立方法:

本方案所介紹的數(shù)據(jù)庫(kù)維護(hù)計(jì)劃側(cè)重于數(shù)據(jù)庫(kù)的優(yōu)化,即性能的提高。

1) 打開(kāi)Enterprise Manager,展開(kāi)服務(wù)器,展開(kāi)管理,然后單擊數(shù)據(jù)庫(kù)維護(hù)計(jì)劃。從操作(Action)中選擇新建維護(hù)計(jì)劃?,可以看到圖4.1所示的歡迎屏幕,單擊下一步按鈕。

2) 選擇數(shù)據(jù)庫(kù),選擇K3賬套所在的數(shù)據(jù)庫(kù)(可選一個(gè)或多個(gè))。單擊下一步按鈕。

圖2 選擇數(shù)據(jù)庫(kù)

3) 更新數(shù)據(jù)庫(kù)優(yōu)化信息。選擇重新組織數(shù)據(jù)和索引頁(yè),選擇使用原有可用空間重新組織頁(yè)面。選擇當(dāng)增長(zhǎng)超過(guò)50MB時(shí),從數(shù)據(jù)庫(kù)文件中刪除未使用空間,收縮后保留的可用空間為10%的數(shù)據(jù)空間。單擊下一步按鈕。

圖3更新數(shù)據(jù)庫(kù)優(yōu)化信息

4) 檢查數(shù)據(jù)庫(kù)完整性。選擇檢查數(shù)據(jù)庫(kù)完整性,包含索引以及嘗試修復(fù)所有小問(wèn)題。單擊下一步。

圖4 檢查數(shù)據(jù)庫(kù)完整性

5) 指定數(shù)據(jù)庫(kù)備份計(jì)劃,備份在優(yōu)化方案中暫不考慮,跳過(guò),單擊下一步。

圖5數(shù)據(jù)庫(kù)備份計(jì)劃

6) 指定事務(wù)日志備份計(jì)劃在優(yōu)化方案中暫不考慮,跳過(guò),單擊下一步。

圖6指定事物備份計(jì)劃

7) 生成報(bào)表。選擇將報(bào)表寫入目錄中的文本文件,選擇刪除早于4周的報(bào)表文件?;蛘哌x擇將電子郵件報(bào)表發(fā)送到操作員,然后花時(shí)間閱讀這個(gè)報(bào)表,看看數(shù)據(jù)庫(kù)中是否有任何需要注意的問(wèn)題。單擊下一步。

圖7生成報(bào)表

8) 維護(hù)計(jì)劃歷史記錄。

SQL Server每次運(yùn)行時(shí)保持維護(hù)計(jì)劃的歷史。可以瀏覽這個(gè)歷史,看看操作中何時(shí)遇到故障,然后確定故障原因。如果只有單臺(tái)機(jī)器,則要在本地服務(wù)器存放歷史紀(jì)錄,但如果網(wǎng)絡(luò)中又多臺(tái)機(jī)器,則要將歷史紀(jì)錄存放在中央服務(wù)器中,以便從各臺(tái)機(jī)器上方便的訪問(wèn)。下面選擇缺省在本地存放1000行歷史紀(jì)錄。單擊下一步。

圖 8 維護(hù)歷史紀(jì)錄

9) 完成數(shù)據(jù)庫(kù)維護(hù)計(jì)劃向?qū)?。用于命名和檢查具體工作,在計(jì)劃名中輸入:K3賬套數(shù)據(jù)庫(kù)維護(hù)計(jì)劃。單擊完成按鈕生成計(jì)劃。

圖9 完成數(shù)據(jù)庫(kù)維護(hù)計(jì)劃向?qū)?/p>

1.3 發(fā)現(xiàn)死鎖和消除死鎖

死鎖形成的原因是不同的,有的死鎖系統(tǒng)可以自動(dòng)地偵測(cè)和消除而另外一些則需要管理員調(diào)整請(qǐng)求

死鎖發(fā)生在兩個(gè)或多個(gè)進(jìn)程同時(shí)等待被其中一個(gè)進(jìn)程保留著的鎖。該進(jìn)程將不會(huì)釋放它保留的鎖直到它獲得被其它進(jìn)程保留的資源,反過(guò)來(lái)也一樣。當(dāng)一個(gè)死鎖被被確認(rèn)以后,SQL Server通過(guò)自動(dòng)選擇可以立即打斷死鎖的線程來(lái)結(jié)束死鎖。

許多阻塞的問(wèn)題發(fā)生在由于一個(gè)進(jìn)程保留鎖過(guò)長(zhǎng)時(shí)間,引起一系列被阻塞的進(jìn)程等待其它進(jìn)程釋放鎖。SQL Server不能識(shí)別阻塞鎖并自動(dòng)地解決它們,所以必須監(jiān)控阻塞鎖的存在并手工消除它。

在一個(gè)應(yīng)用中建立一個(gè)鎖的超時(shí)設(shè)置是一個(gè)防止阻塞鎖的方法。這允許應(yīng)用監(jiān)控阻塞鎖并回滾進(jìn)程而不是不確定地等待或阻塞語(yǔ)句的重提交。

下面,介紹手工消除死鎖的方法:

1) 系統(tǒng)長(zhǎng)時(shí)間沒(méi)有響應(yīng),可以在SQL查詢分析器中執(zhí)行系統(tǒng)存儲(chǔ)過(guò)程sp_lock?和sp_who??如圖所示,spid 57正在等待資源。

Spid?:系統(tǒng)進(jìn)程?ID

執(zhí)行命令:sp_who 57?可以得到關(guān)聯(lián)該進(jìn)程和鎖的用戶的登錄名稱,主機(jī)名稱和狀態(tài)等信息。

圖1. 運(yùn)行sp_lock顯示的鎖信息

2) 轉(zhuǎn)到SQL Server Enterprise Manager,展開(kāi)管理?,展開(kāi)當(dāng)前活動(dòng),?展開(kāi)?/?進(jìn)ID?,如圖所示,spid57被spid56阻塞。

圖2. 顯示鎖的阻塞情況

3) 雙擊spid56,然后單擊取消進(jìn)程?(Kill Process)。

4) spid57阻塞解除。

2 硬件調(diào)整

硬件調(diào)整,是為K3系統(tǒng)的正常運(yùn)行要求的工作量提供足夠的硬件資源的行動(dòng)。要調(diào)整系統(tǒng)的硬件,就要決定可以為K3系統(tǒng)分配那些資源以改進(jìn)其性能,這些資源包括附加的內(nèi)存、CPU、I/O資源或所有這些資源的組合。調(diào)整系統(tǒng)性能的工作主要涉及決定應(yīng)該增加哪種資源,以及增加多少資源。

硬件調(diào)整是非常重要的,因?yàn)樵S多典型的性能問(wèn)題是由不充足的或配置失當(dāng)?shù)挠布M件導(dǎo)致的。I/O子系統(tǒng)是一個(gè)數(shù)據(jù)庫(kù)調(diào)整的關(guān)鍵性部分。通過(guò)提供足夠的CPU、內(nèi)存與I/O資源??梢员苊庠S多性能問(wèn)題。

通過(guò)監(jiān)控相關(guān)的計(jì)數(shù)器,可以及時(shí)發(fā)現(xiàn)和解決引起系統(tǒng)性能降低的硬件問(wèn)題。

2.1 控制內(nèi)存的使用

SQL Server 要求內(nèi)存是基于靜態(tài)內(nèi)存的需要:一是它自己的程序代碼和內(nèi)部數(shù)據(jù)結(jié)構(gòu),例如內(nèi)核的工作負(fù)載,打開(kāi)對(duì)象,鎖。二是數(shù)據(jù)高速緩存。

基于有效的系統(tǒng)資源和這些資源的競(jìng)爭(zhēng)需要, SQL Server動(dòng)態(tài)地獲得和釋放數(shù)據(jù)高速緩存。如果SQL Server的數(shù)據(jù)高速緩存需要更多的內(nèi)存,它查詢操作系統(tǒng)檢查是否有物理內(nèi)存可以利用。如果有,SQL Server在數(shù)據(jù)高速

存中使用它并且在內(nèi)存中保留先前讀到的數(shù)據(jù)。

為阻止Windows 2000頁(yè)面調(diào)度,SQL Server依賴Server activity增減數(shù)據(jù)高速緩存以保留4MB~10MB剩余物理內(nèi)存。對(duì)SQL Server不足的內(nèi)存分配或使用會(huì)引起數(shù)據(jù)連續(xù)地從硬盤上而不是高速緩存上讀取,這將降低系統(tǒng)的性能。

請(qǐng)觀察以下與內(nèi)存有關(guān)的計(jì)數(shù)器,以便及時(shí)發(fā)現(xiàn)和解決內(nèi)存上的問(wèn)題。

使用工具:性能監(jiān)視器

監(jiān)控內(nèi)存和分頁(yè)的使用

對(duì)象:?計(jì)數(shù)器

描述

指導(dǎo)

Memory: Available Bytes

監(jiān)控被進(jìn)程執(zhí)行使用的有效字節(jié)數(shù)。

(可用物理內(nèi)存量)

這個(gè)計(jì)數(shù)器應(yīng)該總是大于5000KB;低值顯示物理內(nèi)存整體的缺乏和需要提高。

推薦值:大于4MB

Memory: Page/sec

為了訪問(wèn)不在內(nèi)存中的頁(yè)而讀取或?qū)懭氪疟P的總頁(yè)數(shù)。

該計(jì)數(shù)器應(yīng)該從不持續(xù)大于零.如果值持續(xù)大于零,Windows 2000操作系統(tǒng)正在使用頁(yè)面調(diào)度來(lái)填充內(nèi)存.

推薦值:小于5

Process: Page Faults/sec/SQL Server Instance

缺頁(yè)/秒

處理器中的Page Faults的計(jì)數(shù)值。當(dāng)進(jìn)程所引用的虛擬內(nèi)存頁(yè)不在其主內(nèi)存的工作集中時(shí),將發(fā)生頁(yè)錯(cuò)誤。如果某一頁(yè)已在主內(nèi)存中(位與備用列表內(nèi)),或者它正被共享此頁(yè)的其他進(jìn)程使用,Page Fault 將不會(huì)導(dǎo)致系統(tǒng)從磁盤調(diào)入該頁(yè)。

這個(gè)計(jì)數(shù)器的高值表明過(guò)多的頁(yè)面調(diào)度和磁盤壓力,檢查是否是SQL Server 或其他的進(jìn)程引起過(guò)多的頁(yè)面調(diào)度。

隔離SQL Server 使用的內(nèi)存

Process: Working Set/SQL Server Instance

監(jiān)控用于SQL Server的一個(gè)實(shí)例的SQL Server進(jìn)程的內(nèi)存的

數(shù)量。

這個(gè)計(jì)數(shù)器應(yīng)該大于5000KB。當(dāng)這個(gè)計(jì)數(shù)器低于5000KB,沒(méi)有更多的內(nèi)存可供SQL Server 使用。

SQL Server: Buffer Manager: Buffer Cache Hit Ratio

高速緩存命中率

監(jiān)控高速緩存中不需從硬盤中讀取的頁(yè)的百分率,。不用區(qū)分用于高速緩存的是物理內(nèi)存還是頁(yè)面調(diào)度內(nèi)存。

這個(gè)計(jì)數(shù)器應(yīng)該大于90%,因?yàn)樗@示的是發(fā)現(xiàn)在內(nèi)存中的頁(yè)的數(shù)量。

SQL Server: Buffer Manger: Total Pages

監(jiān)控高速緩存中頁(yè)的總數(shù)量,包括數(shù)據(jù)庫(kù),free和來(lái)自其他進(jìn)程的stolen頁(yè)。

低值顯示連續(xù)的磁盤輸入輸出或壓力.考慮增加更多的內(nèi)存.

SQL Server: Memory Manager Total Server Memory

監(jiān)控服務(wù)器正在使用的動(dòng)態(tài)內(nèi)存的總的數(shù)量。

如果該計(jì)數(shù)器與可用的物理內(nèi)存比較持續(xù)高,則需加更多的內(nèi)存。

2.2 監(jiān)控線程和處理器的使用

優(yōu)化處理器性能是輸出量和響應(yīng)時(shí)間之間的一種平衡。

處理器的性能

當(dāng)你檢查處理器的使用,考慮SQL Server實(shí)例正在做的工作的類型。如果SQL Server正在做大量的計(jì)算,例如包含集合的查詢或綁定內(nèi)存這種不需要磁盤輸入輸出的查詢,100%的處理器時(shí)間可能被使用。

對(duì)于多處理器的系統(tǒng),你需要監(jiān)控每個(gè)處理器的這個(gè)計(jì)數(shù)器的分離的實(shí)例。確定所有處理器的平均值,可使

計(jì)數(shù)器:System:% Total Processor Time?。

線程

每個(gè)SQL Server的實(shí)例都是一個(gè)獨(dú)立的操作系統(tǒng)進(jìn)程,SQL Server2000的實(shí)例使用Windows線程,有時(shí)是纖程

去有效的管理并發(fā)的任務(wù)。

1) 一個(gè)進(jìn)程是一個(gè)應(yīng)用的實(shí)例,例如SQL Server并且能有一個(gè)或多個(gè)任務(wù)。

2) 一個(gè)線程是進(jìn)程任務(wù)的一種機(jī)制,并且被用來(lái)計(jì)劃處理器的時(shí)間。

當(dāng)一個(gè)線程處于等待一個(gè)操作(例如讀寫磁盤)完成的空閑期時(shí),Windows 2000操作系統(tǒng)通過(guò)轉(zhuǎn)換線程來(lái)最大化處理器的使用。線程間的轉(zhuǎn)換叫做context switching.?每個(gè)SQL Server的實(shí)例用戶連接的一個(gè)線程池,池中的線程被叫做工作線程。

當(dāng)Processor: %Processor Time?持續(xù)接近100%并且System: Processor Queue Length?顯示更多的應(yīng)用的進(jìn)程正在等待處理器,或者當(dāng)System: Context Switches/Sec?較高。顯示出現(xiàn)了系統(tǒng)瓶頸。當(dāng)Processor:% Processor Time?接近100%并且System: Context Switches/Sec?接近8000,考慮更快的處理器,附加的處理器或者轉(zhuǎn)換到使用纖程。

請(qǐng)觀察以下與內(nèi)存有關(guān)的計(jì)數(shù)器,以便及時(shí)發(fā)現(xiàn)和解決處理器上的問(wèn)題。

使用工具:Windows?性能監(jiān)視器

對(duì)象:?計(jì)數(shù)器

描述

指導(dǎo)

Processor: %Processor Time

以處理器運(yùn)行非空閑線程所經(jīng)歷時(shí)間的百分比表示。它被視為用于處理有效工作的時(shí)間比。每一個(gè)處理器在空閑時(shí)將會(huì)指定一個(gè)空閑線程來(lái)消耗未被其他線程使用的處理器時(shí)間段。

這個(gè)計(jì)數(shù)器應(yīng)該低于90%,如果這個(gè)計(jì)數(shù)器較高,應(yīng)降低工作負(fù)荷,提高工作效率或者或加大處理器的能力。

System: Context Switches/sec

監(jiān)控處理器每秒在線程間轉(zhuǎn)換的次數(shù)。

在一個(gè)多處理器的計(jì)算機(jī)上,如果這個(gè)計(jì)數(shù)器達(dá)到8000,并且Processor:% Processor Time計(jì)數(shù)器超過(guò)90%,考慮使用SQL Server fiber scheduling.

System: Processor Queue Length

監(jiān)控等待進(jìn)程時(shí)間的線程的數(shù)目

這個(gè)計(jì)數(shù)器不應(yīng)該持續(xù)大于2。如果這個(gè)計(jì)數(shù)器持續(xù)大于2,降低工作負(fù)荷,提高工作負(fù)荷的效率,或者增加處理器的能力,在多處理器的系統(tǒng)中可以增加處理器。

Processor: % Privileged Time

在“特權(quán)模式”下處理器運(yùn)行非空閑線程所經(jīng)歷時(shí)間的百分比。Windows NT服務(wù)層,執(zhí)行體子程序及Windows NT內(nèi)核都是在“特權(quán)方式”下運(yùn)行。

如果處理器的大部分時(shí)間被用來(lái)做系統(tǒng)內(nèi)核命令,并且物理硬盤的計(jì)數(shù)器較高,考慮提高硬盤輸入輸出子系統(tǒng)的性能。

Processor: %User Time

在“用戶模式”下處理器運(yùn)行非空閑線程所經(jīng)歷時(shí)間的百分比。所有應(yīng)用程序碼及子系統(tǒng)碼都在“用戶模式“下運(yùn)行。

這個(gè)能確定其它進(jìn)程或應(yīng)用正在執(zhí)行或阻止SQL Server操作。

2.3 監(jiān)控硬盤輸入輸出

SQL Server 使用Windows 2000 I/O calls 執(zhí)行磁盤的讀寫。SQL Server管理何時(shí)和如何執(zhí)行磁盤讀寫,但依賴Windows執(zhí)行底層的輸入輸出操作。I/O子系統(tǒng)包括系統(tǒng)總線,磁盤控制卡,磁盤,磁帶驅(qū)動(dòng)器,CD-ROM驅(qū)動(dòng)器和許多其它的I/O設(shè)備。磁盤經(jīng)常是系統(tǒng)的最大的瓶頸。

監(jiān)控硬盤輸入輸出將幫助你確定讀頁(yè)和寫頁(yè)是否超出硬盤子系統(tǒng)的能力。一個(gè)忙碌的硬盤子系統(tǒng)也可以顯示不足的內(nèi)存所引起的過(guò)多的頁(yè)面調(diào)度輸入輸出。

下面的表描述了優(yōu)化對(duì)象計(jì)數(shù)器,你可以用來(lái)監(jiān)控你的硬盤子系統(tǒng)的性能。

使用工具:Windows?性能監(jiān)視器

對(duì)象:計(jì)數(shù)器

描述

指導(dǎo)

PhysicalDisk: %Disk Time

所選的驅(qū)動(dòng)器忙于處理讀取或?qū)懭胝?qǐng)求作服務(wù)所花費(fèi)時(shí)間的百分比。

這個(gè)計(jì)數(shù)器應(yīng)當(dāng)持續(xù)低于90%。

推薦值:小于50%

PhysicalDisk:Avg.Disk Queue Length

指在采樣間隔期內(nèi),對(duì)所選磁盤的讀寫操作被排入隊(duì)列的平均次數(shù)。

這個(gè)計(jì)數(shù)器應(yīng)該不超過(guò)中心值的兩倍。

PhysicalDisk:Disk Read/sec

讀取磁盤的速度

這個(gè)計(jì)數(shù)器應(yīng)該續(xù)低于硬盤子系統(tǒng)的能力。

PhysicalDisk: Disk Writes/sec

寫入磁盤的速度

這個(gè)計(jì)數(shù)器應(yīng)持續(xù)低于硬盤子系統(tǒng)的能力。

如果這些硬盤計(jì)數(shù)器顯示你的硬盤正在超負(fù)荷運(yùn)行,考慮:

1. 通過(guò)使用一個(gè)更快的硬盤,提高硬盤輸入輸出能力

2. 把一些文件轉(zhuǎn)移到一個(gè)附加硬盤或服務(wù)器上

3. 增加一個(gè)硬盤陣列

4. 提高硬盤的數(shù)量有助于減少硬盤的壓力。

SQL SERVER中一些常見(jiàn)性能問(wèn)題的總結(jié)

1.對(duì)查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。

2.應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:

select id from t where num is null

可以在num上設(shè)置默認(rèn)值0,確保表中num列沒(méi)有null值,然后這樣查詢:

select id from t where num=0

3.應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。

4.應(yīng)盡量避免在 where 子句中使用 or 來(lái)連接條件,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:

select id from t where num=10 or num=20

可以這樣查詢:

select id from t where num=10

union all

select id from t where num=20

5.in 和 not in 也要慎用,否則會(huì)導(dǎo)致全表掃描,如:

select id from t where num in(1,2,3)

對(duì)于連續(xù)的數(shù)值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

6.下面的查詢也將導(dǎo)致全表掃描:

select id from t where name like '%abc%'

若要提高效率,可以考慮全文檢索。

7.如果在 where 子句中使用參數(shù),也會(huì)導(dǎo)致全表掃描。因?yàn)镾QL只有在運(yùn)行時(shí)才會(huì)解析局部變量,但優(yōu)化程序不能將訪問(wèn)計(jì)劃的選擇推遲到運(yùn)

行時(shí);它必須在編譯時(shí)進(jìn)行選擇。然而,如果在編譯時(shí)建立訪問(wèn)計(jì)劃,變量的值還是未知的,因而無(wú)法作為索引選擇的輸入項(xiàng)。如下面語(yǔ)句將

進(jìn)行全表掃描:

select id from t where num=@num

可以改為強(qiáng)制查詢使用索引:

select id from t with(index(索引名)) where num=@num

8.應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:

select id from t where num/2=100

應(yīng)改為:

select id from t where num=100*2

9.應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:

select id from t where substring(name,1,3)='abc'--name以abc開(kāi)頭的id

select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id

應(yīng)改為:

select id from t where name like 'abc%'

select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

10.不要在 where 子句中的“=”左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算,否則系統(tǒng)將可能無(wú)法正確使用索引。

11.在使用索引字段作為條件時(shí),如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)才能保證系統(tǒng)使用該索引,否則該索引將不會(huì)被使用,并且應(yīng)盡可能的讓字段順序與索引順序相一致。

12.不要寫一些沒(méi)有意義的查詢,如需要生成一個(gè)空表結(jié)構(gòu):

select col1,col2 into #t from t where 1=0

這類代碼不會(huì)返回任何結(jié)果集,但是會(huì)消耗系統(tǒng)資源的,應(yīng)改成這樣:

create table #t(...)

13.很多時(shí)候用 exists 代替 in 是一個(gè)好的選擇:

select num from a where num in(select num from b)

用下面的語(yǔ)句替換:

select num from a where exists(select 1 from b where num=a.num)

14.并不是所有索引對(duì)查詢都有效,SQL是根據(jù)表中數(shù)據(jù)來(lái)進(jìn)行查詢優(yōu)化的,當(dāng)索引列有大量數(shù)據(jù)重復(fù)時(shí),SQL查詢可能不會(huì)去利用索引,如一表中有字段sex,male、female幾乎各一半,那么即使在sex上建了索引也對(duì)查詢效率起不了作用。

15.索引并不是越多越好,索引固然可以提高相應(yīng)的 select 的效率,但同時(shí)也降低了 insert 及 update 的效率,因?yàn)?insert 或 update 時(shí)有可能會(huì)重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個(gè)表的索引數(shù)最好不要超過(guò)6個(gè),若太多則應(yīng)考慮一些不常使用到的列上建的索引是否有必要。

16.應(yīng)盡可能的避免更新 clustered 索引數(shù)據(jù)列,因?yàn)?clustered 索引數(shù)據(jù)列的順序就是表記錄的物理存儲(chǔ)順序,一旦該列值改變將導(dǎo)致整個(gè)表記錄的順序的調(diào)整,會(huì)耗費(fèi)相當(dāng)大的資源。若應(yīng)用系統(tǒng)需要頻繁更新 clustered 索引數(shù)據(jù)列,那么需要考慮是否應(yīng)將該索引建為 clustered 索引。

17.盡量使用數(shù)字型字段,若只含數(shù)值信息的字段盡量不要設(shè)計(jì)為字符型,這會(huì)降低查詢和連接的性能,并會(huì)增加存儲(chǔ)開(kāi)銷。這是因?yàn)橐嬖谔幚聿樵兒瓦B接時(shí)會(huì)逐個(gè)比較字符串中每一個(gè)字符,而對(duì)于數(shù)字型而言只需要比較一次就夠了。

18.盡可能的使用 varchar/nvarchar 代替 char/nchar ,因?yàn)槭紫茸冮L(zhǎng)字段存儲(chǔ)空間小,可以節(jié)省存儲(chǔ)空間,其次對(duì)于查詢來(lái)說(shuō),在一個(gè)相對(duì)較小的字段內(nèi)搜索效率顯然要高些。

19.任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。

20.盡量使用表變量來(lái)代替臨時(shí)表。如果表變量包含大量數(shù)據(jù),請(qǐng)注意索引非常有限(只有主鍵索引)。

21.避免頻繁創(chuàng)建和刪除臨時(shí)表,以減少系統(tǒng)表資源的消耗。

22.臨時(shí)表并不是不可使用,適當(dāng)?shù)厥褂盟鼈兛梢允鼓承├谈行?#xff0c;例如,當(dāng)需要重復(fù)引用大型表或常用表中的某個(gè)數(shù)據(jù)集時(shí)。但是,對(duì)于一次性事件,最好使用導(dǎo)出表。

23.在新建臨時(shí)表時(shí),如果一次性插入數(shù)據(jù)量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,應(yīng)先create table,然后insert。

24.如果使用到了臨時(shí)表,在存儲(chǔ)過(guò)程的最后務(wù)必將所有的臨時(shí)表顯式刪除,先 truncate table ,然后 drop table ,這樣可以避免系統(tǒng)表的較長(zhǎng)時(shí)間鎖定。

25.盡量避免使用游標(biāo),因?yàn)橛螛?biāo)的效率較差,如果游標(biāo)操作的數(shù)據(jù)超過(guò)1萬(wàn)行,那么就應(yīng)該考慮改寫。

26.使用基于游標(biāo)的方法或臨時(shí)表方法之前,應(yīng)先尋找基于集的解決方案來(lái)解決問(wèn)題,基于集的方法通常更有效。

27.與臨時(shí)表一樣,游標(biāo)并不是不可使用。對(duì)小型數(shù)據(jù)集使用 FAST_FORWARD 游標(biāo)通常要優(yōu)于其他逐行處理方法,尤其是在必須引用幾個(gè)表才能獲得所需的數(shù)據(jù)時(shí)。在結(jié)果集中包括“合計(jì)”的例程通常要比使用游標(biāo)執(zhí)行的速度快。如果開(kāi)發(fā)時(shí)間允許,基于游標(biāo)的方法和基于集的方法都可以嘗試一下,看哪一種方法的效果更好。

28.在所有的存儲(chǔ)過(guò)程和觸發(fā)器的開(kāi)始處設(shè)置 SET NOCOUNT ON ,在結(jié)束時(shí)設(shè)置 SET NOCOUNT OFF 。無(wú)需在執(zhí)行存儲(chǔ)過(guò)程和觸發(fā)器的每個(gè)語(yǔ)句后向客戶端發(fā)送 DONE_IN_PROC 消息。

29.盡量避免大事務(wù)操作,提高系統(tǒng)并發(fā)能力。

30.盡量避免向客戶端返回大數(shù)據(jù)量,若數(shù)據(jù)量過(guò)大,應(yīng)該考慮相應(yīng)需求是否合理。

具體的SQL語(yǔ)句在很多情況下需要結(jié)合實(shí)際的應(yīng)用情況來(lái)寫,這里不作敘述。

--Windows 2003支持4G內(nèi)存

[boot loader]

timeout=30

default=multi(0)disk(0)rdisk(0)partition(2)/WINDOWS

[operating systems]

multi(0)disk(0)rdisk(0)partition(2)/WINDOWS="Windows Server 2003, Standard" /fastdetect /3GB

將Boot.ini文件加好參數(shù):

/fastdetect /3GB

對(duì)數(shù)據(jù)庫(kù)中一些數(shù)據(jù)量較大的表(如T_Voucher,T_VoucherEntry,T_Balance,

IcStockBill,IcStockBillEntry等)可以在SQL SERVER中制作一個(gè)作業(yè)在系統(tǒng)空閑時(shí)定時(shí)進(jìn)行重建索引,例如“dbcc dbreindex('icstockbill');dbcc dbreindex('icstockbillEntry')”2個(gè)sql進(jìn)行出入庫(kù)單據(jù)表的專門索引優(yōu)化。


轉(zhuǎn)載于:https://blog.51cto.com/211721/1845479

總結(jié)

以上是生活随笔為你收集整理的K3数据库优化方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。