數據庫存儲大數據量(千萬條記錄級別)數據的考慮要點

分區
 將數據庫分區可提高其性能並易於維護。通過將一個大表拆分成更小的單個表,只訪問一小部分數據的查詢可以執行得更快,因爲需要掃描的數據較少。而且可以更快地執行維護任務(如重建索引或備份表)。

 實現分區操作時可以不拆分表,而將表物理地放置在個別的磁盤驅動器上。例如,將表放在某個物理驅動器上並將相關的表放在與之分離的驅動器上可提高查詢性能,因爲當執行涉及表之間聯接的查詢時,多個磁頭同時讀取數據。可以使用Microsoft® SQL Server™ 2000 文件組指定將表放置在哪些磁盤上。

 

 硬件分區
 硬件分區將數據庫設計爲利用可用的硬件構架。硬件分區的示例包括:

 允許多線程執行的多處理器,使得可以同時執行許多查詢。換句話說,在多處理器上可以同時執行查詢的各個組件,因此使單個查詢的速度更快。例如,查詢內引用的每個表可同時由不同的線程掃描。


 RAID(獨立磁盤冗餘陣列)設備允許數據在多個磁盤驅動器中條帶化,使更多的讀/寫磁頭同時讀取數據,因此可以更快地訪問數據。在多個驅動器中條帶化的表一般比存儲在一個驅動器上的相同的表掃描速度要快。換句話說,將表與相關的表分開存儲在不同的驅動器上可以顯著提高聯接那些表的查詢的性能。


 水平分區
 水平分區將一個表分段爲多個表,每個表包含相同數目的列和較少的行。例如,可以將一個包含十億行的表水平分區成12 個表,每個小表代表特定年份內一個月的數據。任何需要特定月份數據的查詢只引用相應月份的表。

 具體如何將表進行水平分區取決於如何分析數據。將表進行分區是爲了使查詢引用儘可能少的表。否則,查詢時須使用過多的UNION 查詢來邏輯合併表,而這會削弱查詢性能。有關查詢水平分區的表的更多信息,請參見視圖使用方案。

 常用的方法是根據時期/使用對數據進行水平分區。例如,一個表可能包含最近五年的數據,但是隻定期訪問本年度的數據。在這種情況下,可考慮將數據分區成五個表,每個表只包含一年的數據。

 

 垂直分區
 垂直分區將一個表分段爲多個表,每個表包含較少的列。垂直分區的兩種類型是規範化和行拆分。

 規範化是個標準數據庫進程,該進程從表中刪除冗餘列並將其放到次表中,次表按主鍵與外鍵的關係鏈接到主表。

 行拆分將原始表垂直分成多個只包含較少列的表。拆分的表內的每個邏輯行與其它表內的相同邏輯行匹配。例如,聯接每個拆分的表內的第十行將重新創建原始行。

 與水平分區一樣,垂直分區使查詢得以掃描較少的數據,因此提高查詢性能。例如有一個包含七列的表,通常只引用該表的前四列,那麼將該表的後三列拆分到一個單獨的表中可獲得性能收益。

 應謹慎考慮垂直分區操作,因爲分析多個分區內的數據需要有聯接表的查詢,而如果分區非常大將可能影響性能。


 請參見

 使用分區視圖

 

 

使用分區視圖
 分區視圖允許將大型表中的數據拆分成較小的成員表。根據其中一列中的數據值範圍,將數據在各個成員表之間進行分區。每個成員表的數據範圍都在爲分區列指定的CHECK 約束中定義。然後定義一個視圖,以使用 UNION ALL 將選定的成員表組合成單個結果集。引用該視圖的 SELECT語句爲分區列指定搜索條件後,查詢優化器將使用 CHECK 約束定義確定哪個成員表包含這些行。

 例如,記錄 1998 年銷售額的 sales 表分區成 12個成員表,每個月是一個成員表。每個成員表在 OrderMonth 列上都定義了約束:

 CREATE TABLE May1998Sales
    (OrderID   INT      PRIMARYKEY,
    CustomerID      INT         NOTNULL,
    OrderDate      DATETIME      NULL
       CHECK(DATEPART(yy, OrderDate) = 1998),
    OrderMonth      INT
       CHECK(OrderMonth = 5),
    DeliveryDate      DATETIME      NULL,
       CHECK(DATEPART(mm, OrderDate) = OrderMonth)
    )

 填充 May1998Sales 的應用程序必須確保所有行在 OrderMonth列中均爲 5,並且訂購日期指定 1998 年 5 月的某個日期。該表上定義的約束強制實現這一要求。

 然後定義一個視圖,以使用 UNION ALL 選定全部 12個成員表中的數據作爲單個結果集:

 CREATE VIEW Year1998Sales
 AS
 SELECT * FROM Jan1998Sales
 UNION ALL
 SELECT * FROM Feb1998Sales
 UNION ALL
 SELECT * FROM Mar1998Sales
 UNION ALL
 SELECT * FROM Apr1998Sales
 UNION ALL
 SELECT * FROM May1998Sales
 UNION ALL
 SELECT * FROM Jun1998Sales
 UNION ALL
 SELECT * FROM Jul1998Sales
 UNION ALL
 SELECT * FROM Aug1998Sales
 UNION ALL
 SELECT * FROM Sep1998Sales
 UNION ALL
 SELECT * FROM Oct1998Sales
 UNION ALL
 SELECT * FROM Nov1998Sales
 UNION ALL
 SELECT * FROM Dec1998Sales

 例如,下面的 SELECT 語句查詢特定月的信息。

 SELECT *
 FROM Year1998Sales
 WHERE OrderMonth IN (5,6) AND CustomerID =64892

 SQL Server 查詢優化器識別出此 SELECT 語句中的搜索條件只引用May1998Sales 和 Jun1998Sales 表中的行,從而將其搜索範圍限制在這些表上。

 分區視圖返回正確的結果並不一定非要 CHECK 約束。但是,如果未定義 CHECK約束,則查詢優化器必須搜索所有表,而不是隻搜索符合分區列上的搜索條件的表。如果不使用 CHECK 約束,則視圖的操作方式與帶有UNION ALL 的任何其它視圖相同。查詢優化器不能對存儲在不同表中的值作出任何假設,也不能跳過對參與視圖定義的表的搜索。

 如果分區視圖所引用的所有成員表都在同一服務器上,則該視圖是本地分區視圖。如果成員表在多臺服務器上,則該視圖是分佈式分區視圖。分佈式分區視圖可用於在一組服務器間分佈系統的數據庫處理工作量。

 分區視圖使獨立地維護成員表變得更容易。例如,在某個階段結束時:

 可以更改當前結果的分區視圖定義以添加最新的階段和除去最早的階段。


 可以更改以前結果的分區視圖定義以添加剛從當前結果視圖中除去的階段。也可以更新以前的結果視圖以刪除或存檔該視圖所包含的最早階段。
 將數據插入到分區視圖中後,就可以使用 sp_executesql 系統存儲過程創建INSERT 語句,該語句帶有在有許多併發用戶的系統中重新使用機率較高的執行計劃。

 

創建分區視圖
 分區視圖在一個或多個服務器間水平連接一組成員表中的分區數據,使數據看起來就象來自一個表。Microsoft®SQL Server™ 2000區分本地分區視圖和分佈式分區視圖。在本地分區視圖中,所有的參與表和視圖駐留在同一個 SQL Server實例上。在分佈式分區視圖中,至少有一個參與表駐留在不同的(遠程)服務器上。此外,SQL Server 2000還區分可更新的分區視圖和作爲基礎表只讀複本的視圖。

 分佈式分區視圖可用於實現數據庫服務器聯合體。聯合體是一組分開管理的服務器,但它們相互協作分擔系統的處理負荷。這種通過分區數據形成數據庫服務器聯合體的機制使您能夠擴大一組服務器,以支持大型的多層Web 站點的處理需要。有關更多信息,請參見設計聯合數據庫服務器。

 在實現分區視圖之前,必須先水平分區表。原始表被分成若干個較小的成員表。每個成員表包含與原始表相同數量的列,並且每一列具有與原始表中的相應列同樣的特性(如數據類型、大小、排序規則)。如果正在創建分佈式分區視圖,則每個成員表分別位於不同的成員服務器上。爲了獲得最大程度的位置透明度,各個成員服務器上的成員數據庫的名稱應當是相同的,但不要求非這樣。例如:Server1.CustomerDB、Server2.CustomerDB、Server3.CustomerDB。

 成員表設計好後,每個表基於鍵值的範圍存儲原始表的一塊水平區域。鍵值範圍基於分區列中的數據值。每一成員表中的值範圍通過分區列上的CHECK 約束強制,並且範圍之間不能重疊。例如,不能使一個表的值範圍從 1 到 200000,而另一個表的值範圍從 150000 到300000,因爲這樣將不清楚哪個表包含 150000 與 200000 之間的值。

 例如,正在將一個 Customer 表分區成三個表。這些表的 CHECK約束爲:

 -- On Server1:
 CREATE TABLE Customer_33
   (CustomerID   INTEGERPRIMARY KEY
                 CHECK(CustomerID BETWEEN 1 AND 32999),
   ...-- Additional column definitions)

 -- On Server2:
 CREATE TABLE Customer_66
   (CustomerID   INTEGERPRIMARY KEY
                 CHECK(CustomerID BETWEEN 33000 AND 65999),
   ...-- Additional column definitions)

 -- On Server3:
 CREATE TABLE Customer_99
   (CustomerID   INTEGERPRIMARY KEY
                 CHECK(CustomerID BETWEEN 66000 AND 99999),
   ...-- Additional column definitions)

 在創建成員表後,在每個成員服務器上定義一個分佈式分區視圖,並且每個視圖具有相同的名稱。這樣,引用分佈式分區視圖名的查詢可以在任何一個成員服務器上運行。系統操作如同每個成員服務器上都有一個原始表的複本一樣,但其實每個服務器上只有一個成員表和一個分佈式分區視圖。數據的位置對應用程序是透明的。

 生成分佈式分區視圖的方式如下:

 在每一個含有在其它成員服務器上執行分佈式查詢所需連接信息的成員服務器上添加鏈接服務器定義。這將使得分佈式分區視圖能夠訪問其它服務器上的數據。


 對於在分佈式分區視圖中使用的每個鏈接服務器定義,使用 sp_serveroption設置 lazy schema validation選項。這確保了只有在實際需要遠程成員表的數據時,查詢處理器才請求任何鏈接表的元數據,從而使性能得到優化。


 在每個成員服務器上創建分佈式分區視圖。這些視圖使用分佈式 SELECT語句訪問鏈接成員服務器上的數據,並將分佈式行與本地成員表的行合併。
 若要爲上一個示例創建分佈式分區視圖,應當:

 爲 Server2 添加一個名爲 Server2的、帶有連接信息的鏈接服務器定義,並添加一個名爲 Server3 的鏈接服務器定義以訪問 Server3。


 創建以下分佈式分區視圖:
 CREATE VIEW Customers AS
    SELECT* FROM CompanyDatabase.TableOwner.Customers_33
 UNION ALL
    SELECT* FROM Server2.CompanyDatabase.TableOwner.Customers_66
 UNION ALL
    SELECT* FROM Server3.CompanyDatabase.TableOwner.Customers_99

 在 Server2 和 Server3 上執行相同的步驟。
 可更新的分區視圖
 如果本地或分佈式分區視圖爲不可更新的,則它只能作爲原始表的只讀複本。可更新的分區視圖可展示出原始表的所有功能。

 在下列情況中,視圖被視爲可更新的分區視圖:

 視圖是一組 SELECT 語句,這些語句的結果集通過 UNION ALL語句組合爲一個結果集。每個 SELECT 語句引用一個 SQL Server 基表。該表可以是本地表,也可以是使用 4部分名稱、OPENROWSET 函數或 OPENDATASOURCE 函數引用的鏈接表(不能使用 OPENDATASOURCE 或OPENROWSET 函數指定直接傳遞式查詢)。
 表規則
 成員表在視圖定義中的每個 SELECT 語句的 FROM子句中定義。每個成員表都必須遵守如下規則:

 在視圖中每個成員表只能引用一次。


 成員表不能有任何計算列上創建的索引。


 成員表在數目相同的列上應具有所有 PRIMARY KEY 約束。


 成員表必須有相同的 ANSI 填充設置。有關 ANSI 填充設置的更多信息,請參見SET ANSI_PADDING。
 列規則
 列在視圖定義中的每個 SELECT語句的選擇列表中定義。列必須遵守如下規則。

 每個成員表中的所有列必須包含在選擇列表中。


 在選擇列表中不能多次使用同一列。


 在選擇列表中對列的引用不能多於一次。


 列必須位於選擇列表中的相同序號位置處。


 每個 SELECT語句的選擇列表中的列必須是同一類型(包括數據類型、精度、小數位數和排序規則)。例如,以下視圖定義失敗,這是因爲兩個 SELECT語句中首列的數據類型不同:
 CREATE VIEW NonUpdatable
 AS
 SELECT IntPrimaryKey, IntPartNmbr
 FROM FirstTable
   UNIONALL
 SELECT NumericPrimaryKey,IntPartNmbr
 FROM SecondTable

 分區列規則
 分區列存在於每個成員表上,並且通過 CHECK約束標識特定表中的可用數據。分區列必須遵守如下規則:

 每個基表都擁有鍵值由 CHECK 約束所強制的分區列。每個表的 CHECK約束的鍵範圍與其它任何表互不重疊。任何分區列的給定值必須只能映射到一個表。CHECK約束只能使用以下運算符:BETWEEN、AND、OR、<、<=、>、>=、=。


 在視圖中,分區列必須位於每個 SELECT語句的選擇列表中相同的序號位置處。例如,分區列要麼總是每個選擇列表中的首列,要麼總是每個選擇列表中的第二列,依次類推。


 分區列不允許爲空。


 分區列必須是表的主鍵的一部分。


 分區列不能是計算列。


 在分區列上必須僅有一個約束。如果有多於一個的約束,SQL Server會忽略所有的約束並在確定視圖是否爲分區視圖時不考慮這些約束。
 滿足所有上述規則的分區列將支持 SQL Server 2000查詢優化器支持的所有優化。有關更多信息,請參見解析分佈式分區視圖。

 數據修改規則
 除了爲可更新的分區視圖定義的規則外,引用該視圖的數據修改語句還必須遵守爲INSERT、UPDATE 和 DELETE 語句定義的規則。

 

 說明  只有在安裝了Microsoft SQL Server 2000 企業版或 Microsoft SQL Server 2000開發版時,纔可通過分區視圖修改數據。


 INSERT 語句
 INSERT 語句通過分區視圖將數據添加到成員表中。INSERT語句必須遵守下列規則:

 所有列必須包含在 INSERT 語句中,即使基表中的列可能爲 NULL或在基表中定義了 DEFAULT 約束。


 不能在 INSERT 語句的 VALUES 子句中指定 DEFAULT關鍵字。


 INSERT 語句提供的值必須符合在一個成員表的分區列上定義的 CHECK約束邏輯。


 如果一個成員表包含具有標識屬性的列,則不能使用 INSERT 語句。


 如果一個成員表包含 timestamp 列,則不能使用 INSERT 語句。


 如果存在具有同一視圖或任一成員表的自聯接,則不能使用 INSERT語句。
 UPDATE 語句
 UPDATE 語句通過分區視圖在一個或多個成員表中修改數據。UPDATE語句必須遵守下列規則:

 UPDATE 語句不能在 SET 子句中將 DEFAULT關鍵字指定爲值,即使列在相應的成員表中定義了 DEFAULT 值。


 不能更改具有標識屬性的列的值;不過可以更新其它列。


 如果列中包含 text、image 或 ntext 數據,則不能更改 PRIMARYKEY 的值。


 如果基表中包含 timestamp 列,則不能進行更新。


 如果存在具有同一視圖或成員表的自聯接,則不能進行更新。


 不能在 UPDATE 語句的 SET 子句中指定 DEFAULT關鍵字。
 DELETE 語句
 DELETE 語句通過分區視圖在一個或多個成員表中刪除數據。DELETE語句必須遵守如下規則:

 如果存在具有同一視圖或任一成員表的自聯接,則不能使用 DELETE語句。
 分佈式分區視圖規則
 除了爲分區視圖定義的規則外,分佈式(遠程)分區視圖還有下列附加條件:

 將啓動分佈式事務以確保更新所影響的所有節點間的原子性。


 XACT_ABORT SET 選項必須設置爲 ON。


 遠程表中的 smallmoney 和 smalldatetime 列分別映射爲money 和 datetime。因此,本地表中的相應列也應爲 money 和 datetime。


 任何鏈接服務器都不能是環回鏈接服務器,即指向同一 SQL Server實例的鏈接服務器。
 如果視圖中含有 INSTEAD OF觸發器,則不遵循上述規則而引用分區表的視圖可能仍然是可更新的。但是,查詢優化器不能總能夠爲含有 INSTEAD OF觸發器的視圖生成和遵循所有上述規則的分區視圖一樣有效的執行計劃。


幾乎可以按天分表,然後使用視圖連接起來,查詢分爲三種,當天查詢,所有數據查詢,歷史數據查詢

這麼龐大的數據量建議使用oracle、db2這樣的數據庫
oracle裏面額可以做表分區,速度快很多

發佈了21 篇原創文章 · 獲贊 48 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章