Wednesday, November 16, 2011

SQL SERVER – 2005 – Database Table Partitioning Tutorial – How to Horizontal Partition Database Table


Here is simple tutorial which explains how a table can be partitioned. Please read my article Introduction to Partitioning before continuing to this article.
Step 1 : Create New Test Database with two different filegroups
I have written tutorial using my C: Drive, however to take advantage of partition it is recommended that different file groups are created on separate hard disk to get maximum performance advantage of partitioning. Before running following script, make sure C: drive contains two folders – Primary and Secondary as following example has used those two folder to store different filegroups.
USE Master;GO--- Step 1 : Create New Test Database with two different filegroups.IF EXISTS (SELECT nameFROM sys.databasesWHERE name N'TestDB')DROP DATABASE TestDB;GOCREATE DATABASE TestDBON PRIMARY(NAME='TestDB_Part1',FILENAME='C:\Data\Primary\TestDB_Part1.mdf',SIZE=2,MAXSIZE=100,FILEGROWTH=),FILEGROUP TestDB_Part2(NAME 'TestDB_Part2',FILENAME ='C:\Data\Secondary\TestDB_Part2.ndf',SIZE 2,MAXSIZE=100,FILEGROWTH=);GO

Step 2 : Create Partition Range FunctionPartition Function defines the range of values to be stored on different partition. For our example let us assume that first 10 records are stored in one filegroup and rest are stored in different filegroup. Following function will create partition function with range specified.
USE TestDB;GO--- Step 2 : Create Partition Range FunctionCREATE PARTITION FUNCTION TestDB_PartitionRange (INT)AS RANGE LEFT FOR
VALUES 
(10);GO

Step 3 : Attach Partition Scheme to FileGroups
Partition function has to be attached with filegroups to be used in table partitioning. In following example partition is created on primary and secondary filegroup.
USE TestDB;GO--- Step 3 : Attach Partition Scheme to FileGroupsCREATE PARTITION SCHEME TestDB_PartitionSchemeAS PARTITION TestDB_PartitionRangeTO ([PRIMARY]TestDB_Part2);GO
Step 4 : Create Table with Partition Key and Partition Scheme
The table which is to be partitioned has to be created specifying column name to be used with partition scheme to partition tables in different filegroups. Following example demonstrates ID column as the Partition Key.
USE TestDB;GO--- Step 4 : Create Table with Partition Key and Partition SchemeCREATE TABLE TestTable(ID INT NOT NULL,Date DATETIME)ON TestDB_PartitionScheme (ID);GO
Step 5 : (Optional/Recommended) Create Index on Partitioned Table
This step is optional but highly recommended. Following example demonstrates the creation of table aligned index. Here index is created using same Partition Scheme and Partition Key as Partitioned Table.
USE TestDB;GO--- Step 5 : (Optional/Recommended) Create Index on Partitioned TableCREATE UNIQUE CLUSTERED INDEX IX_TestTableON TestTable(ID)ON TestDB_PartitionScheme (ID);GO
Step 6 : Insert Data in Partitioned Table
Insert data in the partition table. Here we are inserting total of 3 records. We have decided that in table partition 1 Partition Key ID will contain records from 1 to 10 and partition 2 will contain reset of the records. In following example record with ID equals to 1 will be inserted in partition 1 and rest will be inserted in partition 2.
USE TestDB;GO--- Step 6 : Insert Data in Partitioned TableINSERT INTO TestTable (IDDate-- Inserted in Partition 1VALUES (1,GETDATE());INSERT INTO TestTable (IDDate-- Inserted in Partition 2VALUES (11,GETDATE());INSERT INTO TestTable (IDDate-- Inserted in Partition 2VALUES (12,GETDATE());GO
Step 7 : Test Data from TestTable
Query TestTable and see the values inserted in TestTable.
USE TestDB;GO--- Step 7 : Test Data from TestTableSELECT *FROM TestTable;GO
Step 8 : Verify Rows Inserted in Partitions
We can query sys.partitions view and verify that TestTable contains two partitions and as per Step 6 one record is inserted in partition 1 and two records are inserted in partition 2.
USE TestDB;GO--- Step 8 : Verify Rows Inserted in PartitionsSELECT *FROM sys.partitionsWHERE OBJECT_NAME(OBJECT_ID)='TestTable';GO

Partitioning table is very simple and very efficient when used with different filegroups in different tables. I will write very soon more articles about Table Partitioning. If you need any help in table partitioning or have any doubt, please contact me and I will do my best to help you.