#sql-server
#sql-server
Вопрос:
мы получили таблицу ФАКТОВ, в которой количество строк 237383163 и в которой много повторяющихся данных.
При выполнении запросов к этой таблице выполняется СКАНИРОВАНИЕ по такому количеству строк, что приводит к длительному времени выполнения (bocs мы не создали кластеризованный индекс).
Есть ли способ, который кто-то может предложить — создать кластеризованный ключ, используя некоторую комбинацию существующего поля, а также добавив любое новое поле (например, столбец идентификаторов)
Некластеризованные индексы, созданные в таблице, также не помогают.
С уважением
Ответ №1:
Мысли:
- Для добавления кластеризованного индекса, который не является уникальным, потребуется 4-байтовый uniqueifier
- Добавление столбца суррогатной идентификации приведет к дублированию
- Кластеризованный индекс лучше всего использовать, когда он узкий и числовой, особенно если у вас есть некластеризованные индексы
Первым делом удалите дубликаты данных
Тогда я бы рассмотрел одну из 2 вещей, основанных на наличии некластеризованных индексов
- Без индексов NC создайте уникальный кластеризованный индекс для некоторых или всех столбцов ФАКТОВ
- С помощью индексов NC создайте столбец ИДЕНТИФИКАТОРОВ и используйте его в качестве кластеризованного индекса. Создайте уникальный индекс NC для столбцов ФАКТОВ
Вариант 1 будет намного меньше на диске. Я делал это раньше для таблицы фактов с миллиардом строк, и она сократилась на 65%. Индексов NC не было.
Оба варианта необходимо будет протестировать, чтобы увидеть влияние на время загрузки и отклика и т. Д
Комментарии:
1. извините, но согласно приведенным выше комментариям — какой тогда вариант 1?
2. извините, но согласно приведенным выше комментариям — какой тогда вариант 1? должен ли я тогда создавать кластеризованный индекс в поле даты (КАЖДЫЙ день мы получаем миллионы строк в день), но это не уникально
3. @Conrad Jagger: Я уточнил номера параметров. Во-первых, что идентифицирует факт? Это будет вашей отправной точкой для определения того, какой вариант вам нужно сделать