Сначала напишите запрос, чтобы не было необходимости в преобразовании типов. Все сравнения в предложении where
относятся к числам, поэтому используйте числовые константы:
SELECT s.*,
sl.session_id, -- unnecessary because s.id is in the result set
sl.lesson_id
FROM cdu_sessions s INNER JOIN
cdu_sessions_lessons sl
ON sl.session_id = s.id
WHERE s.sort = 1 AND
s.enabled = 1 AND
s.teacher_id IN (193, 1, 168, 1797, 7622, 19951);
Хотя это может не произойти в этом конкретном случае, типы смешивания могут препятствовать использованию индексов.
Я удалил столбец как псевдонимы (например, as session_id
). Они были избыточными, потому что имя столбца является псевдонимом, а запрос не менял имя.
Для этого запроса сначала посмотрите на предложение WHERE
. Все ссылки на столбцы взяты из одной таблицы. Они должны войти в индекс, прежде всего для сравнения равенств:
create index idx_cdu_sessions_4 on cdu_sessions(sort, enabled, teacher_id, id)
Я добавил id
, потому что он также используется в JOIN
. Формально id
не требуется в индексе, если он является первичным ключом. Тем не менее, мне нравится быть явным, если я хочу это там.
Далее вам нужен индекс для второй таблицы. Оттуда ссылаются только два столбца, поэтому они оба могут войти в индекс. Первый столбец должен быть тем, который используется в join
:
create index idx_cdu_sessions_lessons_2 on cdu_sessions_lessons(session_id, lesson_id);
Спасибо Ivan. Управляемый для возможного получения этой работы путем запуска всего с нуля. Это походит на порядок, в котором сделаны вещи, имеет большое значение, и совет, данный на связанном блоге выключить 'load_os_resources', устанавливающий после загрузки iFilter, вероятно, не является наилучшим вариантом, поскольку это заставит iFilter не быть загруженным, когда SQL Server будет перезапущен.
Если я вспоминаю правильно, последовательность шагов, которые в конечном счете работали на меня, была следующие:
Хотя это добилось цели, я совершенно уверен, что выполнил эти шаги несколько раз, прежде чем это в конечном счете начало работать правильно.
Я только что боролся с ним в течение часа, но наконец получил его работа. Я сделал все, что Вы сделали, поэтому просто пытаетесь упростить запрос (я заменил *
с именем поля и удаленными двойными кавычками на термине):
SELECT MediaFileId, FileExtension FROM MediaFile WHERE CONTAINS(FileContent, 'house')
Также, когда Вы создаете полнотекстовый индекс, удостоверяются, что Вы указываете язык. И последняя вещь, возможно, можно попытаться изменить тип поля от Image
кому: varbinary(MAX)
.