建立資料分割資料表及索引

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

您可以使用 SQL Server Management Studio 或 Transact-SQL,在 SQL Server、Azure SQL Database 和 Azure SQL 受控執行個體中建立分割資料表或索引。 分割資料表及索引中的資料會被水平分割成單元,可散佈在資料庫中的多個檔案群組中,或儲存在單一檔案群組中。 分割作業可讓大型資料表和索引更容易管理及擴充。

分割資料表或索引的建立過程通常分為三或四個部分:

  1. 選擇性建立一個或多個檔案群組和對應的資料檔案,它們將存放分割配置所指定的分割。 將分割放在多個檔案群組的主要原因是為了確保您可以獨立對檔案群組執行備份和還原作業。 如果不需要,您可以選擇使用現有的檔案群組,例如 PRIMARY,或具有相關資料檔案的新檔案群組,將所有分割指派給單一檔案群組。 在幾乎所有案例中,無論您是否使用多個檔案群組,您都會實現所有分割的優點

  2. 建立資料分割函數,此函數根據指定之資料行的各個值,將資料表或索引的資料列對應到分割中。 您可以使用單一資料分割函數來分割多個物件。

  3. 建立資料分割配置,將分割資料表或索引的分割對應至一或多個檔案群組。 您可以使用單一資料分割配置來分割多個物件。

  4. 建立或改變資料表或索引,並將資料分割配置指定為儲存位置,以及作為分割資料行的資料行。

注意

Azure SQL Database 完全支援資料分割功能。 由於 PRIMARYAzure SQL Database 僅支援檔案群組,因此所有分割區都必須放在PRIMARY檔案群組。

也可以在 Azure Synapse Analytics 的專用 SQL 集區中分割資料表,但語法會有一些差異。 深入了解對專用 SQL 集區的資料分割資料表

權限

建立分割區資料表,需要資料庫中的 CREATE TABLE 權限及建立資料表的結構描述之 ALTER 權限。 建立分割區索引,需要建立索引的資料表或檢視的 ALTER 權限。 建立分割區資料表或索引,還需要下列任何一個附加權限:

  • ALTER ANY DATASPACE 權限。 這個權限預設會授與 sysadmin 固定伺服器角色以及 db_ownerdb_ddladmin 固定資料庫角色的成員。

  • 建立分割區函數和分割區配置之資料庫的 CONTROL 或 ALTER 權限。

  • 建立分割區函數和分割區配置之資料庫伺服器的 CONTROL SERVER 或 ALTER ANY DATABASE 權限。

使用 Transact-SQL 在一個檔案群組上建立資料分割資料表

如果您不需要在檔案群組上獨立執行備份和還原作業,使用單一檔案群組分割資料表可簡化一段時間的資料分割資料表管理。

此範例適用於不支援新增檔案和檔案群組的 Azure SQL Database。 Azure SQL Database 支援資料表分割,方法是在 PRIMARY 檔案群組中建立分割。 針對 SQL Server 和 Azure SQL 受控執行個體,您可能會想要視檔案群組和檔案管理做法而定,指定使用者建立的檔案群組。

此範例會逐步說明如何使用 Transact-SQL 在 SQL Server Management Studio (SSMS) 中建立資料分割資料表,並將所有分割指派給 PRIMARY 檔案群組。 範例:

  • 使用 datetime2 資料類型,以三個界限值建立名為 myRangePF1RANGE RIGHT 資料分割函數。 三個界限值會導致具有四個分割的資料分割資料表。
  • 建立名為 myRangePS1 的資料分割配置,此配置會使用 ALL TO 語法將 myRangePF1 資料分割函數中的所有分割指派給 PRIMARY 檔案群組。
  • myRangePS1 資料分割配置上建立名為 PartitionTable 的資料表,並將名為 col1 的資料行指定為分割資料行。
  1. 在物件總管中,連線到資料庫引擎的執行個體。

  2. 在標準列上,選取 [新增查詢] 。

  3. 複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。 此範例會建立資料分割函數和資料分割配置。 新資料表是以指定為儲存位置的分割區配置建立的。

CREATE PARTITION FUNCTION myRangePF1 (datetime2(0))  
    AS RANGE RIGHT FOR VALUES ('2022-04-01', '2022-05-01', '2022-06-01') ;  
GO  

CREATE PARTITION SCHEME myRangePS1  
    AS PARTITION myRangePF1  
    ALL TO ('PRIMARY') ;  
GO  

CREATE TABLE dbo.PartitionTable (col1 datetime2(0) PRIMARY KEY, col2 char(10))  
    ON myRangePS1 (col1) ;  
GO

使用 Transact-SQL 在多個檔案群組上建立資料分割資料表

遵循本節中的步驟,在 SSMS 中使用 Transact-SQL 建立一或多個檔案群組、對應的檔案和資料分割資料表。

SQL Server 和 Azure SQL 受控執行個體都支援建立檔案群組和檔案。 Azure SQL 受控執行個體會自動設定新增之所有資料庫檔案的路徑,因此 Azure SQL 受控執行個體中的 ALTER DATABASE ADD FILE 命令不允許 FILENAME 參數。 Azure SQL Database 僅支援在 PRIMARY 檔案群組中建立資料分割資料表。 您可以在使用 Transact-SQL 在一個檔案群組上建立資料分割資料表中尋找 Azure SQL Database 的範例程式碼。

針對空的資料庫執行下列範例。 範例:

  • 將四個新的檔案群組新增至資料庫。
  • 將一個檔案新增至每個檔案群組。
  • 建立名為 myRangePF1RANGE RIGHT 資料分割函數,其具有三個界限值,將資料表分割成四個分割區。
  • 建立名為 myRangePS1 的資料分割配置,此配置會將 myRangePF1 套用至四個新的檔案群組。
  • 建立名為 PartitionTable 的資料分割資料表,該資料表會使用 myRangePS1 分割 col1
  1. 在物件總管中,連線到資料庫引擎的執行個體。

  2. 在 [標準] 工具列上,選取 [新增查詢]。

  3. 此範例會建立新的資料庫並加以使用。 接著範例會建立新的檔案群組、資料分割函數和資料分割配置。 新資料表是以指定為儲存位置的分割區配置建立的。 將下列範例複製並貼入查詢視窗中。

    如果您使用受控執行個體,請從 ALTER DATABASE ADD FILE 命令中移除 FILENAME 參數和相關聯的值。 受控執行個體會自動為您決定檔案路徑。

    如果您使用 SQL Server 執行個體,請將 FILENAME 參數的值自訂為適合執行個體的位置。

    如果您想要使用現有的資料庫,請移除 CREATE DATABASE 命令,並將 USE 陳述式變更為適當的資料庫名稱。

    選取 [執行]。

    CREATE DATABASE PartitionTest;
    GO
    
    USE PartitionTest;
    GO
    
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test1fg;  
    GO  
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test2fg;  
    GO  
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test3fg;  
    GO  
    ALTER DATABASE PartitionTest  
    ADD FILEGROUP test4fg;   
    
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest1,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest1.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test1fg;  
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest2,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest2.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test2fg;  
    GO  
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest3,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest3.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test3fg;  
    GO  
    ALTER DATABASE PartitionTest   
    ADD FILE   
    (  
        NAME = partitiontest4,  
        FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\partitiontest4.ndf',  
        SIZE = 5MB,  
        FILEGROWTH = 5MB  
    )  
    TO FILEGROUP test4fg;  
    GO  
    
    CREATE PARTITION FUNCTION myRangePF1 (datetime2(0))  
        AS RANGE RIGHT FOR VALUES ('2022-04-01', '2022-05-01', '2022-06-01') ;  
    GO  
    
    CREATE PARTITION SCHEME myRangePS1  
        AS PARTITION myRangePF1  
        TO (test1fg, test2fg, test3fg, test4fg) ;  
    GO  
    
    CREATE TABLE PartitionTable (col1 datetime2(0) PRIMARY KEY, col2 char(10))  
        ON myRangePS1 (col1) ;  
    GO  
    

使用 SSMS 分割資料表

遵循本節中的步驟,選擇性地建立檔案群組和對應的檔案,然後使用 SQL Server Management Studio (SSMS) 中的建立分割區精靈來建立資料分割資料表或分割現有的資料表。 SSMS 中提供適用於 SQL Server 和 Azure SQL 受控執行個體的建立分割區精靈。 針對 Azure SQL Database,請參閱使用 Transact-SQL 在一個檔案群組上建立資料分割資料表

建立新的檔案群組 (選擇性)

如果您想要將資料分割資料表放在一或多個新的檔案群組上,請遵循本節中的步驟。 SQL Server 和 Azure SQL 受控執行個體都支援建立檔案群組和檔案。 針對 Azure SQL 受控執行個體,系統會自動為您設定任何已建立檔案的路徑。

  1. 在物件總管中,以滑鼠右鍵按一下要建立分割區資料表的資料庫,然後選取 [屬性]

  2. 在 [資料庫屬性 - database_name] 對話方塊的 [選取頁面] 底下,選取 [檔案群組]

  3. 在 [資料列] 底下,選取 [新增]。 在新資料列中,輸入檔案群組名稱。

    警告

    建立分割區時,如果要指定多個檔案群組,除了針對界限值指定的檔案群組數目以外,一律要一個額外的檔案群組。

  4. 繼續加入資料列,直到為資料分割資料表或資料表建立所有的檔案群組。

  5. 選取 [確定]。

  6. [選取頁面]底下,選取 [檔案]

  7. 在 [資料列] 底下,選取 [新增]。 在新資料列中,輸入檔案名稱並選取檔案群組。

  8. 繼續加入資料列,直到為每個檔案群組建立至少一個檔案。

建立資料分割資料表

  1. 選擇性展開 [資料表] 資料夾,像平常一樣地建立資料表。 如需詳細資訊,請參閱建立資料表 (資料庫引擎)。 或者,您可以在下一步中指定現有的資料表。

  2. 以滑鼠右鍵按一下要分割的資料表,指向 [儲存體],然後選取 [建立分割區...]。

  3. 建立分割區精靈的 [歡迎使用建立分割區精靈] 頁面上,選取 [下一步]。

  4. [選取分割資料行] 頁面的 [可用的分割資料行] 方格中,選取要用來分割資料表的資料行。 只有包含可用來分割資料之資料類型的資料行才會顯示在 [可用的分割資料行] 方格中。 如果您選取了某個計算資料行當做分割資料行,就必須將此資料行建立為保存的資料行。

    您對分割資料行和值範圍擁有的選擇主要是由資料可以按邏輯方式分組到什麼程度所決定。 例如,您可能會選擇依據每年的月份或季度,將資料分成邏輯群組。 您打算針對資料進行的查詢將會決定這個邏輯群組是否足夠用於管理資料表分割區。 除了 textntextimagexmltimestampvarchar(max)nvarchar(max)varbinary(max)、別名資料類型或 CLR 使用者自訂資料類型,所有資料類型都能有效用在分割資料行上。

    在此頁面上可以使用下列其他選項:

    共置此資料表至選取的分割區資料表
    可讓您選取分割區資料表,其中包含要在此分割資料行上與這個資料表聯結的相關資料。 在分割資料行上聯結分割區的資料表通常會讓查詢更有效率。

    使用索引的分割區資料行讓非唯一索引和唯一索引進行儲存體對齊
    讓使用相同分割區配置進行分割區的所有資料表索引對齊。 當資料表及其索引對齊時,您就可以更有效率地將分割區移入和移出分割區資料表,因為資料是以相同方式進行分割。

    選取分割資料行和任何其他選項之後,請選取 [下一步]。

  5. 在 [選取資料分割函數] 頁面,選取 [選取資料分割函數] 底下的 [新的資料分割函數] 或 [現有的資料分割函數]。 如果您選擇 [新的分割區函數],請輸入函數的名稱。 如果您選擇 [現有的分割區函數],請從清單中選取要使用的函數名稱。 如果資料庫上沒有其他分割區函數, [現有的分割區函數] 選項就無法使用。

    在完成此頁面之後,請選取 [下一步]。

  6. 在 [選取資料分割配置] 頁面,選取 [選取資料分割配置] 底下的 [新的資料分割配置] 或 [現有的資料分割配置]。 如果您選擇 [新的分割區配置],請輸入配置的名稱。 如果您選擇 [現有的分割區配置],請從清單中選取要使用的配置名稱。 如果資料庫上沒有其他分割區配置, [現有的分割區配置] 選項就無法使用。

    在完成此頁面之後,請選取 [下一步]。

  7. 在 [對應分割區] 頁面的 [範圍] 底下,選取 [左界限] 或 [右界限]。 左界限會指定分割區中將包含最高的界限值。 右界限會指定每個分割區中將包含最低的界限值。 深入了解資料分割函數中的右和左範圍。

    指定多個界限點時,除了將界限值指派給檔案群組的資料列之外,您一律必須輸入一個額外的資料列。

    [選取檔案群組並指定界限值] 方格中的 [檔案群組]底下,選取要用於分割資料的檔案群組。 在 [界限]下方,輸入每個檔案群組的界限值。 如果您想要將多個或所有分割區指派給相同的檔案群組,請為每個資料列選取相同的檔案群組名稱。 如果您在單一資料列上選取檔案群組且界限值保持空白,資料分割函數會使用資料分割函數名稱,將整份資料表或索引對應到單一分割區。

    在此頁面上可以使用下列其他選項:

    設定界限…
    開啟 [設定界限值] 對話方塊,即可選取您想要用於分割區的界限值和日期範圍。 只有當您選取了包含下列其中一種資料類型的分割資料行時,才能使用這個選項: datedatetimesmalldatetimedatetime2datetimeoffset

    估計儲存體
    針對指定給分割區的每個檔案群組估計儲存體的列數、需要空間和可用空間。 這些值都會在方格中顯示成唯讀值。

    [設定界限值] 對話方塊允許下列其他選項:

    開始日期
    針對分割區的範圍值選取開始日期。

    結束日期
    針對分割區的範圍值選取結束日期。 如果您在 [對應分割區] 頁面上選取 [左界限],這個日期就會成為每個檔案群組/分割區的最後一個值。 如果您在 [對應分割區] 頁面上選取 [右界限],這個日期就會成為倒數第二個檔案群組的第一個值。

    日期範圍
    針對每個分割區選取您想要的日期資料粒度或範圍值遞增。

    在完成此頁面之後,請選取 [下一步]。

  8. [選取輸出選項] 頁面上,指定要如何完成分割區資料表。 選取 [建立指令碼] ,根據精靈中先前的步驟建立 SQL 指令碼。 選取 [立即執行] ,在完成精靈中的其餘所有頁面後建立新的分割區資料表。 選取 [排程] ,在預先定義的未來日期建立新的分割區資料表。

    如果您選取 [建立指令碼] ,在 [指令碼選項] 底下可以使用下列選項:

    編寫指令碼至檔案
    產生指令碼做為 .sql 檔案。 在 [檔案名稱] 方塊中輸入檔案名稱和位置,或選取 [瀏覽] 以開啟 [指令檔位置] 對話方塊。 從 [另存新檔] ,選取 [Unicode 文字][ANSI 文字]

    編寫指令碼至剪貼簿
    將指令碼儲存至剪貼簿。

    編寫指令碼至新增查詢視窗
    產生指令碼至新的 [查詢編輯器] 視窗。 這是預設選項。

    如果你選取 [排程],請選取 [變更排程]。

    1. 在 [新增作業排程] 對話方塊的 [名稱] 方塊中,輸入作業排程的名稱。

    2. [排程類型] 清單,選取排程類型:

      • 當 SQL Server Agent 啟動時自動啟動

      • 只要 CPU 閒置就啟動

      • 重複執行: 如果你的新資料分割資料表會使用新資訊定期更新,則請選取此選項。

      • 執行一次: 這是預設選項。

    3. 選取或清除 [已停用] 核取方塊,以啟用或停用排程。

    4. 如果您選取 [重複執行]

      1. [頻率] 底下的 [發生於] 清單中,指定發生頻率:

        • 如果您選取 [每天] ,在 [重複頻率] 方塊中,輸入幾天重複一次作業排程的頻率。

        • 如果您選取 [每週] ,在 [重複頻率] 方塊中,輸入幾週重複一次作業排程的頻率。 選取一週中執行作業排程是在星期幾。

        • 如果您選取 [每月] ,可以選取 [天][於]

          • 如果您選取 [天] ,請輸入執行作業排程的當月日期以及幾個月重複一次作業排程的頻率。 例如,若要在每兩個月的 15 日執行一次作業排程,請選取 [日],然後在第一個方塊中輸入 "15",並在第二個方塊中輸入 "2"。 第二個方塊允許輸入的最大數目是「99」。

          • 如果您選取 [於] ,請選取執行作業排程的當月一週中特定的星期幾,以及幾個月重複一次作業排程的頻率。 例如,若要在每兩個月的最後一個工作日執行一次作業排程,請選取 [日],然後從第一個清單中選取 [最後一個],並從第二個清單中選取 [工作日],然後在最後一個方塊中輸入 "2"。 您也可以在前兩個清單中選取 [第一個]、[第二個]、[第三個] 或 [第四個],以及特定工作日 (例如:星期日或星期三)。 最後一個方塊允許輸入的最大數目是「99」。

      2. [每日頻率] 底下,指定在執行作業排程當天重複作業排程的頻率:

        • 如果您選取 [執行一次於] ,請在 [執行一次於] 方塊中輸入執行作業排程的當天特定時間。 輸入時、分鐘和秒的時間,以及上午或下午。

        • 如果您選取 [重複執行於每] ,請在 [頻率] 底下指定在所選當天執行作業排程的頻率。 例如,若要在執行作業排程的當天每 2 個小時重複一次作業排程,請選取 [發生間隔],在第一個方塊中輸入 "2",然後從清單中選取 [小時]。 您也可以從這個清單中選取 [分鐘] 和 [秒]。 第一個方塊允許輸入的最大數目是「100」。

          [開始時間] 方塊中,輸入作業排程應該開始執行的時間。 在 [結束時間] 方塊中,輸入作業排程應該停止重複的時間。 輸入時、分鐘和秒的時間,以及上午或下午。

      3. [持續時間] 底下的 [開始日期] ,輸入您希望作業排程開始執行的日期。 選取 [結束日期][沒有結束日期] ,以指示作業排程應該停止執行的日期。 如果您選取 [結束日期] ,請輸入您希望作業排程停止執行的日期。

    5. 如果您選取 [執行一次],請在 [僅執行一次於] 底下的 [日期] 方塊中,輸入將要執行作業排程的日期。 在 [時間] 方塊中,輸入將要執行作業排程的時間。 輸入時、分鐘和秒的時間,以及上午或下午。

    6. [摘要] 底下的 [描述] ,確認所有作業排程設定是否都正確。

    7. 選取 [確定]。

    在完成此頁面之後,請選取 [下一步]。

  9. [檢閱摘要] 頁面上,展開 [檢閱您的選擇]底下的所有可用選項,確認所有分割區設定是否都正確。 如果一切如預期,請選取 [完成]。

  10. [建立分割區精靈進度] 頁面上,監視 [建立分割區精靈] 動作的狀態資訊。 根據您在精靈中選取的選項,[進度] 頁面可能會包含一個或多個動作。 頂端的方塊會顯示精靈的整體狀態以及精靈已接收的狀態、錯誤和警告訊息數。

    [建立分割區精靈進度] 頁面上可以使用下列選項:

    詳細資料
    提供從精靈所採取的動作傳回的動作、狀態和任何訊息。

    動作
    指定每個動作的類型和名稱。

    狀態
    指出整個精靈動作傳回 [成功] 或 [失敗] 的值。

    訊息
    提供從程序所傳回的任何錯誤或警告訊息。

    Report
    建立包含 [建立分割區精靈] 結果的報表。 選項為 [檢視報表][將報表儲存到檔案][複製報表到剪貼簿][以電子郵件傳送報表]

    檢視報表
    開啟 [檢視報表] 對話方塊,其中包含 [建立分割區精靈] 進度的文字報表。

    將報表儲存到檔案
    開啟 [另存報表] 對話方塊。

    複製報表到剪貼簿
    將精靈進度報表的結果複製到剪貼簿。

    [以電子郵件傳送報表]
    將精靈進度報表的結果複製到電子郵件。

    完成之後,請選取 [關閉]。

建立分割區精靈會建立資料分割函數和配置,然後將此分割區套用至指定資料表。 若要驗證資料表分割區,在物件總管中以滑鼠右鍵按一下資料表,並選取 [屬性]。 選取 [儲存體] 頁面。 此頁面會顯示諸如分割區函數和配置名稱以及分割區數目等資訊。

查詢資料分割資料表和索引的中繼資料

您可以查詢中繼資料來判斷資料表是否已分割、資料分割資料表的界限點、資料分割資料表的分割資料行、每個分割區中的資料列數目,以及資料壓縮是否已在分割區上實作。

判斷資料表是否已分割

如果資料表 PartitionTable 已分割,或資料表上有任何非叢集索引已分割,則下列查詢會傳回一或多個資料列。 如果資料表未分割,且資料表上沒有非叢集索引已分割,則不會傳回任何資料列。

SELECT SCHEMA_NAME(t.schema_id) AS SchemaName, *   
FROM sys.tables AS t   
JOIN sys.indexes AS i   
    ON t.[object_id] = i.[object_id]   
JOIN sys.partition_schemes ps   
    ON i.data_space_id = ps.data_space_id   
WHERE t.name = 'PartitionTable';   
GO  

判斷資料分割資料表的界限值

下列查詢會針對 PartitionTable 資料表中的每一個分割區傳回界限值。

查詢會使用 sys.indexes 中的 type 資料行,只傳回資料表叢集索引的資訊,如果資料表是堆積,則會傳回基底資料表的資訊。 若要在查詢結果中包含任何分割的非叢集索引,請從查詢中移除或註解化 AND i.type <= 1

SELECT SCHEMA_NAME(t.schema_id) AS SchemaName, t.name AS TableName, i.name AS IndexName, 
    p.partition_number, p.partition_id, i.data_space_id, f.function_id, f.type_desc, 
    r.boundary_id, r.value AS BoundaryValue   
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p  
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
WHERE 
    t.name = 'PartitionTable' 
    AND i.type <= 1  
ORDER BY SchemaName, t.name, i.name, p.partition_number;  

判斷資料分割資料表的分割資料行

下列查詢會傳回 PartitionTable 資料表之分割資料行的名稱。

查詢會使用 sys.indexes 中的 type 資料行,只傳回資料表叢集索引的資訊,如果資料表是堆積,則會傳回基底資料表的資訊。 若要在查詢結果中包含任何分割的非叢集索引,請從查詢中移除或註解化 AND i.type <= 1


SELECT   
    t.[object_id] AS ObjectID
    , SCHEMA_NAME(t.schema_id) AS SchemaName
    , t.name AS TableName   
    , ic.column_id AS PartitioningColumnID   
    , c.name AS PartitioningColumnName
    , i.name as IndexName
FROM sys.tables AS t   
JOIN sys.indexes AS i   
    ON t.[object_id] = i.[object_id]   
    AND i.[type] <= 1 -- clustered index or a heap   
JOIN sys.partition_schemes AS ps   
    ON ps.data_space_id = i.data_space_id   
JOIN sys.index_columns AS ic   
    ON ic.[object_id] = i.[object_id]   
    AND ic.index_id = i.index_id   
    AND ic.partition_ordinal >= 1 -- because 0 = non-partitioning column   
JOIN sys.columns AS c   
    ON t.[object_id] = c.[object_id]   
    AND ic.column_id = c.column_id   
WHERE t.name = 'PartitionTable';   
GO  

判斷資料列描述每個分割區中可能的值範圍

下列查詢會依資料表 PartitionTable 的資料分割傳回資料列,以及使用中資料分割函數的「比較運算子」描述。 Kalen Delaney 所提供的原始查詢。

查詢會使用 sys.indexes 中的 type 資料行,只傳回資料表叢集索引的資訊,如果資料表是堆積,則會傳回基底資料表的資訊。 若要在查詢結果中包含任何分割的非叢集索引,請從查詢中移除或註解化 AND i.type <= 1

SELECT SCHEMA_NAME(t.schema_id) AS SchemaName, t.name AS TableName, i.name AS IndexName, 
    p.partition_number AS PartitionNumber, f.name AS PartitionFunctionName, p.rows AS Rows, rv.value AS BoundaryValue, 
CASE WHEN ISNULL(rv.value, rv2.value) IS NULL THEN 'N/A' 
ELSE
    CASE WHEN f.boundary_value_on_right = 0 AND rv2.value IS NULL THEN '>=' 
        WHEN f.boundary_value_on_right = 0 THEN '>' 
        ELSE '>=' 
    END + ' ' + ISNULL(CONVERT(varchar(64), rv2.value), 'Min Value') + ' ' + 
        CASE f.boundary_value_on_right WHEN 1 THEN 'and <' 
                ELSE 'and <=' END 
        + ' ' + ISNULL(CONVERT(varchar(64), rv.value), 'Max Value') 
END AS TextComparison
FROM sys.tables AS t  
JOIN sys.indexes AS i  
    ON t.object_id = i.object_id  
JOIN sys.partitions AS p  
    ON i.object_id = p.object_id AND i.index_id = p.index_id   
JOIN  sys.partition_schemes AS s   
    ON i.data_space_id = s.data_space_id  
JOIN sys.partition_functions AS f   
    ON s.function_id = f.function_id  
LEFT JOIN sys.partition_range_values AS r   
    ON f.function_id = r.function_id and r.boundary_id = p.partition_number  
LEFT JOIN sys.partition_range_values AS rv
    ON f.function_id = rv.function_id
    AND p.partition_number = rv.boundary_id     
LEFT JOIN sys.partition_range_values AS rv2
    ON f.function_id = rv2.function_id
    AND p.partition_number - 1= rv2.boundary_id
WHERE 
    t.name = 'PartitionTable'
    AND i.type <= 1 
ORDER BY t.name, p.partition_number;

資料行 TextComparison 會根據資料分割函數的定義,描述每個資料分割中可能的值範圍。 以下是查詢範例結果的檢視:

SchemaName TableName IndexName PartitionNumber PartitionFunctionName 資料列 BoundaryValue TextComparison
dbo PartitionTable PK_PartitionTable 1 PFTest 0 2022-03-01 00:00:00.000 >= Min Value and < Mar 1 2022 12:00AM
dbo PartitionTable PK_PartitionTable 2 PFTest 2 2022-04-01 00:00:00.000 >= Mar 1 2022 12:00AM and < Apr 1 2022 12:00AM
dbo PartitionTable PK_PartitionTable 3 PFTest 1 2022-05-01 00:00:00.000 >= Apr 1 2022 12:00AM and < May 1 2022 12:00AM
dbo PartitionTable PK_PartitionTable 4 PFTest 0 2022-06-01 00:00:00.000 >= May 1 2022 12:00AM and < Jun 1 2022 12:00AM
dbo PartitionTable PK_PartitionTable 5 PFTest 1 2022-07-01 00:00:00.000 >= Jun 1 2022 12:00AM and < Jul 1 2022 12:00AM
dbo PartitionTable PK_PartitionTable 6 PFTest 0 NULL >= Jul 1 2022 12:00AM and < Max Value

限制

了解限制中資料分割的限制和效能考量

後續步驟

在下列文章中深入了解相關概念: