()
CREATE NONCLUSTERED INDEX foo ON dbo.my_table(B, C DESC) INCLUDE (A);
(Б)
Поскольку A не находится в WHERE
или ORDER BY
, это, вероятно, достаточно для того, чтобы быть в списке столбцов INCLUDE
d, так как это просто «для езды» и необязательно быть частью ключа.
(C)
невозможно ответить без дополнительного контекста. Почему вы включаете только подзапрос, а затем спрашиваете о внешнем запросе, который мы не видим?
EDIT в отношении текущего разговора с @Quassnoi, я просто хотел, чтобы быстро показать, что направление сортировки завершающих столбцов в некластерном индексе может сделать большую разницу на планах, используемых конкретным запрос. Давайте возьмем следующий надуманный пример:
CREATE TABLE dbo.foo1(A INT, B INT, C INT);
CREATE NONCLUSTERED INDEX foo1x ON dbo.foo1(B, C) INCLUDE(A);
CREATE TABLE dbo.foo2(A INT, B INT, C INT);
CREATE NONCLUSTERED INDEX foo2x ON dbo.foo2(B, C DESC) INCLUDE(A);
INSERT dbo.foo1 SELECT TOP (500000) c.[object_id], c.[object_id], -1*c.[object_id]
FROM sys.all_columns AS c CROSS JOIN sys.all_objects
ORDER BY c.[object_id];
INSERT dbo.foo2 SELECT TOP (500000) c.[object_id], c.[object_id], -1*c.[object_id]
FROM sys.all_columns AS c CROSS JOIN sys.all_objects
ORDER BY c.[object_id];
Теперь давайте запустим эти два предложенные запросы и проверить планы:
SELECT A
FROM (
SELECT A, ROW_NUMBER() OVER (PARTITION BY B ORDER BY C DESC) RN
FROM dbo.foo1
) q
WHERE rn = 1;
SELECT A
FROM (
SELECT A, ROW_NUMBER() OVER (PARTITION BY B ORDER BY C DESC) RN
FROM dbo.foo2
) q
WHERE rn = 1;
Вот план запроса к dbo.foo1 (где C является ASC):
И вроде я уже говорил:
А вот план для запроса к DBO.foo2 (где С DESC):
Теперь, если вы добавите ИНЕКЕ внутреннего запроса (например WHERE B = -1024577103), планы более аналогичный. Но тогда это также подразумевает, что PARTITION BY не является необходимым и что для ограничения внешнего запроса это значение B также должно быть сопряжено. Однако моя точка зрения по-прежнему заключается в том, что хотя для конкретного запроса в вопросе направление сортировки каждого столбца в индексе может мало повлиять на план, но это неверно для всех запросов, которые могут использовать один и тот же индекс.
Основываясь на информации, предоставленной невозможно сказать, если это может быть улучшено без подзапроса. Попробуйте различные методы, проверьте свои планы выполнения для каждого и выполните тесты. – GarethD
Какова цель запроса? Чтобы найти все продукты в самом последнем порядке? Есть ли указатель в столбце '[date]'? –
Мы хотим обновить ссылки в нашей собственной базе данных на основе этой справочной таблицы (которая работает с текстовыми номерами вместо идентификаторов). Столбец даты - столбец «C» в приведенном выше примере. У этого есть указатель, который Вы предложили. – Koen