Привет!

>> Это публичная конференция, тут каждый сам решает - присоединяться к
>> ветке или нет.  :)
> Просто Ваша задача существенно превосходит мой уровень - решил немного
> самообразованием заняться :)

Нифига, тут есть товарищи, которые курят куда более тяжелую траву :))

>> "order by 2 desc" - сортировка по второму полю (количество ключевых

> Сначала так и подумал, потом усомнился - ведь Вы же количество считаете
> и к оптимизации стремитесь. Начали мелкать мысли по поводу sort-buffer и
> cursor stability - и под конец совсем запутался :)

Правильно. Но я исходил из того соображения, что количество записей в
"виртуальной" таблице, с которой происходит объединение - несравнимо
мало, по сравнению с таблицей текстовых индексов - там ну от силы
десяток записей, а в индексах - 12 миллионов. Так что натурал по
rdb$database - это ну никак не тормоза. Вот натурал по индексной
таблице - это жжж.. :)


>> Правильно. Но первый вариант мне почему-то нравится больше и order by
>> 2 desc тут не смотрится

> Да, действительно. Я предположил, что может быть некоторое различие в 
> быстродействии между отбором через where во внешнем запросе и having в
> derived table, не отражаемое в плане - было бы интересно узнать, не
> домыслы ли это.

Вот тут надо к поставщикам тяжелых... медпрепаратов обратиться - к
Димам, Владу или Алексу :) Если они будут не заняты - мне тоже было бы
интересно узнать ответ. Хотя по логике - зачем серверу врать и делать
что-то, не отраженное в плане?



>>
>> Запрос с 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.

Ну то обсуждение я видел, но прокомментировать не могу.


> Так вот интересно, если убрать сортировку по индексу, то сможет ли этот
> вариант конкурировать с остальными двумя?

А как ее убрать? Рулить хинтом оптимизатору +0, как в твоем запросе? О
результатах - ниже. ;-)


> 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

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

Слегка переделанный запрос (только имена полей добавил, чтобы сервер
не ругался, тоже результат третьего исполнения):

select count(1) as cnt  from t_documents d,
         (select w.document_id+0 as doc_id 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.doc_id

Plan
PLAN JOIN (SORT (IDX W INDEX (T_SEARCH_WORDS_IDX1, T_SEARCH_WORDS_IDX1, 
T_SEARCH_WORDS_IDX1)), D INDEX (PK_T_DOCUMENTS))


Adapted Plan
PLAN JOIN (SORT (IDX W INDEX (T_SEARCH_WORDS_IDX1, T_SEARCH_WORDS_IDX1, 
T_SEARCH_WORDS_IDX1)), D INDEX (PK_T_DOCUMENTS))

Prepare time = 203ms
Execute time = 780ms
Avg fetch time = 780,00 ms
Current memory = 67 378 548
Max memory = 78 021 200
Memory buffers = 4 000
Reads from disk to cache = 11 335
Writes from cache to disk = 0
Fetches from cache = 73 914

Т.е. ничем по сути не лучше - большее время запроса на пару мс не
считается, так как сейчас сервер реиндексирует базу с обновленным
словарем.

Я тут другую хрень обнаружил - об этом в соседней ветке.


-- 
Best regards,
 Sergey                            mailto:[EMAIL PROTECTED]


Ответить