SQL Server 2000 數(shù)據(jù)倉(cāng)庫(kù)中使用分區(qū)之分區(qū)設(shè)計(jì)
今天我們向大家講述的是SQL Server 2000 數(shù)據(jù)倉(cāng)庫(kù)中使用分區(qū)之分區(qū)設(shè)計(jì)的簡(jiǎn)捷概述,SQL Server 數(shù)據(jù)庫(kù)中的分區(qū)表主其可以使用可更新或者是可查詢(xún)(不可更新)的分區(qū)視圖。在這兩種情況下,表分區(qū)都是由每個(gè)分區(qū)都包含正確數(shù)據(jù)的 CHECK 約束來(lái)創(chuàng)建的。
一個(gè)可更新的分區(qū)視圖支持對(duì)視圖進(jìn)行 INSERT (或 UPDATE 或 DELETE)操作,并將操作推入至正確的基礎(chǔ)表。這很有益處,但SQL Server 2000 數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用程序通常需要進(jìn)行批量加載,而這是無(wú)法通過(guò)視圖執(zhí)行的。下表總結(jié)了可更新和可查詢(xún)分區(qū)視圖的要求、優(yōu)點(diǎn)和缺點(diǎn)。
Microsoft 建議的做法是定義主鍵,并將事實(shí)表設(shè)計(jì)為本地(單個(gè)服務(wù)器上)的分區(qū)聯(lián)合視圖。大多數(shù)情況下,該定義會(huì)產(chǎn)生可更新的分區(qū)視圖,但SQL Server 2000 數(shù)據(jù)倉(cāng)庫(kù)維護(hù)應(yīng)用程序應(yīng)設(shè)計(jì)為直接將大多數(shù)數(shù)據(jù)批量加載至成員表(而不是通過(guò)視圖進(jìn)行)。
語(yǔ)法示例:
以下代碼示例用來(lái)說(shuō)明定義成員表和聯(lián)合視圖以及將數(shù)據(jù)插入視圖的語(yǔ)法:
創(chuàng)建 1999 年事實(shí)表:
- 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 年事實(shí)表:
- 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)
要驗(yàn)證分區(qū)是否正常工作,請(qǐng)使用查詢(xún)分析器來(lái)顯示查詢(xún)計(jì)劃,例如:
- SELECT TOP 2 * FROM sales_fact WHERE date_key = 19990324
您應(yīng)該看到查詢(xún)計(jì)劃中僅包括表 1999。將該查詢(xún)計(jì)劃與主鍵已刪除的相同表生成的查詢(xún)計(jì)劃相比較,我們會(huì)發(fā)現(xiàn):表 2000 仍然被排除。將這些計(jì)劃與在已刪除 date_key 約束的架構(gòu)上生成的查詢(xún)計(jì)劃進(jìn)行對(duì)比。這些約束被刪除的情況下,表 1999 和表 2000 都被包括在查詢(xún)中。
請(qǐng)注意,在通常情況下,在大型表上執(zhí)行查詢(xún)時(shí),使用“TOP N”語(yǔ)法是好的做法,因?yàn)樗梢匝杆俜祷亟Y(jié)果并使用最少的服務(wù)器資源。查看分區(qū)表的查詢(xún)計(jì)劃時(shí),這一點(diǎn)尤為重要,因?yàn)橛伞癝ELECT *”語(yǔ)句生成的查詢(xún)計(jì)劃很難解析。對(duì)于偶爾進(jìn)行觀察的人而言,盡管在查詢(xún)執(zhí)行期間,查詢(xún)中僅使用相關(guān)的表,但表面看起來(lái)好象查詢(xún)計(jì)劃包括了 UNION ALL 視圖的所有組件表。
將條件直接應(yīng)用于事實(shí)表:
要獲得***的查詢(xún)性能,所有的查詢(xún)都應(yīng)將條件直接放在事實(shí)表中的篩選鍵上。將約束放在第二張表(例如日期矢量表)的查詢(xún)將包括所有分區(qū)。對(duì) UNION ALL 事實(shí)表的標(biāo)準(zhǔn)星號(hào)聯(lián)合查詢(xún)工作良好,將條件放在任意未分區(qū)的矢量表的屬性上,以標(biāo)準(zhǔn)方式創(chuàng)建星號(hào)查詢(xún) WHERE 子句,包括分區(qū)矢量(日期)的屬性。
在分區(qū)矢量架構(gòu)上設(shè)計(jì)查詢(xún)與在未分區(qū)的架構(gòu)上設(shè)計(jì)完全一樣,只不過(guò)將日期條件直接放在事實(shí)表中的日期鍵上時(shí)日期條件最為有效。
如果每一分區(qū)表的索引中的***個(gè)列為帶日期的簇索引,轉(zhuǎn)到所有分區(qū)解析某一特定查詢(xún)的開(kāi)銷(xiāo)相對(duì)較小。編寫(xiě)預(yù)定義的查詢(xún)時(shí)應(yīng)盡可能提高其效率,例如那些生成標(biāo)準(zhǔn)報(bào)表或漸變更新下行數(shù)據(jù)流數(shù)據(jù)庫(kù)的查詢(xún)。 以上的相關(guān)內(nèi)容就是對(duì)在SQL Server 2000 數(shù)據(jù)倉(cāng)庫(kù)中使用分區(qū)之分區(qū)設(shè)計(jì)概述 的介紹,望你能有所收獲。
【編輯推薦】