首页 > 解决方案 > 划分为分区的 SQL 表上的执行计划问题

问题描述

从我在 SQL 中创建的表中选择记录时遇到问题,该表分为多个分区。

虽然,我使用带有“TOP”的 SQL 查询,但分区行为正确。例子:

SELECT TOP (1000) name, partitionNumber
FROM MyTable
WHERE partitionNumber = 2

来自正确执行计划的屏幕:

正确的

但是当我创建没有“TOP”的查询时,分区似乎无法正常工作。例子:

SELECT name, partitionNumber
FROM MyTable
WHERE partitionNumber = 2

来自错误执行计划的屏幕:

不正确

我创建了表,然后创建了一个这样的分区:

 CREATE TABLE [dbo].[TestPartitions](
        [x] [int] NOT NULL,
        [y] [nvarchar](255) NULL
        PRIMARY KEY (x)
    )

CREATE PARTITION FUNCTION udf_partitionByName([nvarchar](255)) 
AS RANGE RIGHT 
FOR VALUES(
     'P1'
    ,'P2'
    ,'P3'
    ,'P4');
GO

CREATE PARTITION SCHEME ups_partionByName 
    AS PARTITION udf_partitionByName
    ALL TO ([PRIMARY])
GO

CREATE NONCLUSTERED INDEX IX_Partition_Name ON [TestPartitions] (y)
ON ups_partionByName(y)

DECLARE @Counter INT 
DECLARE @Part NVARCHAR(255)
SET @Part = 'P1'
SET @Counter=0
WHILE ( @Counter <= 400)
BEGIN
    SET @Counter = @Counter + 1;
    IF (@Counter > 100)
    SET @Part = 'P2'
    IF (@Counter > 200)
    SET @Part = 'P3'
    IF (@Counter > 300)
    SET @Part = 'P4'
    INSERT INTO TestPartitions
    (x, y)
    VALUES
    (@Counter, @Part)
END

谁能解释我为什么,当我使用包含“TOP”短语分区的 SQL 查询时,我只得到正确分区的元素并且没有“TOP”作为 SQL 查询执行计划的一部分正在搜索所有分区?

标签: sql-serverdatabasedatabase-partitioning

解决方案


推荐阅读