Запрос не использует поиск по индексу - PullRequest
0 голосов
/ 12 июля 2011

У меня есть таблица, скажем, Table1, которая имеет два столбца

ID       Field1
-------  -------------
INT      VARCHAR(MAX)

Таблица имеет ок.100 000 записей и ID является первичным ключом и имеет уникальный индекс для столбца 'Field1'.Я выполняю следующий запрос

SELECT T11.ID FROM Table1 T11
INNER JOIN dbo.MyFunc() T22
ON T11.Field1 = T22.ElementValue

Данный запрос имеет высокую стоимость ввода-вывода.Он выполняет сканирование индекса по полю 1 таблицы 1, но не использует поиск по индексу.MyFunc - это пользовательская функция, которая возвращает табличную переменную схемы (ElementValue VARCHAR (MAX)).Здесь для простоты я пропустил переменные, переданные MyFunc.Но если я выполню следующий запрос, он будет быстрым и будет использовать поиск по индексу

SELECT T11.ID FROM Table1 T11
WHERE T11.Field1 = 'Test'

MyFunc также возвращает 'Test' как переменную таблицы, состоящую из одного столбца и одной строки.не может избежать использования MyFunc.у него есть некоторый повторно используемый код, который используется в no.хранимых процедур.

Пожалуйста, предложите любую альтернативу, чтобы сделать это быстро.

РЕДАКТИРОВАТЬ: Я нашел, где была проблема.На самом деле это было несоответствие данных.В MyFunc я использовал NVARCHAR, но Field1 был VARCHAR.Когда я изменил NVARCHAR на VARCHAR, оптимизатор запросов правильно выбрал индекс

1 Ответ

0 голосов
/ 12 июля 2011

если myfunc () всегда возвращает одну строку, возможно, вы могли бы сделать что-то вроде ...
select @myvar = elementvalue from dbo.myfunc()
select t11.id from table1 t11 where t11.field1 = @myvar

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