SQL Server — проблема с кластеризованным ключом индекса в таблице фактов с миллионами строк

#sql-server

#sql-server

Вопрос:

мы получили таблицу ФАКТОВ, в которой количество строк 237383163 и в которой много повторяющихся данных.

При выполнении запросов к этой таблице выполняется СКАНИРОВАНИЕ по такому количеству строк, что приводит к длительному времени выполнения (bocs мы не создали кластеризованный индекс).

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

Некластеризованные индексы, созданные в таблице, также не помогают.

С уважением

Ответ №1:

Мысли:

  • Для добавления кластеризованного индекса, который не является уникальным, потребуется 4-байтовый uniqueifier
  • Добавление столбца суррогатной идентификации приведет к дублированию
  • Кластеризованный индекс лучше всего использовать, когда он узкий и числовой, особенно если у вас есть некластеризованные индексы

Первым делом удалите дубликаты данных

Тогда я бы рассмотрел одну из 2 вещей, основанных на наличии некластеризованных индексов

  1. Без индексов NC создайте уникальный кластеризованный индекс для некоторых или всех столбцов ФАКТОВ
  2. С помощью индексов NC создайте столбец ИДЕНТИФИКАТОРОВ и используйте его в качестве кластеризованного индекса. Создайте уникальный индекс NC для столбцов ФАКТОВ

Вариант 1 будет намного меньше на диске. Я делал это раньше для таблицы фактов с миллиардом строк, и она сократилась на 65%. Индексов NC не было.

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

Комментарии:

1. извините, но согласно приведенным выше комментариям — какой тогда вариант 1?

2. извините, но согласно приведенным выше комментариям — какой тогда вариант 1? должен ли я тогда создавать кластеризованный индекс в поле даты (КАЖДЫЙ день мы получаем миллионы строк в день), но это не уникально

3. @Conrad Jagger: Я уточнил номера параметров. Во-первых, что идентифицирует факт? Это будет вашей отправной точкой для определения того, какой вариант вам нужно сделать