很多使用用友財(cái)務(wù)軟件的朋友,使用的都是SQLSERVER數(shù)據(jù)庫(kù),有一部分朋友的用友軟件數(shù)據(jù)庫(kù)更是巨量數(shù)據(jù),特別是用到生產(chǎn)管理的模塊,千萬(wàn)行甚至億行記錄都不足為奇。如此情況下,用友數(shù)據(jù)庫(kù)運(yùn)行速度將受到嚴(yán)重影響,打開(kāi)一個(gè)賬表半小時(shí)甚至兩小時(shí),做一個(gè)計(jì)劃要兩天兩夜,各個(gè)部門經(jīng)常出現(xiàn)抱怨不斷,IT運(yùn)維人員更是焦頭爛額。那么應(yīng)該怎么辦呢?如果解決用友軟件數(shù)據(jù)庫(kù)變慢導(dǎo)致查詢單據(jù)打印賬表等變慢的問(wèn)題呢?
其實(shí)是有辦法可以大大提升數(shù)據(jù)庫(kù)運(yùn)行效率的,這要求我們的IT運(yùn)維要學(xué)會(huì)數(shù)據(jù)庫(kù)日常維護(hù)的高級(jí)技巧,而且是必須學(xué)會(huì)。下面是數(shù)據(jù)庫(kù)效率提升技巧的全面內(nèi)容,建議所有企業(yè)的IT運(yùn)維人員都要自行練習(xí)并用在實(shí)際工作中,能夠熟練掌握。下面我們就一起來(lái)看一下用友軟件數(shù)據(jù)庫(kù)變慢導(dǎo)致查詢單據(jù)打印賬表等很卡的終極解決辦法。
技巧一:重建索引
效率提升指數(shù):高
特點(diǎn):一二三買單,灰常的快,一下就弄完可以走人了。
案例:某超市暢捷通T1商貿(mào)寶百萬(wàn)行級(jí)數(shù)據(jù),原速度五秒,重建索引后兩秒不到,速度提升近一倍。不要小看這幾秒,對(duì)超市來(lái)講,那意味著不必要排長(zhǎng)隊(duì)。
由于數(shù)據(jù)庫(kù)日常寫操作頻繁,索引的工作效率會(huì)越來(lái)越低,速度自然大受影響,很多客戶會(huì)有這種感覺(jué),前半年還非常快,后半年就受不了了。剛剛到年底,正好是出報(bào)告、查資料的年關(guān),偏偏軟件慢得要命,服務(wù)人員也別想有好日子過(guò),陪著加班吧,就算解決不了問(wèn)題,也讓人家心理舒服點(diǎn)。這樣的日子可以過(guò)去了。
命令1:DBCC DBREINDEX (表名稱,"",70) ---針對(duì)主要影響速度的表,一般如rdrecords、salebillvouchs、pp_mrpdetails、pp_rmrpdetails
說(shuō)明:只對(duì)主要表操作,影響速度的當(dāng)然是這幾個(gè)大表,速度解決問(wèn)題,也不影響客戶使用
命令2:exec sp_msforeachtable "DBCC DBREINDEX(""?"")" ---數(shù)據(jù)庫(kù)所有表重建索引
說(shuō)明:不太建議,除非太咸了
特別指出,重建索引前必須斷網(wǎng),以保證所有客戶端無(wú)人在操作軟件
技巧二:表分區(qū)
效率提升指數(shù):超高
特點(diǎn):慢工出快活。硬盤越多,它就越快,所有硬盤一起轉(zhuǎn)當(dāng)然快;CPU越多,它就更快,sqlserver的引擎對(duì)這個(gè)有優(yōu)化設(shè)計(jì);設(shè)計(jì)得越合理,它就灰常滴快,例如歷史數(shù)據(jù)按年存放,因?yàn)槟阋话悴挥寐?,那?shù)據(jù)庫(kù)只對(duì)你要操作的部分分區(qū)檢索,自然飛快。還有,必須得是sql2005及以上版本
1、為數(shù)據(jù)庫(kù)建個(gè)文件組(可以建多個(gè)),最好是存放于不同磁盤上。這樣效率得以最大化,想一想吧,我們查一個(gè)年度所有收發(fā)記錄,三個(gè)硬盤一起轉(zhuǎn),是不是原來(lái)速度的三倍?
ALTER DATABASE 數(shù)據(jù)庫(kù)名 ADD FILEGROUP 文件組名
2、一個(gè)文件組可放置多個(gè)文件,下面,只為一個(gè)文件組分配一個(gè)文件,類推吧。
ALTER DATABASE 數(shù)據(jù)庫(kù)名 ADD FILE (NAME = N"文件組名", FILENAME = N"存放路徑",SIZE = 5MB , FILEGROWTH = 10% ) TO FILEGROUP 文件組名
3、創(chuàng)建分區(qū)函數(shù)。這個(gè)函數(shù)是本文件組專有的,再建其它的文件組還得再搞一個(gè)。主要是設(shè)定,包括預(yù)設(shè)現(xiàn)有的數(shù)據(jù)從哪里開(kāi)始水平分割,比如我們假設(shè)U8 10.0的上一年度最后一行rdrecords記錄的Id是5000000,那么就可以設(shè)定這個(gè)值,這以內(nèi)的記錄會(huì)切割保存到第一個(gè)分區(qū)中。
CREATE PARTITION FUNCTION [函數(shù)名] (int) AS RANGE LEFT FOR VALUES (5000000,8274249,12000000)
此句表示,分三個(gè)區(qū)存放原先的數(shù)據(jù)
4、將分區(qū)函數(shù)綁定到分區(qū)架構(gòu)上
CREATE PARTITION SCHEME [架構(gòu)名] AS PARTITION [函數(shù)名]
TO ([PRIMARY],[文件組名],[PRIMARY],[文件組名],[PRIMARY],[文件組名])
5、刪除表的主鍵,必須刪除,表?yè)?dān)心,主鍵可以再建的
ALTER TABLE 數(shù)據(jù)表名稱 DROP CONSTRAINT [主鍵]
6、刪除聚集索引,如果有的話,我還沒(méi)找到命令,現(xiàn)在是手動(dòng)刪除的
7、開(kāi)始做表分區(qū)
ALTER TABLE 數(shù)據(jù)表名稱 add CONSTRAINT [主鍵] PRIMARY KEY CLUSTERED (主鍵字段名) ON [SHEME_rdrec](主鍵字段名)
你看,這不是恢復(fù)了主鍵嗎
不過(guò)還是得手動(dòng)恢復(fù)原來(lái)的聚集索引,這個(gè)我再查查語(yǔ)句吧
特別提出:
數(shù)據(jù)庫(kù)收縮并不能提高數(shù)據(jù)庫(kù)的讀取效率,正相反,它反而更慢了,蛋痛!原因,是收縮后數(shù)據(jù)庫(kù)內(nèi)部的數(shù)據(jù)存儲(chǔ)發(fā)生位移,也就是索引變得更低效。
這種情況下,必須再做一次索引重建,但我發(fā)現(xiàn)似乎只要收縮了以后,數(shù)據(jù)庫(kù)都慢,重建索引也恢復(fù)不到原來(lái)的速度,一下想不明白道理,而且做的測(cè)試次數(shù)也有限。
建議以后不要做收縮處理,沒(méi)空間了買硬盤吧。
最終建議:
微軟的sqlserver系列產(chǎn)品一直在進(jìn)化,我從7.0一直用到2008,對(duì)于習(xí)慣了sql2000的服務(wù)人員來(lái)講,要更換并熟悉一種新的數(shù)據(jù)庫(kù)確實(shí)是一個(gè)挑戰(zhàn)。這個(gè)字眼換一個(gè)吧,叫做好奇心。是的,技術(shù)人員的最根本特性,就是要保持這種好奇心,那么無(wú)論何種旁人看來(lái)的枯燥都是我們新奇的玩具。
sql2008有什么特點(diǎn)?就速度的提升而言,并沒(méi)有太大的提高,但是它將我們?cè)趕ql2005中必須要復(fù)雜語(yǔ)句處理的表分區(qū),直接做成了向?qū)J?,傻瓜型的,也就是說(shuō),誰(shuí)都可以輕松的勝任一個(gè)數(shù)據(jù)庫(kù)管理員的工作。如果你不想記住那些復(fù)雜的語(yǔ)句,呃,那么來(lái)個(gè)sqlserver2008數(shù)據(jù)庫(kù)吧。