Неожиданное сканирование таблицы на id! = Id - PullRequest
11 голосов
/ 16 мая 2009

Одно приложение вызывает большую нагрузку на нашу базу данных Sql Server 2005. Мы не контролируем приложение , которое выполняет этот запрос раз в минуту:

select id,col1,col2,col3 from table where id != id

Обратите внимание на id! = Id , что означает, что строка не равна самой себе. Неудивительно, что в результате всегда не найдено ни одной строки. Однако Sql Server выполняет сканирование кластерного индекса каждый раз, когда запускает этот запрос!

Столбец id определяется как:

varchar(15) not null primary key

В плане запроса указано огромное количество «Расчетное количество рядов». У кого-нибудь есть идея, почему Sql Server требуется сканирование таблицы, чтобы выяснить очевидное?

Ответы [ 13 ]

1 голос
/ 17 мая 2009

Будучи менее знакомым с SQL Server, я думаю, что приведенное ниже решение может также относиться к SQL Server.

В Oracle я думаю, что вы можете перехитрить наивный SQL, используя материализованное представление и переписывание запросов. Материализованное представление не будет содержать строк, и переписанный запрос распознает SQL и перенаправляет запрос в пустое представление. Материализованное представление никогда не нужно будет обновлять, поскольку оно всегда будет пустым.

1 голос
/ 16 мая 2009

Я не знаю, почему в этом случае id! = Id занимает так много времени (хотя «очевидное» субъективно - это не обязательно оптимизация, о которой я думаю ... это необычный запрос; декартово присоединиться это больно, хотя). Но в общем, попробуйте "где 1 = 0" - или, если вы просто хотите схему, возможно, слегка рискованно УСТАНОВИТЬ FMTONLY ON .

Редактировать: только что увидел "Мы не контролируем приложение, которое выполняет этот запрос сотни раз в минуту" ... хммм ..., что делает его сложным.

0 голосов
/ 18 мая 2009

нет способа сделать это не сканированием, вы запрашиваете все, кроме 1 строки, то есть сканирования. Лучшее, на что вы можете надеяться, - это чтобы приложение перестало отправлять эти запросы.

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