0

Привет, гуру SQL, там ... У меня проблема с этим месяцем, которую я не могу решить. У меня эта очень широкая (отчетная) таблица ок. 100+ полей. Прямо сейчас, он имеет около 2M записей и с темпом, что данные идут, это, вероятно, удвоит этот счет в следующие 1-2 месяца. Он работает приемлемый на данный момент. Но не так уж и уверен в ближайшие пару месяцев. В принципе, я просто хочу знать, какой будет лучший индексный план для этого типа таблицы. Это не фактическая таблица, но она очень близка. Я просто хочу проиллюстрировать различные типы данных.Лучший план индексирования SQL для широкой таблицы

ID bigint IDENTITY (UNIQUE CLUSTERED INDEX) 
    Column1 varchar(4000) NULL 
    ... 
    Column50 varchar(1000) NULL 
    Column60 int NULL 
    ... 
    Column60 nvarchar(max) NULL 

Теперь эта таблица в настоящее время запрашивается таким образом:

SELECT <ALL COLUMNS EXCEPT ID> 
    FROM ThisTable WITH(NOLOCK)  --i know how this works dont warn me :) 
    WHERE 
     (@Column1 IS NULL OR CHARINDEX('|' + [Column1] + '|', @Column1) > 0)) 
     ... 
     AND (@Column99 IS NULL OR CHARINDEX('|' + [Column99] + '|', @Column99) > 0)) 

Возможных значений для каждого Params/Поля:

@Column1 = '|value1|value2|value3|' 

    Column1 
    value1 
    value2 

Я знаю, что основное чтение плана выполнения и от того, что Я вижу ... много SCANS продолжается. Но, как я уже сказал, похоже, что я уже врезался в стену, поэтому я здесь и сейчас ищу помощь :). Я знаю, как индексировать небольшие таблицы на основе того, для чего они предназначены, таблицы, но ЭТО широко? Я могу просто убить себя: D

Любые идеи? Я немного читал о Columnstore INDEX .. это самое жизнеспособное решение, о котором я могу думать .. но на этот момент имеется очень мало информации, доступной для этого подхода.

Если вам интересно, как я придумал эту таблицу. Ну его содержимое поступает из разных таблиц (сглаживается). Обработка осуществляется в ночное время. Результат экспортируется в CSV-файл, который затем будет служить источником данных для другого приложения для отчетов.

Заранее благодарен!

+1

Проблема в коде, а не в базе данных. Применяя функции к значениям столбца, вы вынуждаете базу данных проверять всю таблицу для вычисления значений, а затем проверяйте, какие из них соответствуют критериям. Если вы хотите сравнить со списком значений, передайте табличный параметр или присоединитесь к другой таблице, содержащей нужные вам значения. То, что вам следует задавать, это «как передать многозначные параметры в запросе», не глядя на обходные методы индексирования. Вы также должны google для «Звездных схем», хранилищ данных, книг Ральфа Кимбалла и т. Д. –

+0

Это единственный подход, который я могу представить на основе требований, чтобы иметь множественный выбор. т. е. из множественного раскрывающегося списка в пользовательском интерфейсе пользователь может выбрать значение1, значение2 и т. д. ... нет выбора ALL. – jackCaller

+1

Все столбцы в списке выбора, charindex в where where и ORed, а также столбцы, которые выглядят как продукт объединения нескольких значений. Здесь нет стратегии индексирования, которая может вам помочь. – dean

ответ

0

ОК, если у вас уже есть табличная функция, вы, вероятно, можете использовать ее для ускорения работы. Но будьте осторожны, что нет смысла использовать его непосредственно в запросе. Сначала сделайте выбор из функции в таблицу (ы) #temp, а затем присоедините к ней.

Чтобы справиться с ORs, используйте динамический sql с sp_executesql или option(recompile) (см. Мой ответ на аналогичный вопрос here для примера).

Если вы можете сузить список выбора, вы можете использовать индексы покрытия.

Индексы Columnstore отлично подходят для агрегаций в одном столбце (потому что с CSI все значения для столбца группируются вместе, в отличие от хранилища, ориентированного на строки), но не помогут в вашем случае.

+0

звучит как хороший план :) Я уже не в офисе, попробую это во время нашего дня (GMT + 8 здесь). Вы получите отзыв о любом результате. Благодарю. – jackCaller

+0

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

+0

т. Е. Если первый фильтр - столбец1, вызов proc сделан и скомпилирован, чтобы попасть в его индекс ... Если первым фильтром является вызов column2, это отдельный proc ... и т. Д. –

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