Jeff Taylor

Principal Data Consultant

Database Consulting, LLC

SQL Server

Partitioning

Jeff Taylor

Principal Data Consultant

Database Consulting, LLC

Super Hero Suit

jaxdata.org

Every 3rd Wednesday 6-8pm

Except for May, November and December

Jeff Taylor

Principal Data Consultant

Database Consulting, LLC

SQL Server

Partitioning

Partitioning

What is it?

  • A method of dividing a large database table or index into smaller, more manageable parts called partitions.
     
  • Each partition contains a subset of rows based on a partitioning column (e.g., date, region).
     
  • All partitions together still represent a single logical table or index.
     
  • Data is divided horizontally by rows, not columns.
     
  • Managed using partition functions (define boundaries) and partition schemes (map to storage).

Partitioning

Why Use It?

  • Improved performance: Queries can target specific partitions, reducing seek and scan time.
     
  • Faster maintenance: Operations like index rebuilds or data archiving can be done on individual partitions.
     
  • Efficient data management: Easily move, compress, or delete subsets of data.
     
  • Better scalability: Supports very large datasets (up to 15,000 partitions). - NOT A GOAL!
     
  • Over 1,000 partitions may have performance implications (max earlier than SQL 2012).
     
  • Reduced locking issues: Lock escalation can occur at the partition level, not the whole table.
     
  • Optimized storage: Place older or less-used data on cheaper storage tiers, which can be multiple or hot or cold.

Partitioning

Where can I use it?

  • 2016 and older versions - Only works in Enterprise Edition
     
  • 2016 SP1 and newer - Works in both Standard & Enterprise Editions
     
  • Works in all service tiers of Azure SQL Database and Azure SQL Managed Instance
     
  • Table partitioning is also available in dedicated SQL pools in Azure Synapse Analytics, with some syntax differences.

Partitioning

Check Your Data

USE [StackOverflow]
GO

SELECT
    YEAR(v.CreationDate) AS YearValue,
    COUNT(*) AS Records
FROM
    dbo.Votes AS v
GROUP BY
    YEAR(v.CreationDate)
ORDER BY
	1;

Partitioning

Filegroups

ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_Empty] 
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2008] 
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2009] 
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2010] 
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2011] 
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2012] 
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2013] 
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2014] 
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2015] 
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2016]
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2017]
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2018]
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2019]
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2020]
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2021]
GO
ALTER DATABASE [StackOverflow] ADD FILEGROUP [PG_Yearly_2022]
GO

Partitioning

Files for Filegroups

ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_Empty',
FILENAME = N'C:\Files\Databases\2025\StackOverflow_PG_Yearly_Empty.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_Empty]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2008', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2008.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2008]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2009', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2009.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2009]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2010', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2010.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2010]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2011', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2011.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2011]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2012', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2012.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2012]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2013', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2013.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2013]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2014', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2014.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2014]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2015', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2015.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2015]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2016', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2016.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2016]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2017', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2017.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2017]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2018', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2018.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2018]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2019', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2019.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2019]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2020', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2020.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2020]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2021', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2021.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2021]
GO
ALTER DATABASE [StackOverflow] ADD FILE ( 
NAME = N'StackOverflow_PG_Yearly_2022', 
FILENAME = N'C:\Files\Databases\StackOverflow_PG_Yearly_2022.ndf' , 
SIZE = 1MB, FILEGROWTH = 128MB) 
TO FILEGROUP [PG_Yearly_2022]
GO

Partitioning

Partition Function

CREATE PARTITION FUNCTION [PF_Yearly] (DATE)
AS RANGE RIGHT FOR VALUES (
'2008-01-01',
'2009-01-01',
'2010-01-01',
'2011-01-01',
'2012-01-01',
'2013-01-01',
'2014-01-01',
'2015-01-01',
'2016-01-01',
'2017-01-01',
'2018-01-01',
'2019-01-01',
'2020-01-01',
'2021-01-01',
'2022-01-01');

Partitioning

Partition Scheme

CREATE PARTITION SCHEME [PS_Yearly] 
AS PARTITION [PF_Yearly] TO (
[PG_Yearly_Empty],
[PG_Yearly_2008],
[PG_Yearly_2009],
[PG_Yearly_2010],
[PG_Yearly_2011],
[PG_Yearly_2012],
[PG_Yearly_2013],
[PG_Yearly_2014],
[PG_Yearly_2015],
[PG_Yearly_2016],
[PG_Yearly_2017],
[PG_Yearly_2018],
[PG_Yearly_2019],
[PG_Yearly_2020],
[PG_Yearly_2021],
[PG_Yearly_2022])
GO

Partitioning

Partitioned Table

CREATE TABLE [dbo].[Votes_Partitioned](
	[Id] [INT] NOT NULL,
	[PostId] [INT] NOT NULL,
	[UserId] [INT] NULL,
	[BountyAmount] [INT] NULL,
	[VoteTypeId] [INT] NOT NULL,
	[CreationDate] DATE NOT NULL,
 CONSTRAINT [PK_Votes_Partitioned] PRIMARY KEY CLUSTERED 
(
	[Id] ASC,
	[CreationDate] ASC
) WITH (DATA_COMPRESSION = PAGE) 
ON [PS_Yearly]([CreationDate])) ON [PS_Yearly]([CreationDate])
GO

Partitioning

Insert Example

INSERT INTO
    dbo.Votes_Partitioned WITH (TABLOCK)
    (Id, PostId, UserId, BountyAmount, VoteTypeId, CreationDate)
SELECT
    Id,
    PostId,
    UserId,
    BountyAmount,
    VoteTypeId,
    CreationDate
FROM
    dbo.Votes;
--9 minutes 11 seconds --231,441,846

Partitioning

Non-Clustered Index

--19 seconds
CREATE NONCLUSTERED INDEX [IX_Votes_Partitioned_UserId_BountyAmount_VoteTypeId_CreationDate] 
ON [dbo].[Votes_Partitioned]
(
	UserId,
    BountyAmount,
    VoteTypeId,
    CreationDate
)
WHERE BountyAmount IS NOT NULL
WITH (SORT_IN_TEMPDB = ON, DATA_COMPRESSION = PAGE) ON [PS_Yearly]([CreationDate])
GO

Partitioning

Rows Per Filegroup

SELECT
    p.partition_number,
    ps.name AS PartitionScheme,
    pf.name AS PartitionFunction,
    prv.value AS BoundaryValue,
    SUM(p.rows) AS RowCounts
FROM
    sys.tables t
INNER JOIN sys.indexes i
    ON t.object_id = i.object_id AND i.index_id IN (0, 1) -- Heap or clustered index
INNER JOIN sys.partitions p
    ON i.object_id = p.object_id AND i.index_id = p.index_id
INNER JOIN sys.partition_schemes ps
    ON i.data_space_id = ps.data_space_id
INNER JOIN sys.partition_functions pf
    ON ps.function_id = pf.function_id
LEFT OUTER JOIN sys.partition_range_values prv
    ON pf.function_id = prv.function_id AND p.partition_number = prv.boundary_id + 1
WHERE
    t.name = 'Votes_Partitioned' AND SCHEMA_NAME(t.schema_id) = 'dbo'
    AND pf.name = 'PF_Yearly'
GROUP BY
    p.partition_number, ps.name, pf.name, prv.value
ORDER BY
    p.partition_number;

Partitioning

Rows Per Filegroup

Partitioning

Execution Plans

Partitioning

Execution Plans

Partitioning

Execution Plans

Partitioning

Execution Plans

Partitioning

Execution Plans

Partitioning

Execution Plans

Partitioning

Execution Plans

Partitioning

$PARTITION function

SELECT
    TOP 100
    COUNT(v.PostId) AS Posts,
    COUNT(v.UserId) AS Users,
    SUM(v.BountyAmount) AS BountyAmount,
    v.VoteTypeId,
    YEAR(v.CreationDate) AS YearValue
FROM
    dbo.Votes_Partitioned AS v
WHERE
    v.BountyAmount IS NOT NULL
    AND $PARTITION.PF_Yearly(CreationDate) =
        (
            SELECT
                MAX($PARTITION.PF_Yearly(CreationDate))
            FROM
                dbo.Votes_Partitioned
        )
GROUP BY
    v.VoteTypeId,
    YEAR(v.CreationDate)
ORDER BY
    5 DESC;

Partitioning

$PARTITION function

SELECT
    COUNT(v.PostId) AS Posts,
    COUNT(v.UserId) AS Users,
    SUM(v.BountyAmount) AS BountyAmount,
    v.VoteTypeId,
    YEAR(v.CreationDate) AS YearValue
FROM
    dbo.Votes_Partitioned AS v
WHERE
    v.BountyAmount IS NOT NULL
    AND $PARTITION.PF_Yearly(CreationDate) =
    (
        SELECT
            MAX($PARTITION.PF_Yearly(CreationDate))
        FROM
            dbo.Votes_Partitioned
    )
GROUP BY
    v.VoteTypeId,
    YEAR(v.CreationDate)
ORDER BY
    5 DESC 
OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY;

Partitioning

Backups - No Compression

--38 minutes 39 seconds
BACKUP DATABASE [StackOverflow]
    TO
        DISK = N'C:\Files\DatabaseBackups\2025\StackOverflow2025.bak'
    WITH
        NOFORMAT,
        NOINIT,
        NAME = N'StackOverflow-Full Database Backup',
        SKIP,
        NOREWIND,
        NOUNLOAD,
        STATS = 10,
        CHECKSUM;
GO
DECLARE @backupSetId AS INT;
SELECT
    @backupSetId = position
FROM
    msdb..backupset
WHERE
    database_name = N'StackOverflow'
    AND backup_set_id =
        (
            SELECT
                MAX(backup_set_id)
            FROM
                msdb..backupset
            WHERE
                database_name = N'StackOverflow'
        );
IF @backupSetId IS NULL
    BEGIN
        RAISERROR(N'Verify failed. Backup information for database ''StackOverflow'' not found.', 16, 1);
    END;
RESTORE VERIFYONLY
    FROM
        DISK = N'C:\Files\DatabaseBackups\2025\StackOverflow2025.bak'
    WITH
    FILE = @backupSetId,
    NOUNLOAD,
    NOREWIND;
GO

Partitioning

Backups - No Compression

Partitioning

Backups - With Compression

--37 minute 20 seconds
BACKUP DATABASE [StackOverflow]
    TO
        DISK = N'C:\Files\DatabaseBackups\2025\StackOverflow2025.Compression.bak'
    WITH
        NOFORMAT,
        NOINIT,
        NAME = N'StackOverflow-Full Database Backup',
        SKIP,
        NOREWIND,
        NOUNLOAD,
        COMPRESSION,
        STATS = 10,
        CHECKSUM;
GO
DECLARE @backupSetId AS INT;
SELECT
    @backupSetId = position
FROM
    msdb..backupset
WHERE
    database_name = N'StackOverflow'
    AND backup_set_id =
        (
            SELECT
                MAX(backup_set_id)
            FROM
                msdb..backupset
            WHERE
                database_name = N'StackOverflow'
        );
IF @backupSetId IS NULL
    BEGIN
        RAISERROR(N'Verify failed. Backup information for database ''StackOverflow'' not found.', 16, 1);
    END;
RESTORE VERIFYONLY
    FROM
        DISK = N'C:\Files\DatabaseBackups\2025\StackOverflow2025.Compression.bak'
    WITH
    FILE = @backupSetId,
    NOUNLOAD,
    NOREWIND;
GO

Partitioning

Backups - With Compression

Partitioning

Backups - With ZSTD Compression

--1 hour 6 minutes 19 seconds
--It went to 149GB and then down to 105GB
BACKUP DATABASE [StackOverflow]
    TO
        DISK = N'C:\Files\DatabaseBackups\2025\StackOverflow2025.ZSTD.bak'
    WITH
        NOFORMAT,
        NOINIT,
        NAME = N'StackOverflow-Full Database Backup',
        SKIP,
        NOREWIND,
        NOUNLOAD,
        COMPRESSION (ALGORITHM = ZSTD, LEVEL = HIGH),
        STATS = 10,
        CHECKSUM;
GO
DECLARE @backupSetId AS INT;
SELECT
    @backupSetId = position
FROM
    msdb..backupset
WHERE
    database_name = N'StackOverflow'
    AND backup_set_id =
        (
            SELECT
                MAX(backup_set_id)
            FROM
                msdb..backupset
            WHERE
                database_name = N'StackOverflow'
        );
IF @backupSetId IS NULL
    BEGIN
        RAISERROR(N'Verify failed. Backup information for database ''StackOverflow'' not found.', 16, 1);
    END;
RESTORE VERIFYONLY
    FROM
        DISK = N'C:\Files\DatabaseBackups\2025\StackOverflow2025.ZSTD.bak'
    WITH
    FILE = @backupSetId,
    NOUNLOAD,
    NOREWIND;
GO

Partitioning

Backups - With ZSTD Compression

Partitioning

Backup Filegroup

DECLARE @FileGroupName NVARCHAR(128), @SQL NVARCHAR(MAX);

-- Get the latest filegroup name
SELECT TOP 1 @FileGroupName = name FROM sys.filegroups ORDER BY data_space_id DESC;

--Create Backup command
SET @SQL = '
BACKUP DATABASE StackOverflow
FILEGROUP = ''' + @FileGroupName + '''
TO DISK = ''C:\Files\DatabaseBackups\2025\StackOverflow_' + @FileGroupName + '.bak''
WITH NOFORMAT,
        NOINIT,
        NAME = N''StackOverflow-' + @FileGroupName + ' Database Backup'',
        SKIP,
        NOREWIND,
        NOUNLOAD,
        COMPRESSION (ALGORITHM = ZSTD, LEVEL = HIGH),
        STATS = 10,
        CHECKSUM;';

-- Execute the backup
EXEC sp_executesql @SQL;

Partitioning

Backup Filegroup

Partitioning

Statistics

SELECT
    name,
    is_incremental,
    object_id
FROM
    sys.stats
WHERE
    object_id = OBJECT_ID('dbo.Votes_Partitioned');

Partitioning

Statistics

CREATE STATISTICS Votes_Partitioned_LatestPartition
    ON dbo.Votes_Partitioned
    (
        CreationDate
    )
    WITH
    FULLSCAN,
    INCREMENTAL = ON;

Partitioning

Statistics

DECLARE @MaxPartition INT, @SQLQuery NVARCHAR(MAX);
SELECT
    @MaxPartition = MAX(p.partition_number)
FROM 
    sys.partitions p
JOIN 
    sys.tables t ON p.object_id = t.object_id
WHERE 
    t.name = 'Votes_Partitioned';

SET @SQLQuery = 'UPDATE STATISTICS dbo.Votes_Partitioned Votes_Partitioned_LatestPartition
    WITH
    RESAMPLE ON PARTITIONS (' + CAST(@MaxPartition AS VARCHAR(7)) + ');'

EXEC sp_executesql @SQLQuery

Partitioning

Indexes

DECLARE @MaxPartition INT;
SELECT
    @MaxPartition = MAX(p.partition_number)
FROM 
    sys.partitions p
JOIN 
    sys.tables t ON p.object_id = t.object_id
WHERE 
    t.name = 'Votes_Partitioned';
ALTER INDEX ALL ON dbo.Votes_Partitioned REBUILD PARTITION = @MaxPartition; 

Partitioning

Switching Partitions

SELECT
    p.partition_number,
    ps.name AS PartitionScheme,
    pf.name AS PartitionFunction,
    prv.value AS BoundaryValue,
    SUM(p.rows) AS RowCounts
FROM
    sys.tables t
INNER JOIN sys.indexes i
    ON t.object_id = i.object_id AND i.index_id IN (0, 1) -- Heap or clustered index
INNER JOIN sys.partitions p
    ON i.object_id = p.object_id AND i.index_id = p.index_id
INNER JOIN sys.partition_schemes ps
    ON i.data_space_id = ps.data_space_id
INNER JOIN sys.partition_functions pf
    ON ps.function_id = pf.function_id
LEFT OUTER JOIN sys.partition_range_values prv
    ON pf.function_id = prv.function_id AND p.partition_number = prv.boundary_id + 1
WHERE
    t.name = 'Votes_Partitioned' AND SCHEMA_NAME(t.schema_id) = 'dbo'
    AND pf.name = 'PF_Yearly'
GROUP BY
    p.partition_number, ps.name, pf.name, prv.value
ORDER BY
    p.partition_number;

Partitioning

Switching Partitions

CREATE TABLE [dbo].[Votes_History](
	[Id] [int] NOT NULL,
	[PostId] [int] NOT NULL,
	[UserId] [int] NULL,
	[BountyAmount] [int] NULL,
	[VoteTypeId] [int] NOT NULL,
	[CreationDate] [date] NOT NULL,
 CONSTRAINT [PK_Votes_History] PRIMARY KEY CLUSTERED 
(
	[Id] ASC, [CreationDate] ASC
)WITH (DATA_COMPRESSION = PAGE) ON [PG_Yearly_2008]
) ON [PG_Yearly_2008]
GO
CREATE NONCLUSTERED INDEX [IX_Votes_Partitioned_UserId_BountyAmount_VoteTypeId_CreationDate] ON [dbo].[Votes_History]
(
	[UserId] ASC, [BountyAmount] ASC, [VoteTypeId] ASC, [CreationDate] ASC
)
WHERE ([BountyAmount] IS NOT NULL)
WITH (DATA_COMPRESSION = PAGE) ON [PG_Yearly_2008]
GO
ALTER TABLE dbo.Votes_History ADD CONSTRAINT CK_Votes_History_Range 
CHECK (CreationDate >= '2008-01-01' AND CreationDate < '2009-01-01');

Partitioning

Switching Partitions

DECLARE @PartitionNumber INT = 2;
ALTER TABLE dbo.Votes_Partitioned SWITCH PARTITION @PartitionNumber TO dbo.Votes_History;
SELECT MIN(CreationDate) AS MinDate, MAX(CreationDate) AS MaxDate FROM dbo.Votes_History;

Partitioning

Switching Back

ALTER TABLE dbo.Votes_History SWITCH TO dbo.Votes_Partitioned PARTITION 2;

Partitioning

Best Practices

  • Stripe each partition across many disks. This is especially relevant when using spinning disks.
     
  • When possible, use a server with enough main memory to fit frequently accessed partitions, or all partitions in memory, to reduce I/O cost.
     
  • If the data you query won't fit in memory, compress the tables and indexes. This will reduce I/O cost.
     
  • Use a server with fast processors and as many processor cores as you can afford, to take advantage of parallel query processing capability.
     
  • Ensure the server has sufficient I/O controller bandwidth.
     
  • Create a clustered index on every large partitioned table to take advantage of B-tree scanning optimizations.

Partitioning

Resources

 

  • Partitioned Tables & Indexes - https://learn.microsoft.com/en-us/sql/relational-databases/partitions/partitioned-tables-and-indexes?view=sql-server-ver17
  • Query Processing Architecture - https://learn.microsoft.com/en-us/sql/relational-databases/query-processing-architecture-guide?view=sql-server-ver17#query-processing-enhancements-on-partitioned-tables-and-indexes
  • Best Practices - https://learn.microsoft.com/en-us/sql/relational-databases/query-processing-architecture-guide?view=sql-server-ver17#best-practices
  • $PARTITION function - https://learn.microsoft.com/en-us/sql/t-sql/functions/partition-transact-sql?view=sql-server-ver17
  • Data Load Performance Guide - https://learn.microsoft.com/en-us/previous-versions/sql/sql-server-2008/dd425070(v=sql.100)
  • Statistics - https://learn.microsoft.com/en-us/sql/t-sql/statements/update-statistics-transact-sql?view=sql-server-ver17

Questions

Thank you!

Jeff Taylor

Thank you for attending my session today.
If you have any additional questions, please don't hesitate to reach out.

SQL Server Partitioning

By reviewmydb

SQL Server Partitioning

  • 49