TSQL Поиск большой индексированной базы данных с использованием LIKE - PullRequest
0 голосов
/ 29 сентября 2010

У меня есть база данных, содержащая адреса, по одному адресу на строку.Содержит каждый адрес в Великобритании, так что ~ 28 миллионов строк.Одна из колонок - «Улица», которую я использую для поиска.У меня есть неуникальный некластеризованный индекс для этого столбца.

Однако у меня несоответствия со скоростью поиска.

select * from Postcodes where Street = 'London Road'

Занимает ~ 1 с.1007 *

Точно так же требуется около секунды.

declare @Street varchar(20) = 'London Road%'
select * from Postcodes where Street like @Street

Однако это утверждение, хотя и явно идентично второму, занимает около 40 секунд.

Я вполная потеря того, что вызывает эту разницу в скорости.Есть идеи?

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

Если вы знаете заранее, у вас никогда не будет лидирующих подстановочных знаков, и вы используете SQL Server 2008, вы можете попробовать

declare @Street varchar(20) = 'London Road%'
SELECT * FROM 
Postcodes WITH (FORCESEEK)
where Street like @Street
1 голос
/ 29 сентября 2010

Проблема в том, что MSSQLServer не может заранее знать, что будет содержаться в переменной @Street, поэтому он не может использовать индекс для столбца Street.

Если ваш оператор:

select * from Postcodes where Street = 'London';
select * from Postcodes where Street like 'London Road%';

Может использоваться индекс для столбца Street, поскольку он знает, что строка начинается с London.

Если ваш оператор:

select * from Postcodes where Street like @VariableName;

Он не может использовать индекс, потому что с этим оператором вы должны иметь возможность:

select * from Postcodes where Street like 'London%';
select * from Postcodes where Street like '%London%';

Или любое другое допустимое значение для VariableName.Это типичная проблема в предварительно скомпилированных инструкциях.

Что вы можете сделать, это использовать строку напрямую или не использовать параметры и изменить свой оператор на динамический оператор SQL в TSQL.

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