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

Sergey Mereutsa wrote:
Нифига, тут есть товарищи, которые курят куда более тяжелую траву :))
За полетом их мысли я даже следить не пытаюсь :)


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

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

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

Было у меня смутное воспоминание, что какие-то операции в плане
не учитывались - видимо та, о которой говорил Дмитрий.


В этом случае и отбор записей, и сортировка идут по индексу - насколько
я помню, это нехорошо. Эта проблема недавно здесь обсуждалась - ветка "странное время выполнения запроса" от Kochmin Alexandr.

Ну то обсуждение я видел, но прокомментировать не могу.
Собственно, теоретическое обоснование приводил Д. Кузьменко
(см ссылку в его посте от 03.07.2007 11:43).

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

А как ее убрать? Рулить хинтом оптимизатору +0, как в твоем запросе?
Ну да. Альтернатива для эстетов - cross join rdb$database :)


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


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

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

Ну количество чтений с диска все же поменьше, так что есть шанс, что
он обскачет Ваш первоначальный вариант :)

Кстати, что касается оптимизации запросов.
Правильно ли я понимаю, что Reads from disk характеризуют нагрузку
на дисковую подсистему, а Fetches from cache - на память и процессор?

Можно ли с уверенностью предсказать Execute time (или хотя бы ранжировать их) на незанятом сервере, зная эти параметры?

В Вашем случае имеем
Ваш I II Iopt


Execute time =        764ms         2s 886ms        624ms        X
Reads from disk
to cache =            17 542        15 229          8 801       11 335
Fetches from cache =  73 787        93 782          133 848     73 914

Думается все же, что X < 764, хотя зависимость неясна.

Интересно, сможет ли Iopt соперничать с II вариантом Влада Хорсуна при
возрастании числа ключевых слов?

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

Ответить