Какие поля должны быть проиндексированы в данной таблице? - PullRequest
2 голосов
/ 22 декабря 2008

У меня есть таблица с множеством регистров (более 2 миллионов). Это таблица транзакций, но мне нужен отчет с большим количеством объединений. Что лучше всего индексировать эту таблицу, потому что она отнимает слишком много времени.

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

Любая помощь?

Ответы [ 8 ]

11 голосов
/ 22 декабря 2008

Средство запросов SQL Server 2008 Management Studio, если вы включите «Включить фактический план выполнения», сообщит вам, какие индексы необходимо выполнить для быстрого выполнения запроса. (Предполагается, что существует очевидный отсутствующий индекс, который делает запрос необычно медленным, то есть.)

Снимок экрана запроса SQL Server 2008 Management Studio http://img208.imageshack.us/img208/4108/image4sy8.png

Мы используем это все время при переполнении стека ... одна из лучших функций SQL 2008. Он также работает с более старыми экземплярами SQL, просто установите инструменты SQL 2008 и наведите их на экземпляр SQL 2005. Не уверен, работает ли он ранее на чем-либо.

Как уже отмечали другие, вы можете сделать это вручную, но это займет немного проб и ошибок. Вам понадобятся индексы для полей, которые используются в предложениях ORDER BY и WHERE.

4 голосов
/ 22 декабря 2008

ключевые поля должны быть всегда пункт где ???

Нет, это было бы излишним. Индексирование поля действительно работает только в том случае, если a) предложение WHERE достаточно избирательно (то есть: выбирается только около 1-2% значений; индекс для поля «Gender» может быть только одним из двух или трех возможных значений). бессмысленно), и б) ваше предложение WHERE не включает вызовы функций или другое волшебство.

В вашем случае TBL.Status может быть кандидатом - сколько возможных значений? Вы выбираете значения «1» и «2» - если есть сотни возможных значений, тогда это хороший выбор.

На примечании стороны: этот пункт здесь: (TBL.Login IS NULL и TBL.Login <> 'dev') довольно бессмысленен - ​​если значение TBL.login IS NULL, то оно ОПРЕДЕЛЕННО не 'dev' ..... так что просто " ЕСТЬ НУЛЬ "будет более чем достаточно ......

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

Кроме того, обратите внимание: по возможности НЕ используйте кнопку SELECT * FROM ...... для выбора полей. Это вызывает много накладных расходов для SQL Server. Укажите ваши столбцы - и выберите ТОЛЬКО те, которые вам действительно нужны - не только все из них, черт возьми ...

1 голос
/ 22 декабря 2008

хорошо, это запрос в

    SELECT 
        TBL.*
    FROM
        FOREINGDATABASE..TABLENAME TBL
            LEFT JOIN Status S 
                    ON TBL.Status = S.Number
    WHERE
    (TBL.ID = CASE @Reference WHEN 0 THEN TBL.ID ELSE @Reference END) AND
    TBL.Date >= @FechaInicial AND 
    TBL.Date <= @FechaFinal AND
    (TBL.Channel = CASE @Canal WHEN '' THEN TBL.Channel ELSE @Canal END)AND
    (TBL.DocType = CASE @TipoDocumento WHEN '' THEN TBL.DocType ELSE @TipoDocumento END)AND
    (TBL.Document = CASE @NumDocumento WHEN '' THEN TBL.Document ELSE @NumDocumento END)AND
    (TBL.Login = CASE @Login WHEN '' THEN TBL.Login ELSE @Login END)AND
    (TBL.Login IS NULL AND TBL.Login <> 'dev' )  AND
    TBL.Status IN ('1','2')

ключевые поля должны быть всегда в условии where ???

1 голос
/ 22 декабря 2008

SQL Server имеет «Помощник по настройке ядра СУБД», который может вам помочь. Это не существует для SQL Server Express, но существует для всех других версий SQL Server.

  • Загрузите ваш запрос в окне запроса.
  • В меню выберите Запрос -> Анализ запроса в компоненте Database Engine. Советник по настройке

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

1 голос
/ 22 декабря 2008

Проверьте ваши запросы и найдите, какие поля используются для их соответствия. Обычно это лучшие кандидаты!

0 голосов
/ 22 декабря 2008

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

0 голосов
/ 22 декабря 2008

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

0 голосов
/ 22 декабря 2008

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

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...