запросы, планы...

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

запросы, планы...

Сообщение entryway » 03 май 2006, 16:25

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))

отрабатывает мгновенно

вставляю второй план в первый запрос - отрабатывает мгновенно
убираю два верхних иннер жоина - мгновенно
убираю один нижний жоин - мгновенно

почему так?

entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

Сообщение entryway » 03 май 2006, 16:35

я отвечу
добавил в ordersparams поле ID праймари кей (не было такого) - все зашуршало

этот мир полон лжи

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 май 2006, 16:49

and (main.oorder+0 in

кроме того. не надо писать имена алиасов идентичные именам таблиц. строишь запрос через QueryBuilder - научись задавать алиасы.

entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

Сообщение entryway » 03 май 2006, 16:51

сами вы строите через квери билдер )))
+0 сейчас попробую
помогло
прикольно и одновременно смешно )
спасибо

entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

Сообщение entryway » 03 май 2006, 17:37

kdv писал(а):кроме того. не надо писать имена алиасов идентичные именам таблиц
ой еще раз спасибо дяденька :)
не работало ведь ничего.
а никто и не знал...

entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

Сообщение entryway » 03 май 2006, 18:54

дяденьки, подскажите еще
вот этот мой первый запрос быстро отработает на FB2?
без рукоприкладства по подмене плана или явного указания где не юзать индекс.
хотелось бы так чтоб все само...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 май 2006, 18:58

сами вы строите через квери билдер )))
гм. так вот это -

Код: Выделить всё

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, а это оптимизировать надо.

entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

Сообщение entryway » 03 май 2006, 19:11

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))

убрать лефт жоин - мгновенно. но разве лефт жоин должен тормозить? индесы же есть по связным полям...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 май 2006, 19:19

опять косяки. в запросе часть таблиц с алиасами, а часть - без. тебя FB 2 пошлет.
насчет left join - все совершенно правильно. потому что у тебя с left стороны стоит ВЕСЬ остальной join, который должен быть целиком сопоставлен избранным из addorder. Это, кстати, ясно видно и в плане (он из двух "join" состоит)
читай
www.ibase.ru/devinfo/joins.htm
и
www.ibase.ru/devinfo/dataaccesspaths.htm

entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

Сообщение entryway » 03 май 2006, 19:43

kdv писал(а):насчет left join - все совершенно правильно. потому что у тебя с left стороны стоит ВЕСЬ остальной join, который должен быть целиком сопоставлен избранным из addorder. Это, кстати, ясно видно и в плане (он из двух "join" состоит)
переставил в запросе лефт жоин на первое место в списке джоинов, план конечно поменялся и все выполнилось мгновенно. жалко :) дело в том что это запрос для статистики и генерит его скрипт на серверной части, а там получается так, как получается - "мозг" по правильному порядку жоинов, отключению индексов и т.д. применять там проблематично.
читай
обязательно прочитаю. спасибо.

entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

Сообщение entryway » 03 июл 2006, 17:16

kdv писал(а):опять косяки. в запросе часть таблиц с алиасами, а часть - без. тебя FB 2 пошлет.
И взаправду - посылает! Хотел немного поругаться мол сломали мне все, но спросил и оказалось в MySql и Oracle - так же ;)

Зато лефт джоины следующие "после" пары иннеров, а не "до" не превращают время выполнения некоторых моих запросов из "мгновенно" в "бесконечно". Выполняются одинаково мгновенно.

Ответить