Проблема с планом выполнения на таблице SQL, разделенной на разделы - PullRequest
0 голосов
/ 30 марта 2020

У меня проблема с выбором записей из таблицы, которую я создал в SQL, которая разделена на разделы.

Хотя я использую запрос SQL с "TOP", разделы ведут себя правильно. Пример:

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

Может кто-нибудь объяснить мне почему , когда я использую запрос SQL с содержащей фразу "TOP" работает разделение, и я получаю только элементы правильный раздел и без "TOP", как часть SQL план выполнения запроса выполняет поиск по всем разделам?

...