И ещё раз привет). Может быть кто-то сталкивался с подобной проблемой.
Есть дурацкий запрос от приложения вот такого типа (воспроизвести можно на БД StackOverflow2013):
SELECT *
FROM dbo.Posts p
WHERE CHARINDEX(N'Aptana', p.Title) > 0
реальная таблица - шире чем dbo.Posts, там куча разных nvarchar'ов, включая MAX, один из них - ФИО (nvarchar(400)) и внтури ФИО ищут по фамилии.
Понятно, что запрос сваливается в Clustered Index Scan.
Но обычно, в 99% случаев, возвращается очень небольшое количество строк. Сама таблица > 50 млн записей, а возвращается таким запроосом обычно, ну, 1000.
Запрос и структуру БД я поменять не могу. Хотел сделать вот что:
1. Добавить некластерный индекc: CREATE INDEX myPleasureSort ON dbo.Posts (Title);
2. Plan guide'ом добавить INDEX HINT.
Когда пробую выполнить вот такое:
SELECT *
FROM dbo.Posts p
WHERE CHARINDEX(N'Aptana', p.Title) > 0
OPTION (MAXDOP 1, TABLE HINT(p, INDEX (myPleasureSort)))
Получаю непонятную сортировку в key lookup. Кто-нибудь может подсказать откуда она берётся и как избавиться от неё?
Если делаю так:
CREATE INDEX myPleasure ON dbo.Posts (Id, Title)
то запрос
SELECT *
FROM dbo.Posts p
WHERE CHARINDEX(N'Aptana', p.Title) > 0
OPTION (MAXDOP 1, TABLE HINT(p, INDEX (myPleasure)))
выполняется нормально, сортировки нет, но при этом индекс не получится использовать для запросов типа LIKE 'smthng%', а такую возможность хотелось бы сохранить.