Доброго времени суток!

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

Если интересно, просьба сравнить в быстродействии.
Спасибо!

С уважением, Евгений.

Ответить