2016-07-07 1 views
1

У меня есть таблица с примерно 400 столбцами (в среднем 4-5 миллионов строк), и она имеет ужасную производительность даже для count (*) или выбирает x из y запросов. Сложные запросы, которые занимали секунды в подобной таблице столбцов 30, занимают часы, даже когда доступ к столбцам одинаковый.Проблемы с производительностью SQL Server с очень широкими таблицами (400 столбцов). Нужна ясность в вертикальном разбиении?

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

Теперь мои вопросы касаются вертикального разбиения. Я могу разделить 400 столбцов на меньшие таблицы, скажем, по 10 таблиц по 40 столбцов. Но -

  1. Во-первых, есть ли реальная производительность преимущество такого вертикального разделения на всех, учитывая все эти таблицы всегда будут соединены обратно для запроса?

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

Вышеуказанные подходы - это то, что я нашел после многих часов поиска. Будут также оценены любые другие подходы, которые лучше работают для широких таблиц.

+0

Вы придерживаетесь хотя бы 3-й нормальной формы? –

+0

У вас есть кластеризованный индекс в этой таблице? Как ожидаемая продолжительность вашей страницы (есть ли у вас проблемы с этой таблицей в ОЗУ)? Вы проверили план выполнения при выполнении любого из этих запросов, чтобы узнать, в чем проблема? –

+0

Насколько я знаю, ограничение [8060 in-row byte limit] (https://technet.microsoft.com/en-us/library/ms186981 (v = sql.105) .aspx) по-прежнему применяется к более последние версии SQL Server. –

ответ

0

Нет увеличения производительности для вертикального разбиения, если вы просто собираетесь присоединиться ко всем таблицам назад. Прирост производительности зависит от удаления таблиц из запроса.

Что касается служебных накладных расходов на производительность, если идентификатор соединяет две таблицы, это кластерный первичный ключ, тогда производительность должна быть очень схожей.

Многие базы данных (в частности, ориентированные на столбцы базы данных) имеют встроенную поддержку вертикального разбиения. Это означает, что читаются только разделы с столбцами. Я не думаю, что SQL Server предлагает такую ​​поддержку.

В вашем случае вы можете нормализовать свои данные. Это действительно может быть большой победой, поскольку общий объем хранимых данных намного меньше, чем в денормализованной форме, и накладные расходы на соединение могут быть незначительными.

Вы также можете посмотреть на другие возможности:

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

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

Индексы столбцов лучше всего подходят для рабочих нагрузок DSS, которые обычно выполняют полное сканирование. SQL Server 2016 представляет усовершенствования столбцов, которые также делают индексы столбцов для оперативной аналитики. См. https://msdn.microsoft.com/en-us/library/dn817827.aspx.