Страница 1 из 1
запросы, планы...
Добавлено: 03 май 2006, 16:25
entryway
FB 1.5, запрос:
Код: Выделить всё
select
main.oorder,
main.id,
ddate,
ttime,
phone2,
ordersstate.state,
phonetypes.ttype,
vvalue1, vvalue2
vvalue3, vvalue4,
vvalue5, vvalue6,
vvalue7, vvalue8,
vvalue9, vvalue10
from allorders main
inner join ordrsstate ordersstate on ordersstate.id = main.state
inner join phonetypes phonetypes on phonetypes.id = main.ttype
inner join ordersparams ordersparams on ordersparams.oorder = main.id
where
(main.ddate >= '2006-05-03') and (main.ddate <= '2006-05-03')
and (allorders.city = 1)
and (main.oorder in (1527, 1088, 145, 1048, 1108, 1117, 1137, 1148))
вот его план:
PLAN JOIN (ORDERSPARAMS NATURAL,MAIN INDEX (RDB$PRIMARY15,ALLORDERS_OORDER,ALLORDERS_OORDER),PHONETYPES INDEX (PK_PHONETYPES),ORDERSSTATE INDEX (ORDRSSTATE_ID))
выполняется - бесконечно (выбраться должно записей 50)
меняем последнюю строчку условия на (main.oorder = 145)
вот план нового запроса
PLAN JOIN (MAIN INDEX (ALLORDERS_OORDER,ALLORDERS_DATE2),PHONETYPES INDEX (PK_PHONETYPES),ORDERSPARAMS INDEX (ORDERSPARAMS_OORDER),ORDERSSTATE INDEX (ORDRSSTATE_ID))
отрабатывает мгновенно
вставляю второй план в первый запрос - отрабатывает мгновенно
убираю два верхних иннер жоина - мгновенно
убираю один нижний жоин - мгновенно
почему так?
Добавлено: 03 май 2006, 16:35
entryway
я отвечу
добавил в ordersparams поле ID праймари кей (не было такого) - все зашуршало
этот мир полон лжи
Добавлено: 03 май 2006, 16:49
kdv
and (main.oorder+0 in
кроме того. не надо писать имена алиасов идентичные именам таблиц. строишь запрос через QueryBuilder - научись задавать алиасы.
Добавлено: 03 май 2006, 16:51
entryway
сами вы строите через квери билдер )))
+0 сейчас попробую
помогло
прикольно и одновременно смешно )
спасибо
Добавлено: 03 май 2006, 17:37
entryway
kdv писал(а):кроме того. не надо писать имена алиасов идентичные именам таблиц
ой еще раз спасибо дяденька :)
не работало ведь ничего.
а никто и не знал...
Добавлено: 03 май 2006, 18:54
entryway
дяденьки, подскажите еще
вот этот мой первый запрос быстро отработает на FB2?
без рукоприкладства по подмене плана или явного указания где не юзать индекс.
хотелось бы так чтоб все само...
Добавлено: 03 май 2006, 18:58
kdv
сами вы строите через квери билдер )))
гм. так вот это -
Код: Выделить всё
inner join ordrsstate ordersstate on ordersstate.id = main.state
inner join phonetypes phonetypes on phonetypes.id = main.ttype
руками писать - извините. именно такое, с алиасами идентичными имени таблицы и вылазит из QB. QB имеется в виду, который или в IBExpert, или отдельно, или еще как.
хотелось бы так чтоб все само...
в Yaffil на эту тему была оптимизация, и она скорее всего будет или уже есть в FB2, но от использования индекса несколько раз для field in (1, 2, 3...) пока избавиться нельзя. in превращается в field = 1 or field = 2 or field = 3, а это оптимизировать надо.
Добавлено: 03 май 2006, 19:11
entryway
kdv писал(а):гм. так вот это -
руками писать - извините. именно такое, с алиасами идентичными имени таблицы и вылазит из QB. QB имеется в виду, который или в IBExpert, или отдельно, или еще как.
там случай тяжелее - долго обьяснять как так получилось :)
а кверибилдеров я и в глаза-то не видел
в Yaffil на эту тему была оптимизация
у меня фобия резко развилась. вспомнил запрос который выполняется 5 секунд вместо ожидаемого "мгновенно"
Код: Выделить всё
select
m.id,
tree.service,
addorder.name,
operators.operator,
phones.phone,
hypertype.name as ttype,
m.ddate, m.ttime
from main m
inner join phones on phones.id = m.phone
inner join tree on tree.inc = m.service
inner join operators on operators.id = m.operator
inner join hypertype on hypertype.id = m.ttype
left join addorder on addorder.id = m.id
where
(m.ddate >= '2006-05-03') and (m.ddate <= '2006-05-03')
and (main.city = 1) and (m.operator = 8)
PLAN JOIN (JOIN (TREE NATURAL,M INDEX (MAIN_SERVICE,MAIN_OPERATOR,MAIN_DDATE),HYPERTYPE INDEX (RDB$PRIMARY1),OPERATORS INDEX (OPERATORS_ID),PHONES INDEX (PHONES_ID)),ADDORDER INDEX (ADDORDER_ID))
убрать лефт жоин - мгновенно. но разве лефт жоин должен тормозить? индесы же есть по связным полям...
Добавлено: 03 май 2006, 19:19
kdv
опять косяки. в запросе часть таблиц с алиасами, а часть - без. тебя FB 2 пошлет.
насчет left join - все совершенно правильно. потому что у тебя с left стороны стоит ВЕСЬ остальной join, который должен быть целиком сопоставлен избранным из addorder. Это, кстати, ясно видно и в плане (он из двух "join" состоит)
читай
www.ibase.ru/devinfo/joins.htm
и
www.ibase.ru/devinfo/dataaccesspaths.htm
Добавлено: 03 май 2006, 19:43
entryway
kdv писал(а):насчет left join - все совершенно правильно. потому что у тебя с left стороны стоит ВЕСЬ остальной join, который должен быть целиком сопоставлен избранным из addorder. Это, кстати, ясно видно и в плане (он из двух "join" состоит)
переставил в запросе лефт жоин на первое место в списке джоинов, план конечно поменялся и все выполнилось
мгновенно. жалко :) дело в том что это запрос для статистики и генерит его скрипт на серверной части, а там получается так, как получается - "мозг" по правильному порядку жоинов, отключению индексов и т.д. применять там проблематично.
читай
обязательно прочитаю. спасибо.
Добавлено: 03 июл 2006, 17:16
entryway
kdv писал(а):опять косяки. в запросе часть таблиц с алиасами, а часть - без. тебя FB 2 пошлет.
И взаправду - посылает! Хотел немного поругаться мол сломали мне все, но спросил и оказалось в MySql и Oracle - так же
Зато лефт джоины следующие "после" пары иннеров, а не "до" не превращают время выполнения некоторых моих запросов из "мгновенно" в "бесконечно". Выполняются одинаково мгновенно.