включенные столбцы для некластеризованного индекса - PullRequest
3 голосов
/ 01 июня 2011

Hello
У меня есть таблица с большим количеством записей (11 миллионов). Записи имеют внешний идентификатор, дату и некоторые другие поля.
У меня есть запрос, который я запускаю в моем приложении так часто. Запрос выглядит примерно так:


if( SELECT * FROM myTable WHERE Date=@Date AND ForeignID=@ForeignID != 0 )    
     UPDATE myTable SET ....... WHERE Date=@Date AND ForeignID=@ForeignID
else
     INSERT INTO myTable(......) VALUES(.....)

Я хочу добавить «Дата» в качестве некластеризованного индекса. Затем, если я добавлю столбец «ForeignID» в качестве включенного столбца для этого индекса, поможет ли это выполнение запроса быстрее?
Спасибо.

Ответы [ 4 ]

3 голосов
/ 01 июня 2011

Я согласен с @gbn, что вам нужен индекс для Date и ForeignID, а не для "Включить столбец".

Вы можете создать его следующим образом:

CREATE NONCLUSTERED INDEX [IDX1] ON [myTable] ([Date], [ForeignID])

Однако "Выбрать* "не очень хороший способ проверить наличие записи.Вы можете использовать пункт «EXISTS»

1 голос
/ 01 июня 2011

Вам нужен индекс как для Date, так и для ForeignID, с датой в первую очередь. Это фильтр (в предложении WHERE), поэтому он должен быть в ключевых столбцах, а не в столбцах INCLUDE

Кроме того, ваш шаблон test..update..else..insert не масштабируется. См. this для других способов сделать это: Выбор / вставка версии Upsert: есть ли шаблон проектирования для высокого параллелизма?

1 голос
/ 01 июня 2011

Добавление ForeignID поможет, так как индекс будет охватывать подзапрос, и ему не нужно будет извлекать ForeignID из таблицы.

Однако лучше добавить уникальное ограничение или индекс для Date и ForeignID.

Как это:

create unique index IX_MyTable_Date_ForeignID on MyTable(Date, ForeignID)

Кроме того, вы можете использовать оператор MERGE для этого типа запроса. Зависит от того, какую версию SQL вы используете.

0 голосов
/ 01 июня 2011

Да, я ожидал бы, что он значительно ускорит этот запрос (вам нужно сделать выбор *?)

, но это замедлит вставки в таблицу, поскольку у нее есть другой индекс для записи - он будеточевидно, также увеличьте размер БД.

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

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