上表分区执行计划(Execution Plan on Table Partitioning)

2019-11-02 20:45发布

好家伙,我得到了与下面的代码表

CREATE TABLE [dbo].[PTableMediumPart](
    [PK] [int] NOT NULL,
    [Col1] [int] NOT NULL,
    [Col2] [int] NULL,
    [Col3] [money] NOT NULL,
    [Col4] [money] NULL,
    [Col5] [nvarchar](60) NOT NULL,
    [Col6] [nvarchar](60) NULL,
    [Col7] [varchar](255) NOT NULL,
    [Col8] [varchar](255) NULL,
    [Col9] [smallint] NOT NULL,
    [Col10] [smallint] NULL,
    [Col11] [decimal](20, 3) NOT NULL,
    [Col12] [decimal](20, 3) NULL,
    [Col13] [char](8) NOT NULL,
    [Col14] [datetime2](7) NULL,
    [PartitionKey] [tinyint] NOT NULL
)
GO

所述partitionkey柱与填充CAST((PK%3) AS TINYINT)我已经定义分区的功能和如下面方案

CREATE PARTITION FUNCTION [PFTest](tinyint) AS RANGE LEFT FOR VALUES (0, 1)
GO

CREATE PARTITION SCHEME [PSTEST] AS PARTITION [PFTest] TO ([FGTest1], [FGTest2], [FGTest3])
GO

然后我创建像聚集索引

CREATE UNIQUE CLUSTERED INDEX [CI_PArt] ON [dbo].[PTableMediumPart] 
(
    [PK] ASC,
    [PartitionKey] ASC
)WITH (STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PSTEST]([PartitionKey])
GO

但是当我运行相同的未分区表我得到的查询性能更好或同等性能,例如查询,当我运行下面的查询,我得到的50-50%exution计划,而在其他情况下未分区表得到更好的执行计划,为什么出现这种情况? 我错了,任何东西在这里?

SELECT * 
FROM dbo.PTableMedium
WHERE PK = 789 

SELECT * 
FROM dbo.PTableMediumPart 
WHERE PK = 789 AND  PartitionKey = CAST((789 % 3) AS TINYINT)

Answer 1:

在我的测试(SQL Server 2008中),这两个执行计划有不同的成本:75%,为第一查询和第二查询25%:

此外,在我的测试中

  1. 首先查询将访问所有分区( 1..3 )和
  2. 第二次查询将访问仅一个分区( 789 % 3 = 0 =>是accesed分区[0..1)),因为该补充谓词(的AND PartitionKey = expression上分区键/列定义)( CREATE TABLE ... ON [PSTEST]([PartitionKey]) 此断言/条件允许分区消除 。 因此,SQL Server将寻求具有行PK = 789只有一个分区中。

另外,看到这个博客: http://blog.kejser.org/2014/01/15/curious-partition-function-behaviour/



文章来源: Execution Plan on Table Partitioning