Я просто заметил, что мой запрос:Как переписать запрос в соответствии с CLUSTERED INDEX?
SELECT X.A, X.B, X.GroupName
FROM TableA X
INNER JOIN TableB Y -- Huge table
ON (X.A = Y.Name OR X.B = Y.Name)
TableB
имеет CLUSTERED INDEX
на колонке Name
из-за которой этот запрос вез часы для запуска. Так что я должен был переписать запрос как:
SELECT X.A, X.B, X.GroupName
FROM TableA X
INNER JOIN TableB Y -- Huge table
ON X.A = Y.Name
UNION
SELECT X.A, X.B, X.GroupName
FROM TableA X
INNER JOIN TableB Y -- Huge table
ON X.B = Y.Name
Это один работает в течение нескольких секунд или, в худшем случае, минут. Хотя я понимаю причину теперь после сжигания себя, мне было интересно, есть ли более чистый способ написать этот запрос. Я думал о CTE, но тогда ON X.A = Y.Name
и ON X.B = Y.Name
похожи на параметры, и я не уверен, как с этим справиться.
Мой фактический запрос очень большой, поэтому я хочу избежать повторения его два раза ради наличия UNION
. Какие-либо предложения?
+1 Спасибо. Эти ссылки были полезны! Тогда я буду придерживаться этого. Мне было интересно - есть ли компактный способ написания этого запроса (например, использование CTE или что-то в этом роде), или я должен повторить свой запрос дважды? – Legend
Вам не нужно делать это с помощью MS SQL Server.Я вижу, что обе эти статьи были для Oracle, когда я делаю min и max в большой (174-миллиметровой строке) таблице в SQL Server, в плане запроса показаны два пути выполнения и почти сразу получается результат. –
@JasonGoemaat OP указал, что это не был его фактический запрос. Не проверяя фактический план запроса, нет хорошего способа убедиться, эффективно ли он использует индексы. Возможно ли, что MSSQL можно отговорить от использования индекса из-за какой-то странной структуры запросов. – Matthew