文|朱小東 李偉 馬驍 曹三省
非線性編輯網(wǎng)絡(luò)系統(tǒng)是全數(shù)字化的電視節(jié)目制作系統(tǒng),它在把電視節(jié)目的編輯、修改、配音、存取等全部信息進(jìn)行數(shù)字化處理和傳輸?shù)耐瑫r(shí),將其網(wǎng)絡(luò)化。隨著非編網(wǎng)在電視節(jié)目制作中應(yīng)用越來(lái)越廣泛,對(duì)非編網(wǎng)的安全性和穩(wěn)定性也提出了更高的要求。絕大多數(shù)的非編網(wǎng)都是由磁盤(pán)陣列存儲(chǔ)節(jié)目素材,數(shù)據(jù)庫(kù)里記錄相應(yīng)的各種信息。數(shù)據(jù)庫(kù)的穩(wěn)定性對(duì)整于個(gè)非編網(wǎng)的安全穩(wěn)定起著關(guān)鍵性的作用。隨著運(yùn)行時(shí)間的增長(zhǎng),非編網(wǎng)會(huì)出現(xiàn)運(yùn)行速度逐漸變慢的情況,嚴(yán)重時(shí)會(huì)出現(xiàn)頻繁死機(jī)的狀況。根據(jù)作者多年的工作經(jīng)驗(yàn),本文總結(jié)出通過(guò)對(duì)數(shù)據(jù)庫(kù)的優(yōu)化來(lái)提高非編網(wǎng)的運(yùn)行速速和穩(wěn)定性的方法,與大家一起分享。
非編網(wǎng)是電視臺(tái)的節(jié)目生產(chǎn)線,每天要完成大量節(jié)目的制作。在節(jié)目制作各個(gè)環(huán)節(jié)的操作結(jié)果都保存在數(shù)據(jù)庫(kù)中。而電視臺(tái)非編網(wǎng)對(duì)數(shù)據(jù)庫(kù)的應(yīng)用和其他行業(yè)有所不同,有自己的特點(diǎn):
1.在節(jié)目制作過(guò)程中用到的素材,由于其文件都比較大,不直接放到數(shù)據(jù)庫(kù)中,而是將素材的各種描述信息存放在數(shù)據(jù)庫(kù)中。
2.素材的描述信息存儲(chǔ)周期比較短,而在存儲(chǔ)周期內(nèi)數(shù)據(jù)要求高安全性和高可用性。
3.對(duì)數(shù)據(jù)庫(kù)要定期優(yōu)化,保持高性能,高可靠。由于非編網(wǎng)的特點(diǎn),每天數(shù)據(jù)庫(kù)都有大量插入、修改和刪除操作。如果不做處理,日志文件會(huì)增長(zhǎng)很快,嚴(yán)重影響數(shù)據(jù)庫(kù)的性能,甚至占滿整個(gè)硬盤(pán)空間,使數(shù)據(jù)庫(kù)面臨崩潰的危險(xiǎn)。
因?yàn)橐曇纛l文件都是時(shí)間敏感的數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)的性能要求很高,而大多數(shù)SQL Server表是通過(guò)建立索引來(lái)提高數(shù)據(jù)的訪問(wèn)速度,如果沒(méi)有索引,SQL Server要進(jìn)行表格掃描讀取表中的每一個(gè)記錄才能找到需要的數(shù)據(jù)。
1.索引的體系結(jié)構(gòu)
SQL Server在硬盤(pán)中用8KB作為一頁(yè),按頁(yè)在數(shù)據(jù)庫(kù)文件內(nèi)存放數(shù)據(jù)。缺省情況下這些頁(yè)及其包含的數(shù)據(jù)是無(wú)組織的。為了使混亂變?yōu)橛行?,就要生成索引,就有了索引?yè)和數(shù)據(jù)頁(yè),數(shù)據(jù)頁(yè)保存用戶寫(xiě)入的數(shù)據(jù)信息。索引頁(yè)存放用于檢索列的數(shù)據(jù)值清單(關(guān)鍵字)和索引表中該值所在紀(jì)錄的地址指針。索引分為聚集索引和非聚集索引,聚集索引實(shí)質(zhì)上是將表中的數(shù)據(jù)排序。非聚集索引只保存了數(shù)據(jù)的指針地址。向一個(gè)帶聚集索引的表中插入數(shù)據(jù),當(dāng)數(shù)據(jù)頁(yè)達(dá)到100%時(shí),由于頁(yè)沒(méi)有空間插入新的紀(jì)錄,這時(shí)就會(huì)發(fā)生分頁(yè),SQL Server 將大約一半的數(shù)據(jù)從滿頁(yè)中移到空頁(yè)中,從而生成兩個(gè)半的滿頁(yè)。聚集索引是雙向鏈表,在每一頁(yè)的頭部保存了前一頁(yè)、后一頁(yè)地址以及分頁(yè)后數(shù)據(jù)移動(dòng)的地址,由于新頁(yè)可能在數(shù)據(jù)庫(kù)文件中的任何地方,因此頁(yè)面的鏈接不一定指向磁盤(pán)的下一個(gè)物理頁(yè),鏈接可能指向了另一個(gè)區(qū)域,這就形成了分塊,從而減慢了系統(tǒng)的速度。
2.查看數(shù)據(jù)分塊情況
我們可以通過(guò)DBCC SHOWCONTIG這個(gè)命令來(lái)查看某個(gè)表的分塊情況。下面查看大洋X-EDIT網(wǎng)絡(luò)系統(tǒng)的dycommondata數(shù)據(jù)庫(kù)中DYClipDataFileName表的分塊情況。打開(kāi)SQL Server的查詢分析器輸入并執(zhí)行以下命令:
use dycommondata
declare @table_id int
set @table_id=object_id('DYClipDataFileName')
dbcc showcontig(@table_id)
go
在SQL Server 2000中,顯示結(jié)果如下:
DBCC SHOWCONTIG 正在掃描 'DYClipDataFileName' 表...
表: 'DYClipDataFileName'(213575799);索引 ID: 1,數(shù)據(jù)庫(kù) ID: 7
已執(zhí)行 TABLE級(jí)別的掃描。
- 掃描頁(yè)數(shù)......................: 26732642
- 掃描擴(kuò)展盤(pán)區(qū)數(shù)................: 440 332
- 擴(kuò)展盤(pán)區(qū)開(kāi)關(guān)數(shù)................: 1955332
- 每個(gè)擴(kuò)展盤(pán)區(qū)上的平均頁(yè)數(shù).......: 6.18.0
- 掃描密度[最佳值:實(shí)際值]: 17.10%[335:1956]99.40%[331:335]
- 邏輯掃描碎片...................: 88.96% 0.15%
- 擴(kuò)展盤(pán)區(qū)掃描碎片..............: 71.14% 48.19%
- 每頁(yè)上的平均可用字節(jié)數(shù).......: 2085.7 2085
- 平均頁(yè)密度(完整)..........: 74.23% 74.24%
為了便于對(duì)比索引重構(gòu)前后的結(jié)果,在每一行最后給出了索引重構(gòu)后的值
從上面命令的執(zhí)行結(jié)果可以看的出來(lái),最佳值為335 而實(shí)際值為1956。這表明DYClipDataFileName表分塊嚴(yán)重,需要重構(gòu)表索引。
3.重構(gòu)表的索引
為了克服數(shù)據(jù)分塊帶來(lái)的負(fù)面影響,需要重構(gòu)表的索引,而在制作網(wǎng)中,我們有必要進(jìn)行重構(gòu)表的索引,原因如下:
制作網(wǎng)數(shù)據(jù)庫(kù)文件不是很大,一般在幾百M(fèi)到幾個(gè)G;
制作網(wǎng)每天都有大量的數(shù)據(jù)刪除插入,數(shù)據(jù)分塊現(xiàn)象比較容易產(chǎn)生;
制作網(wǎng)對(duì)數(shù)據(jù)庫(kù)的性能要求比較高;
制作網(wǎng)有明顯的工作忙時(shí)和閑時(shí)之分,可以利用下班時(shí)間進(jìn)行索引重建。
下面通過(guò)DBCC DBREINDEX命令對(duì)表重構(gòu)索引。
同樣在查詢分析器中輸入命令:
use dycommondata
dbcc dbreindex('dycommondata.dbo.DYClipDataFileName',pk_Guid,70)
執(zhí)行結(jié)果:
DBCC執(zhí)行完畢。如果DBCC輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。
Dbcc dbreindex參數(shù)說(shuō)明:第一個(gè)參數(shù)為要重構(gòu)的表明。第二個(gè)參數(shù)為需要重構(gòu)的索引表識(shí),‘ ’表示所有的索引。第三個(gè)參數(shù)為頁(yè)的填充因子,值越大,頁(yè)越滿。
我們對(duì)dycommondata數(shù)據(jù)庫(kù)中的DYClipDataFileName表的全部索引進(jìn)行重建:然后再用DBCC SHOWCONTIG查看重構(gòu)索引后的結(jié)果,如上表所示,較重構(gòu)索引之前性能大大提高。使用Dbcc dbreindex對(duì)表進(jìn)行索引重構(gòu)時(shí),該表必須有一個(gè)聚集索引,否則該命令不起作用。
根據(jù)網(wǎng)絡(luò)的具體實(shí)際情況,制定了相應(yīng)的自動(dòng)化維護(hù)任務(wù),其中只包括了數(shù)據(jù)庫(kù)的備份和用戶數(shù)據(jù)的索引重構(gòu)。
(1)數(shù)據(jù)庫(kù)備份
數(shù)據(jù)庫(kù)的備份主要是制定備份策略、創(chuàng)建備份設(shè)備、建立作業(yè)等。完善的備份策略是數(shù)據(jù)庫(kù)備份的基礎(chǔ)也是故障恢復(fù)時(shí)的依據(jù)。根據(jù)網(wǎng)絡(luò)中數(shù)據(jù)庫(kù)的功能、節(jié)目的制作進(jìn)程和播出時(shí)間等因素,綜合考慮,確定每個(gè)數(shù)據(jù)庫(kù)的備份頻率和備份方式。
創(chuàng)建備份設(shè)備,利用SQL Server企業(yè)管理器創(chuàng)建備份設(shè)備,備份設(shè)備可以重復(fù)利用,便于以后的操作。
建立作業(yè),在SQL Server的企業(yè)管理器中,按照制定備份策略為每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建相應(yīng)的作業(yè),使其按照預(yù)定的時(shí)間自動(dòng)化執(zhí)行。
(2)數(shù)據(jù)庫(kù)索引重構(gòu)
建立atuo_reindex作業(yè),在每個(gè)月的第一天晚上22:00對(duì)dycommondata數(shù)據(jù)庫(kù)中用戶表進(jìn)行自動(dòng)化定時(shí)重構(gòu)索引,在我臺(tái)實(shí)際網(wǎng)絡(luò)環(huán)境中填充因子設(shè)置為70比較合適,本實(shí)例使用循環(huán),將所有用戶表,都進(jìn)行了索引重構(gòu)。具體用到的命令如下:
需要注意的是,利用作業(yè)對(duì)數(shù)據(jù)庫(kù)備份和索引重構(gòu)時(shí),必須保證SQL server Agent服務(wù)啟動(dòng),這些作業(yè)才能夠自動(dòng)化定時(shí)的完成。
隨著計(jì)算機(jī)設(shè)備在電視領(lǐng)域應(yīng)用不斷增多,設(shè)備的使用維護(hù)也逐漸由傳統(tǒng)設(shè)備的硬件維護(hù)為主轉(zhuǎn)向了以軟件維護(hù)為主。一臺(tái)設(shè)備的功能和性能的發(fā)揮,不僅取決于硬件的配置,很大程度上還在于軟件的配置和維護(hù)。所以在軟件層面上解決非編網(wǎng)的速度和穩(wěn)定性就顯的尤為重要。