|
|
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
ну и где же тут оптимальность его работы? два запроса, возвращающие одну и ту же запись, выполняются один быстрее, другой медленнее. обоснуй, плиз, своё утверждение. ты вот с этим авторя так думаю, что сервер идёт по индексу и для каждой записи c itemid=1 (а их порядка 300) выполняет один и тот же подзапрос согласен? если нет, объясни, где я неправ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2004, 18:46:29 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
>Dedushka Mazai Ёкарный бабай ! Ну нельзя же так тупить, ей богу ! :) Для некореллированного запроса вложенный запрос выполняется ОДИН РАЗ . После чего вып-ся внешний. Для коррелированного запроса вложенный запрос выполняется СТОЛЬКО РАЗ, СКОЛЬКО ЗАПИСЕЙ в таблице itemvalues. Чего тут может быть неясно ??????????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 10:57:11 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
авторНу нельзя же так тупить, ей богу ! туплю, кажися, не я :) авторвложенный запрос выполняется СТОЛЬКО РАЗ, СКОЛЬКО ЗАПИСЕЙ в таблице itemvalues. - это ты погорячился. сколько себя помню, всегда считал, что коррелированный подзапрос выполняется столько раз, сколько записей возвращает основной запрос так что, борис - ты неправ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 11:51:57 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
2 Дедушка. Если коррелирующий подзапрос - в условии Where, то прав Йохмен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 11:55:38 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
Ты говоришь про общую голую теорию безотносительно какого "типа" вложенный запрос. А я тебе - про конкретный твой запрос. Но если ты хочешь "подогнать" под неё, считай "столько раз, сколько записей возвращает основной запрос", в данном случае = сколько записей в таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 11:59:21 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
ну не может он выполняться для всех записей, не может. в таблице их больше 3 млн. Простой select count по этой таблице выполняется 3 сек, а этот меньше секунды. к тому же Perfomance Analysis показал, что было выполнено 100 с лишним тысяч чтений индекса, но никак не 3 млн и не NATURAL, если бы эта ботва выполнялась для ВСЕХ записей из таблицы. авторТы говоришь про общую голую теорию безотносительно какого "типа" вложенный запрос. а коррелированные подзапросы бывают разных типов? авторНо если ты хочешь "подогнать" под неё, считай "столько раз, сколько записей возвращает основной запрос", в данном случае = сколько записей в таблице. уточняю ещё раз: оба запроса (с коррелированным и некоррелированным подзапросами) возращают ОДНУ запись, ОДНУ! а не все 3 млн. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 12:57:08 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
такое ощущение, что мы о разных вещах говорим. ладно, Johnmen, давай по-другому. вот тебе запрос: select iv.ivalue, iv.ondate from itemvalues iv where iv.itemid=1 and iv.ondate= (select max(ondate) from itemvalues where itemid=iv.itemid and ondate<='1.1.2005') а теперь, если тебе не сложно, объясни мне алгоритм, по которому сервер формирует результирующий набор данных (желательно в терминологии бд). я не исключаю, что меня переклинило: в таком случае ткни меня, плиз, носом в этот клин, за что буду тебе весьма благодарен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 15:14:35 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
"Пришить бы вас всех..." Доцент (original). Джентльмены удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 15:18:03 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
2mv: спасибо, я уже просёк, что от тебя ничего конструктивного не дождёшься ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 15:22:00 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
Dedushka Mazaiselect iv.ivalue, iv.ondate from itemvalues iv where iv.itemid=1 and iv.ondate= (select max(ondate) from itemvalues where itemid=iv.itemid and ondate<='1.1.2005') для внешнего запроса сканируется индекс IV_IDX для условия iv.itemid=1. это даёт не 1-у запись, а много больше для каждой полученной записи выполняется кореллированный подзапрос и фильтрует их по условию iv.ondate = (select max(ondate) ... Проблемы оптимизатора в том, что он не понимает того, что подзапрос на самом деле не кореллированный, т.е. не комбинирует условие корелляции itemid=iv.itemid с условием внешнего запроса iv.itemid=1. Не уверен, что он должен это делать ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 15:54:52 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
ну наконец-то автордля внешнего запроса сканируется индекс IV_IDX для условия iv.itemid=1. это даёт не 1-у запись, а много больше на самом деле это даёт одну запись, хотя перебирает он их все в процессе сканирования индекса(их у меня 355 для itemid=1) ну а дальше автордля каждой полученной записи выполняется кореллированный подзапрос и фильтрует их по условию iv.ondate = (select max(ondate) ... вот о чём я и говорю: он 355 раз выполняет один и тот же подзапрос. 355*355=126025. аналайзер показал 126380 чтений индекса - как раз где-то так и выходит. порядка 300 чтений серверу надо чтобы по дереву добраться до itemid=1. авторПроблемы оптимизатора в том, что он не понимает того, что подзапрос на самом деле не кореллированный, т.е. не комбинирует условие корелляции itemid=iv.itemid с условием внешнего запроса iv.itemid=1. Не уверен, что он должен это делать ;) получается, что проблемы таки есть. то бишь оптимизатор не оправдывает возложенных на него надежд. собственно, проверять коррелированный подзапрос на некоррелированность от него и не требуется. нужно всего лишь проверить, изменились ли параметры для вложенного подзапроса при переборе записей основного, и выполнять подзапрос только в том случае, если изменение имело место. а так получается мартышкин труд. так это у меня и данных-то немного, а положим что их количество вырастет в несколько раз - так тут такие тормоза начнутся, что мама не горюй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 16:14:53 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
>Dedushka Mazai Учти в своих рассуждениях ещё один существенный в данном случае момент. Булево выражение вычисляется не слева-направо, а справа-налево. Если опять что-то будет неясно, то в понедельник... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 16:52:02 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
Dedushka Mazaiну наконец-то автордля внешнего запроса сканируется индекс IV_IDX для условия iv.itemid=1. это даёт не 1-у запись, а много больше на самом деле это даёт одну запись, хотя перебирает он их все в процессе сканирования индекса(их у меня 355 для itemid=1)Нет, это даёт 355 записей, т.к. используется только один сегмент индекса (itemid) а для второго значение еще не определено Dedushka Mazai авторПроблемы оптимизатора в том, что он не понимает того, что подзапрос на самом деле не кореллированный, т.е. не комбинирует условие корелляции itemid=iv.itemid с условием внешнего запроса iv.itemid=1. Не уверен, что он должен это делать ;) получается, что проблемы таки есть. то бишь оптимизатор не оправдывает возложенных на него надежд.Проблемы у всех есть. Если видишь - обходи. В данном случае это не сложно. Dedushka Mazaiсобственно, проверять коррелированный подзапрос на некоррелированность от него и не требуется. нужно всего лишь проверить, изменились ли параметры для вложенного подзапроса при переборе записей основного, и выполнять подзапрос только в том случае, если изменение имело место. а так получается мартышкин труд. так это у меня и данных-то немного, а положим что их количество вырастет в несколько раз - так тут такие тормоза начнутся, что мама не горюй Можешь оформить bug report на SF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2004, 16:59:55 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
JohnmenУчти в своих рассуждениях ещё один существенный в данном случае момент. Булево выражение вычисляется не слева-направо, а справа-налево. а это здесь каким боком? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2004, 14:52:52 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
>Dedushka Mazai select iv.ivalue, iv.ondate from itemvalues iv where iv.itemid=1 and iv.ondate= (select max(ondate) from itemvalues where itemid=iv.itemid and ondate<='1.1.2005') Поменяй местами сравнения вокруг and. И еще раз посмотри статистику выполнения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2004, 15:50:21 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
ничего не поменялось - всё по-прежнему. а какие тут могут быть проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2004, 16:26:43 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
Johnmen select iv.ivalue, iv.ondate from itemvalues iv where iv.itemid=1 and iv.ondate= (select max(ondate) from itemvalues where itemid=iv.itemid and ondate<='1.1.2005') Поменяй местами сравнения вокруг and. И еще раз посмотри статистику выполнения... Это ты зря. Слева направо или наоборот - это порядок вычисления предикатов. В данном случае индексный поиск произойдет ранее. А потом порядок уже пофиг - "iv.itemid = 1" всегда будет истинно и влиять на подзапрос не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2004, 18:08:41 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
>dimitr >Это ты зря. Слева направо или наоборот - это порядок вычисления >предикатов. Где там предикаты ? М.б.все же булевого выражения ? :) >В данном случае индексный поиск произойдет ранее. А потом порядок уже >пофиг - "iv.itemid = 1" всегда будет истинно и влиять на подзапрос не будет. Возможно ты прав. Но это заслуга парсера и оптимизатора. Тогда в случае =1 выполнение подзапроса неизбежно. Т.е. он выполнится столько раз, сколько записей с =1. А вот во втором случае (см.выше) только один раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2004, 18:24:24 |
|
||
|
Где грабли?
|
|||
|---|---|---|---|
|
#18+
Взято из Release Notes для Firebird 1.5.1 Old tracking logic bug fixed A nested query that contained a variable in the WHERE clause would be erroneously flagged as invariant (SF #627057 and #922602), e.g. select max(d2.id) from demo d2 where d2.id < :id Request cloning logic was broken. Clones of procedures/triggers were not accounting for invariants and the requests opened by them at all. Thus, they were inheriting invariant values from previous executions and were not freeing resources (highly limited! - you can have only 1000 copies of a request open). This is why most recursive procedures didn't work at all and using procedures from multiple Superserver connections produced results that were inconsistent or timing-dependent. Invariant dependency tracking was not working properly. The engine now keeps account of which variables an invariant depends on and clears the cached invariant value when values are being assigned to these variables. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2004, 09:16:04 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32624638&tid=1578180]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
188ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 501ms |

| 0 / 0 |
