時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
分區(qū)視圖聯(lián)接來自一組成員的水平分區(qū)數(shù)據(jù),使數(shù)據(jù)看起來象來自同一張表。SQL Server 2000 區(qū)分本地分區(qū)視圖和分布式分區(qū)視圖。在本地分區(qū)視圖中,所有相關(guān)表和視圖駐留在 SQL Server 的同一實例上。在分布式分區(qū)視圖中,相關(guān)表中至少有一張表駐留在其他某個(遠程)服務(wù)器上。建議您不要將分布式分區(qū)視圖用于數(shù)據(jù)倉庫應(yīng)用程序。
矢量數(shù)據(jù)倉庫圍繞事實(標(biāo)量)和矢量構(gòu)建,從物理上通常表示為星形架構(gòu)和雪花形架構(gòu),極少有同時包含事實和矢量的完全非正交化的平面表。由于矢量架構(gòu)是最常見的關(guān)系型數(shù)據(jù)倉庫結(jié)構(gòu),本文集中討論這類架構(gòu)的分區(qū)。下面的建議也適用于其他通用數(shù)據(jù)倉庫架構(gòu)。
分區(qū)的優(yōu)點
數(shù)據(jù)修剪:
許多數(shù)據(jù)倉庫管理員會定期將陳舊的數(shù)據(jù)歸檔。例如,一個單擊流數(shù)據(jù)倉庫可能只將詳細數(shù)據(jù)聯(lián)機保留三至四個月。其他常見的規(guī)則可能是聯(lián)機保留 13 個月、37 個月或 10 年,當(dāng)舊數(shù)據(jù)不在活動窗口中時就歸檔并從數(shù)據(jù)庫中刪除。這種滾動窗口結(jié)構(gòu)是大數(shù)據(jù)倉庫通常采取的做法。
在沒有分區(qū)表的情況下,從數(shù)據(jù)庫中刪除舊數(shù)據(jù)的進程需要一個很大的 DELETE 語句,例如:
DELETE FROM fact_table
WHERE date_key < 19990101
執(zhí)行該語句開銷會非常大,可能比同一張表的加載進程需要更多的時間。相反,對于分區(qū)表,管理員重新定義 UNION ALL 視圖以排除最舊的表,然后將該表從數(shù)據(jù)庫中刪除(假設(shè)已確保備份該表),這個過程幾乎可以在瞬間完成。
后面我們會討論到,維護分區(qū)表的費用也很高。如果數(shù)據(jù)修剪是采用分區(qū)的唯一原因,設(shè)計者應(yīng)考慮以數(shù)據(jù)分解的方式從未分區(qū)的表中刪除舊數(shù)據(jù)。在低優(yōu)先級進程上連續(xù)運行一個每次刪除 1000 行(用"set rowcount 1000"命令)的腳本,直至刪除所有希望刪除的數(shù)據(jù)。該技術(shù)可在大系統(tǒng)上有效運用,比創(chuàng)建必要的分區(qū)管理系統(tǒng)更為直接。根據(jù)加載量和系統(tǒng)使用狀況,該技術(shù)適合于某些系統(tǒng),并應(yīng)該考慮在系統(tǒng)上進行基準(zhǔn)測試。
加載速度:
加載數(shù)據(jù)最快的方法是將數(shù)據(jù)加載至空表或沒有索引的表。通過加載至較小的分區(qū)表,漸變加載進程的效率將大大提高。
可維護性:
一旦已建成支持分區(qū)的數(shù)據(jù)倉庫分階段應(yīng)用程序,整個系統(tǒng)將變得容易維護。維護活動(包括加載數(shù)據(jù)、備份和還原表)可以并行地執(zhí)行,這樣可以極大地改善性能。漸變填充下行數(shù)據(jù)流多維數(shù)據(jù)集的進程可以被加速和簡化。
查詢速度:
查詢速度不應(yīng)該作為對數(shù)據(jù)倉庫關(guān)系型數(shù)據(jù)庫進行分區(qū)的理由。對于分區(qū)和未分區(qū)的事實表,查詢性能都差不多。在正確設(shè)計的分區(qū)數(shù)據(jù)庫中,關(guān)系引擎僅在查詢計劃中包括解析查詢所需的相關(guān)分區(qū)。例如,如果數(shù)據(jù)庫按月分區(qū),查詢條件為 2000 年 1 月,則查詢計劃僅包括 2000 年 1 月的分區(qū)。結(jié)果查詢將對分區(qū)表正確執(zhí)行,與在分區(qū)鍵上帶有簇索引的已索引合并表上執(zhí)行的大體相同。
分區(qū)的缺點
復(fù)雜性:
分區(qū)的主要缺點是需要管理員創(chuàng)建應(yīng)用程序來管理分區(qū)。在尚未設(shè)計、測試和試運行應(yīng)用程序來管理分區(qū)之前,將在關(guān)系型數(shù)據(jù)庫中使用水平分區(qū)的數(shù)據(jù)倉庫投入正式運行是不恰當(dāng)?shù)?。本文的目的之一就是討論與分區(qū)管理應(yīng)用程序有關(guān)的問題和設(shè)計決策。
查詢設(shè)計約束:
要獲得最佳的查詢性能,所有的查詢都應(yīng)將條件直接放在事實表中的篩選鍵上。將約束放在第二張表(例如以日期為矢量的表)的查詢將包括所有分區(qū)。
設(shè)計時要考慮的因素:
矢量數(shù)據(jù)倉庫圍繞事實(標(biāo)量)和矢量構(gòu)建,從物理上通常表示為星形架構(gòu)和雪花形架構(gòu),極少有同時包含事實和矢量的完全非正交化的平面表。典型情況下,矢量數(shù)據(jù)倉庫的管理員僅對事實表進行分區(qū);對矢量表進行分區(qū)幾乎沒有什么好處。在某些情況下,對包含多于一千萬個成員的大型矢量表進行分區(qū)會有些好處。也可以對非矢量關(guān)系型數(shù)據(jù)倉庫進行分區(qū),本文中的一般觀點仍然適用。
只有充分考慮系統(tǒng)體系結(jié)構(gòu)和設(shè)計目標(biāo),才能制訂有效的分區(qū)計劃。即使使用相同的架構(gòu)設(shè)計,僅用于填充服務(wù)分析多維數(shù)據(jù)集的關(guān)系型數(shù)據(jù)倉庫可能采用一個不同于分析員直接查詢的數(shù)據(jù)倉庫的分區(qū)結(jié)構(gòu)。帶有滾動窗口的系統(tǒng)必須按時間分區(qū),其他系統(tǒng)則不一定。
如果數(shù)據(jù)倉庫包括分析服務(wù)多維數(shù)據(jù)集,Microsoft 建議關(guān)系型數(shù)據(jù)倉庫和分析服務(wù)數(shù)據(jù)庫中的分區(qū)應(yīng)該為并行結(jié)構(gòu)。維護應(yīng)用程序被簡化了:應(yīng)用程序在關(guān)系型數(shù)據(jù)庫中創(chuàng)建新表的同時創(chuàng)建一個新多維數(shù)據(jù)集分區(qū)。管理員僅需要掌握一種分區(qū)策略。不過,一個應(yīng)用程序也可能有充分的理由對兩個數(shù)據(jù)庫以不同方式進行分區(qū),唯一降低的將是數(shù)據(jù)庫維護應(yīng)用程序的復(fù)雜性。
分區(qū)設(shè)計概述
SQL Server 數(shù)據(jù)庫中的分區(qū)表可以使用可更新或可查詢(不可更新)的分區(qū)視圖。在這兩種情況下,表分區(qū)都是由每個分區(qū)都包含正確數(shù)據(jù)的 CHECK 約束來創(chuàng)建的。一個可更新的分區(qū)視圖支持對視圖進行 INSERT (或 UPDATE 或 DELETE)操作,并將操作推入至正確的基礎(chǔ)表。這很有益處,但數(shù)據(jù)倉庫應(yīng)用程序通常需要進行批量加載,而這是無法通過視圖執(zhí)行的。下表總結(jié)了可更新和可查詢分區(qū)視圖的要求、優(yōu)點和缺點。
?
?
Microsoft 建議的做法是定義主鍵,并將事實表設(shè)計為本地(單個服務(wù)器上)的分區(qū)聯(lián)合視圖。大多數(shù)情況下,該定義會產(chǎn)生可更新的分區(qū)視圖,但數(shù)據(jù)倉庫維護應(yīng)用程序應(yīng)設(shè)計為直接將大多數(shù)數(shù)據(jù)批量加載至成員表(而不是通過視圖進行)。
語法示例:
以下代碼示例用來說明定義成員表和聯(lián)合視圖以及將數(shù)據(jù)插入視圖的語法:
創(chuàng)建 1999 年事實表:
CREATE TABLE [dbo].[sales_fact_19990101] (
[date_key] [int] NOT NULL
CHECK ([date_key] BETWEEN 19990101 AND 19991231),
[product_key] [int] NOT NULL ,
[customer_key] [int] NOT NULL ,
[promotion_key] [int] NOT NULL ,
[store_key] [int] NOT NULL ,
[store_sales] [money] NULL ,
[store_cost] [money] NULL ,
[unit_sales] [float] NULL
)
ALTER TABLE [sales_fact_19990101]
ADD PRIMARY KEY (
[date_key], [product_key], [customer_key], [promotion_key], [store_key])
創(chuàng)建 2000 年事實表:
CREATE TABLE [dbo].[sales_fact_20000101] (
[date_key] [int] NOT NULL
CHECK ([date_key] BETWEEN 20000101 AND 20001231),
[product_key] [int] NOT NULL ,
[customer_key] [int] NOT NULL ,
[promotion_key] [int] NOT NULL ,
[store_key] [int] NOT NULL ,
[store_sales] [money] NULL ,
[store_cost] [money] NULL ,
[unit_sales] [float] NULL
)
ALTER TABLE [sales_fact_20000101]
ADD PRIMARY KEY (
[date_key], [product_key], [customer_key], [promotion_key], [store_key])
創(chuàng)建 UNION ALL 視圖:
CREATE VIEW [dbo].[sales_fact]
AS
SELECT * FROM [dbo].[sales_fact_19990101]
UNION ALL
SELECT * FROM [dbo].[sales_fact_20000101]
現(xiàn)在插入幾行數(shù)據(jù),例如:
INSERT INTO [sales_fact]
VALUES (19990125, 347, 8901, 0, 13, 5.3100, 1.8585, 3.0)
INSERT INTO [sales_fact]
VALUES (19990324, 576, 7203, 0, 13, 2.1000, 0.9450, 3.0)
INSERT INTO [sales_fact]
VALUES (19990604, 139, 7203, 0, 13, 5.3700, 2.2017, 3.0)
INSERT INTO [sales_fact]
VALUES (20000914, 396, 8814, 0, 13, 6.4800, 2.0736, 2.0)
INSERT INTO [sales_fact]
VALUES (20001113, 260, 8269, 0, 13, 5.5200, 2.4840, 3.0)
要驗證分區(qū)是否正常工作,請使用查詢分析器來顯示查詢計劃,例如:
SELECT TOP 2 * FROM sales_fact WHERE date_key = 19990324
您應(yīng)該看到查詢計劃中僅包括表 1999。將該查詢計劃與主鍵已刪除的相同表生成的查詢計劃相比較,我們會發(fā)現(xiàn):表 2000 仍然被排除。將這些計劃與在已刪除 date_key 約束的架構(gòu)上生成的查詢計劃進行對比。這些約束被刪除的情況下,表 1999 和表 2000 都被包括在查詢中。
請注意,在通常情況下,在大型表上執(zhí)行查詢時,使用"TOP N"語法是好的做法,因為它可以迅速返回結(jié)果并使用最少的服務(wù)器資源。查看分區(qū)表的查詢計劃時,這一點尤為重要,因為由"SELECT *"語句生成的查詢計劃很難解析。對于偶爾進行觀察的人而言,盡管在查詢執(zhí)行期間,查詢中僅使用相關(guān)的表,但表面看起來好象查詢計劃包括了 UNION ALL 視圖的所有組件表。
將條件直接應(yīng)用于事實表:
要獲得最佳的查詢性能,所有的查詢都應(yīng)將條件直接放在事實表中的篩選鍵上。將約束放在第二張表(例如日期矢量表)的查詢將包括所有分區(qū)。對 UNION ALL 事實表的標(biāo)準(zhǔn)星號聯(lián)合查詢工作良好,將條件放在任意未分區(qū)的矢量表的屬性上,以標(biāo)準(zhǔn)方式創(chuàng)建星號查詢 WHERE 子句,包括分區(qū)矢量(日期)的屬性。
在分區(qū)矢量架構(gòu)上設(shè)計查詢與在未分區(qū)的架構(gòu)上設(shè)計完全一樣,只不過將日期條件直接放在事實表中的日期鍵上時日期條件最為有效。
如果每一分區(qū)表的索引中的第一個列為帶日期的簇索引,轉(zhuǎn)到所有分區(qū)解析某一特定查詢的開銷相對較小。編寫預(yù)定義的查詢時應(yīng)盡可能提高其效率,例如那些生成標(biāo)準(zhǔn)報表或漸變更新下行數(shù)據(jù)流數(shù)據(jù)庫的查詢。
分區(qū)鍵的選擇
事實表可以在多個矢量上進行分區(qū),但是大多數(shù)人可能僅按日期進行分區(qū)。如前面描述
關(guān)鍵詞標(biāo)簽:SQL Server 2000
相關(guān)閱讀
熱門文章 淺談JSP JDBC來連接SQL Server 2005的方法 SqlServer2005對現(xiàn)有數(shù)據(jù)進行分區(qū)具體步驟 sql server系統(tǒng)表損壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構(gòu)的關(guān)系
人氣排行 配置和注冊O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠程備份(還原)SQL2000數(shù)據(jù)庫 SQL2000數(shù)據(jù)庫遠程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級到2000的正確操作步驟 sql server系統(tǒng)表損壞的解決方法 淺談JSP JDBC來連接SQL Server 2005的方法