2013-05-14 2 views
6

У меня есть данные, которые являются матрицей целочисленных значений, которые указывают на полосу распределения распределения. Я оптимизирую для производительности SELECT над производительностью INSERT. Максимум 100 полос. В первую очередь я буду запрашивать эти данные путем суммирования или усреднения диапазонов в течение определенного периода времени.Устраняет ли денормализация строк столбцами в производительности SQL Server?

Мой вопрос: могу ли я достичь лучшей производительности, сглаживая эти данные по таблице с 1 столбцом для каждой полосы или используя один столбец, представляющий значение полосы?

уплощенных данные

UserId ActivityId DateValue Band1 Band2 Band3....Band100 
10001 10002  1/1/2013 1  5  100  200 

ИЛИ Нормированная

UserId ActivityId DateValue Band BandValue 
10001 10002  1/1/2013 1 1 
10001 10002  1/1/2013 2 5 
10001 10002  1/1/2013 3 100 

Пример запроса

SELECT AVG(Band1), AVG(Band2), AVG(Band3)...AVG(Band100) 
FROM ActivityBands 
GROUP BY UserId 
WHERE DateValue > '1/1/2012' AND DateValue < '1/1/2013' 

ответ

8

Сохраните данные в нормализованном формате.

Если вы не получаете приемлемую производительность по этой схеме, вместо денормализации сначала рассмотрите, какие индексы у вас есть на столе. Вероятно, вам не хватает индекса, который бы делал это аналогичным для денормализованной таблицы. Затем попробуйте написать запрос для извлечения данных из нормализованной таблицы, чтобы результирующий набор выглядел как денормализованная таблица, и используйте этот запрос для создания indexed view. Это даст вам выбранную производительность, идентичную денормализованной таблице, но сохранит хорошие преимущества организации данных при правильной нормализации.

1

Если вы хотите получить данные очень быстро, то вы должны выравниваться стол и использовать индексы улучшить выбор в широком диапазоне столбцов, аналогичном тому, что вы предложили. Однако, если вы заинтересованы в создании данных для быстрого обновления, то использование нормализации 3-го или 4-го уровня в сочетании с большим количеством соединений в таблице должно обеспечить лучшую производительность.

2

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

Причина проста. Размер данных на страницах намного меньше, поэтому для удовлетворения запроса нужно читать несколько страниц. Накладные расходы для хранения одной полосы на строку составляют около 4 целых или 32 байта. Таким образом, 100 полос составляют около 3200 байт. В пределах одной записи размер записи составляет 100 * 4 + 8 или около 408 байт. Если ваш запрос читает значительное количество записей, это значительно сокращает требования к вводу-выводу.

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

Ваш образец запроса читает сотни или тысячи строк, поэтому денормализация должна принести пользу такому запросу.

4

Денормализация оптимизирует ровно одно средство доступа к данным за счет (почти всех) других.

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

Создание соответствующего кластерного индекса; помещая ваши некластеризованные индексы на SSD. увеличение объема памяти на вашем сервере; все методы, которые улучшат производительность для все * обращаются, а не торгуют между различными доступами.

Смежные вопросы