Доброго времени суток!
Sergey Mereutsa wrote:
Это публичная конференция, тут каждый сам решает - присоединяться к
ветке или нет. :)
Просто Ваша задача существенно превосходит мой уровень - решил немного
самообразованием заняться :)
"order by 2 desc" - сортировка по второму полю (количество ключевых
слов, найденных в документе). Это общая конструкция - на нее может, а
может и не, накладываться условие отсечения and cnt=3 (3 - это
количество ключевых слов в данном случае). Грубо (абсолютно не точно)
- это сортировка по "релевантности" - т.е. документы, в которых
встречаются 3 из 3-х слов идут первыми, затем те, в которых 2 из 3 и
т.д. У гугла понятие релевантности отличается - как и у яндекса.
Сначала так и подумал, потом усомнился - ведь Вы же количество считаете
и к оптимизации стремитесь. Начали мелкать мысли по поводу sort-buffer и
cursor stability - и под конец совсем запутался :)
Правильно. Но первый вариант мне почему-то нравится больше и order by
2 desc тут не смотрится
Да, действительно. Я предположил, что может быть некоторое различие в
быстродействии между отбором через where во внешнем запросе и having в
derived table, не отражаемое в плане - было бы интересно узнать, не
домыслы ли это.
или, если взять за основу вариант Влада Хорсуна,
select count(1) from t_documents d,
(select w.document_id from t_search_words w cross join rdb$database
where w.lang_id=2 and w.flag=1
and w.word in (2624961196, 1902388292, 1228066714)
group by 1
having Count(1) = 3) idx
where d.lang_id=2
and d.published_when>='01.07.2002'
and d.published_when<='02.07.2007'
and d.publisher_id =36149
and d.id=idx.document_id ?
Запрос с IN(), как я показал - в моем случае тормознутее :))
План
PLAN JOIN (SORT (IDX W ORDER FK_T_SEARCH_WORDS_1 INDEX
(T_SEARCH_WORDS_IDX1, T_SEARCH_WORDS_IDX1, T_SEARCH_WORDS_IDX1)), D
INDEX (PK_T_DOCUMENTS))
В этом случае и отбор записей, и сортировка идут по индексу - насколько
я помню, это нехорошо. Эта проблема недавно здесь обсуждалась - ветка
"странное время выполнения запроса" от Kochmin Alexandr.
Так вот интересно, если убрать сортировку по индексу, то сможет ли этот
вариант конкурировать с остальными двумя?
Собственно, я стормозил - несмотря на RN, решил что группировки по
выражениям нету. Начал думать, как вырубить ORDER FK_T_SEARCH_WORDS_1 и
додумался до такого извращения, как cross join с rdb$database.
Вариант должен быть таким
select count(1) from t_documents d,
(select w.document_id+0 from
t_search_words w
where w.lang_id=2 and w.flag=1
and w.word in (2624961196, 1902388292, 1228066714)
group by 1
having Count(1) = 3) idx
where d.lang_id=2
and d.published_when>='01.07.2002'
and d.published_when<='02.07.2007'
and d.publisher_id =36149
and d.id=idx.document_id
Если интересно, просьба сравнить в быстродействии.
Спасибо!
С уважением, Евгений.