Published on

March 22, 2010

Улучшение производительности с помощью разделенных таблиц в SQL Server

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

Проблема

Когда данные хранятся в разделенной таблице, используется ключ раздела для определения физической группы файлов, в которой хранятся данные. Запросы, которые используют ключ раздела в предложении WHERE или JOIN, работают хорошо, но поиск или агрегация, охватывающие несколько разделов, могут быть значительно медленнее. Оптимизатор не эффективно обрабатывает сканирование всех разделов, что приводит к проблемам производительности.

Предыстория

Многие компании, включая нашу, имеют несколько клиентов в каждой таблице, идентифицируемых полем CustomerID. Мы решили разделить таблицу, чтобы уменьшить ее общий размер, группируя клиентов в физические разделы. Мы реализовали произвольное поле PartitionID для балансировки данных между разделами. Хотя это улучшило производительность для большинства запросов, у нас возникли проблемы производительности при поиске значений по всем CustomerID.

Решение

После экспериментов с различными подходами мы нашли неочевидное решение, которое значительно улучшило производительность. Мы перебирали разделы, используя поле PartitionID, чтобы собрать соответствующие данные в таблицу-переменную. Затем мы выполняли окончательный запрос к этому единственному источнику данных.

DECLARE @IntDates TABLE (IntDate INT)
DECLARE @PartitionID TINYINT

SET @PartitionID = 0
WHILE (@PartitionID < 10)
BEGIN
    INSERT INTO @IntDates (IntDate)
    SELECT MIN(etp.IntDate)
    FROM dbo.ExampleTablePartitioned etp
    WHERE etp.PartitionID = @PartitionID

    SET @PartitionID = (@PartitionID + 1)
END

SELECT MIN(IntDate)
FROM @IntDates

Это решение, хотя и нестандартное, работало значительно быстрее, чем запрос к всей разделенной таблице. Стоимость запроса снизилась с 388.341 до 0.1361422, а использование процессора вернулось к исходному уровню.

Вывод

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

Помните, что важно экспериментировать и найти наилучшее решение для вашей конкретной ситуации. Разделение может быть мощным инструментом для улучшения производительности, но требует тщательного изучения и тестирования.

© 2021 Ваша Компания. Все права защищены.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.