共用方式為


建立分割資料表及索引

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

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

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

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

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

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

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

  • Azure SQL Database 和 Fabric 中的 SQL 資料庫完全支援數據分割。 所有分割區都必須放在 PRIMARY 檔案群組上,因為在 Azure SQL Database 和 Fabric 的 SQL 資料庫中只提供 PRIMARY 檔案群組。
  • 數據表分割可在 Azure Synapse Analytics 的專用 SQL 集區中使用,但語法有一些差異。 如需詳細資訊,請參閱 在專用 SQL 集區中分割數據表

Permissions

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

  • ALTER ANY DATASPACE 權限。 默認會為 sysadmin 固定伺服器角色以及 db_ownerdb_ddladmin 固定資料庫角色的成員設定此權限。

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

  • 擁有 CONTROL SERVER 或 ALTER ANY DATABASE 權限的資料庫伺服器,這些權限用於要建立分割區函數和分割區配置的資料庫。

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

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

此範例適用於 Fabric 中的 Azure SQL Database 和 SQL 資料庫,不支援新增檔案和檔案群組。 在 SQL Server 和 Azure SQL 受控實例中,您可能會想要根據檔案群組和檔案管理做法來指定使用者建立的檔案群組。

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

  • 使用 datetime2 資料類型,以三個界限值建立名為 myRangePF1RANGE RIGHT 資料分割函數。 三個界值會導致資料表被分成四個分區。
  • 建立名為 myRangePS1 的資料分割配置,此配置會使用 ALL TO 語法將 myRangePF1 資料分割函數中的所有分割指派給 PRIMARY 檔案群組。
  • PartitionTable 資料分割配置上建立名為 myRangePS1 的資料表,並將名為 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 的範例程式碼。

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

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

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

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

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

    如果您使用 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. 在 [資料列] 底下,選取 [新增]。 在新資料列中,輸入檔案群組名稱。

    Warning

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

  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 閒置就啟動

      • Recurring. 如果新的分割資料表會定期更新新資訊,則請選取此選項。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    7. 請選擇 [確定]

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

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

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

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

    Details
    提供由精靈執行的動作所返回的動作結果、狀態及任何相關訊息。

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

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

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

    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 資料表中的每一個分割區傳回界限值。

查詢會使用 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 資料表之分割資料行的名稱。

查詢會使用 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 所提供的原始查詢。

查詢會使用 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 rows BoundaryValue TextComparison
dbo PartitionTable PK_PartitionTable 1 PFTest 0 2022-03-01 00:00:00.000 >= Min Value 和 < 2022年3月1日 上午12:00
dbo PartitionTable PK_PartitionTable 2 PFTest 2 2022-04-01 00:00:00.000 >= 2022年3月1日 上午12:00 和 < 2022年4月1日 上午12:00
dbo PartitionTable PK_PartitionTable 3 PFTest 1 2022-05-01 00:00:00.000 >= 2022年4月1日 00:00 和 < 2022年5月1日 00:00
dbo PartitionTable PK_PartitionTable 4 PFTest 0 2022-06-01 00:00:00.000 >= 2022年5月1日 上午12:00 和 < 2022年6月1日 上午12:00
dbo PartitionTable PK_PartitionTable 5 PFTest 1 2022-07-01 00:00:00.000 >= 2022年6月1日 0:00 和 < 2022年7月1日 0:00
dbo PartitionTable PK_PartitionTable 6 PFTest 0 NULL >= 2022年7月1日 00:00 和 < 最大值

Limitations

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