2009-07-31 1 views
1

Запуск следующего запроса (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) 

Id является первичным кластерным ключом Существует неуникальный индекс имени и уникальный композитный индекс по ид/имени Существуют и другие колонны - для их краткости их краткость

+0

Что типы данных/схемы, пожалуйста? – gbn

ответ

3

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

declare @p varchar(13) 

Если нет, то о комплектовке coercien? Разве база или сервер отличается от столбца?

declare @p varchar(13) COLLATE Latin1_General_CI_AS NOT NULL 

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

SET SHOWPLAN_TEXT ON 
GO 
+0

Большое спасибо - переход на варчар (13) сделал трюк. Я понятия не имел, что размер переменной может изменить план выполнения. Не могли бы вы объяснить, почему? И еще раз спасибо. – PaulB

+0

@PaulB: varchar (13) будет изменен на varchar (20), который будет проигнорирован индексом, и сканирование произойдет = медленнее ... очень поздно ответ извините – gbn

0

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

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

Он преобразует @p в nvarchar, потому что он имеет более высокий приоритет, а не столбец – gbn

+0

yep, вы правы! :) –