производительность раздела сервера sql - PullRequest
2 голосов
/ 25 октября 2019

В нашей базе данных SQL Server у нас есть таблица, которая разбита на столбец даты. На каждую дату мы вставили полмиллиона записей. Мы заметили, что производительность запросов была хорошей для дат, которые находятся ближе к начальному диапазону раздела, и постепенно снижалась для каждой даты, продвигающейся вперед.

Вот моя функция разделения

CREATE PARTITION FUNCTION partition_position_monthly (DATE)
AS RANGE RIGHT FOR VALUES ('2019-09-01', '2019-11-01');

Таблица

CREATE TABLE PartitionTest(
    ID int IDENTITY(1,1) NOT NULL,
    col1 varchar(256) ,
    col2 varchar(128) ,
    col3 varchar(128) ,
    BusinessDate date , -- partition column
) ON partition_scheme_monthly(BusinessDate)

В столбце BusinessDate имеется кластеризованный индекс.

Здесь используется запрос

select top 1000 * from PartitionTest where BusinessDate = ?

Записи ЦП и ввода-вывода для каждой бизнес-даты

BusinessDate = 2019-09-01 Процессорное время = 31 мс Количество сканирований 1, логическое чтение 80 , физическое чтение 0, чтение с опережением 0

BusinessDate = 2019-09-02 время ЦП = 63 мс количество сканирований 1, логические чтения 24905 , физические чтения 0, чтение с опережением 3131

BusinessDate = 2019-09-03 время ЦП = 125 мс количество сканирований 1, логическое чтение 49727 , физическое чтение 0, чтение с опережением 7

BusinessDate = 2019-09-04 процессорное время = 172 мс количество сканирований 1, логические чтения 74551 , физические чтения 0, чтение с опережениемрекламные объявления 7

BusinessDate = 2019-09-05 процессорное время = 234 мс число сканирований 1, логическое чтение 99376 , физическое чтение 0, чтение с опережением 117

Как вы можете видеть, время ЦП и логические чтения постепенно увеличиваются для BusinessDates, которые находятся дальше от начального диапазона раздела.

Это ожидаемое поведение при получении данных из раздела?

Мы планируем разделить месячные данные, и время ответа на запросы для дней ближе к концу месяца выходит за допустимые пределы. Есть ли способ достичь постоянного времени процессора и логических чтений для каждого дня в разделе?

PasteThePlan Link

1 Ответ

0 голосов
/ 26 октября 2019

Да, это ожидается.

Чтобы получить одинаковую / предсказуемую производительность для всех дат, вам потребуется индекс с начальным столбцом BusinessDate или изменить функцию разделения на более детальную (ежедневно, а не ежемесячно)

Без этоголучшее, что он может сделать, - найти правильный раздел для даты и просканировать все строки, пока не найдет 1000, соответствующих предикату даты. В вашем плане выполнения он читает строки в разделе в порядке ключей кластеризованного индекса и должен прочитать 2,001,000, прежде чем найти первую тысячу, соответствующую предикату в BusinessDate='2019-10-27'.

Если вы обнаружите, что более поздние даты медленнеескорее всего, они соотносятся с вашим ключом кластеризованного индекса (т.е. строки, упорядоченные позже по ключу кластерного индекса, также имеют тенденцию иметь более поздние даты).

...