У меня есть запрос, который выглядит следующим образом:Правильный порядок столбцов в индексе в SQL Server
select top 1
a
, b
, c
from table
where x = 1
and y = 2
and z > getdate()
order by
b desc
, c desc
и индекс, как:
create index idx_ on table
(
x
, y
, z
, b
, c
)
include (a)
Моя проблема заключается в том, что после фильтров я оставил с около 6 млн записей. И SQL Server также не будет сортировать на основе индекса, и из-за этого времена для этого запроса очень большие.
план выглядит следующим образом:
select (0%) <- TOP N SORT (94%) <= INDEX SEEK (6%)
Как я могу выбрать столбцы для индекса или, возможно, изменить выбор таким образом, чтобы я мог извлечь выгоду из индекса.
Кроме того, выбор должен быть в состоянии вписаться в наружное наложение, что является основной причиной не разбивать его на кусочки. Поле x является тем, на котором внешние ссылки выбора.
В качестве обновления на вопрос, весь SQL выглядит следующим образом:
select
*
from #tmp_xs xs
outer apply
(select top 1
a
, b
, c
from table
where x = xs.rel_x
and y = 2
and z > getdate()
order by
b desc
, c desc) xs_res
По какой-то причине для вышеупомянутого сервера SQL-запрос будет использовать только индекс фильтрации. Если внутренний запрос помещен внутри встроенной функции, результат будет схожим. Если я не помещаю его в встроенную функцию, оба индекса работают, и запрос выполняется очень быстро.
Этот индекс может использоваться для процесса выбора - поскольку в нем запрашиваются 'x, y, z'. Он ** не может использоваться ** для сортировки, так как столбцы сортировки 'b' и' c' ** не ** - самые левые столбцы в этом индексе! Я предлагаю вам создавать по индексу на '(x, y, z)' для выбора, а второй - отдельный индекс на '(b, c)' для заказов –
Спасибо, он работал отлично .. хотя я делаю не знаю, как пометить его как правого. –
Вопрос в том, почему после того, как он был помещен внутрь внешнего, он возвращается к более раннему плану (например, выше, не используя второй индекс). –