Получение запроса для поиска по индексу (а не для сканирования) - PullRequest
1 голос
/ 31 июля 2009

При выполнении следующего запроса (SQL Server 2000) план выполнения показывает, что он использовал поиск по индексу, а Profiler показывает, что он выполняет 71 чтение с длительностью 0.

select top 1 id from table where name = '0010000546163' order by id desc

Сравните, что при следующем использовании индексное сканирование выполняется с 8500 чтениями и длительностью около секунды.

declare @p varchar(20)
select @p = '0010000546163'
select top 1 id from table where name = @p order by id desc

Почему план выполнения отличается? Есть ли способ изменить второй метод поиска?

спасибо

EDIT

Таблица выглядит как

CREATE TABLE [table] (
    [Id] [int] IDENTITY (1, 1) NOT NULL ,
    [Name] [varchar] (13) COLLATE Latin1_General_CI_AS NOT NULL)

Идентификатор - это первичный кластерный ключ. Существует неуникальный индекс по имени и уникальный составной индекс по идентификатору / имени Есть и другие столбцы - опущу их для краткости

Ответы [ 2 ]

3 голосов
/ 31 июля 2009

Теперь вы добавили схему, пожалуйста, попробуйте это. SQL Server обрабатывает разницу в длине как разные типы данных и преобразует столбец varchar(13) в переменную varchar(20)

declare @p varchar(13)

Если нет, то как насчет collation coercien? Отличается ли БД или сервер от столбца?

declare @p varchar(13) COLLATE Latin1_General_CI_AS NOT NULL

Если нет, добавьте это до и опубликуйте результаты

SET SHOWPLAN_TEXT ON
GO
0 голосов
/ 31 июля 2009

Если столбец имени - NVARCHAR, тогда ваш параметр также должен быть того же типа. Затем он должен получить его по индексу поиска.

declare @p nvarchar(20)
select @p = N'0010000546163'
select top 1 id from table where name = @p order by id desc
...