kdv писал(а):
прочитай еще раз dataaccesspaths. оцени объемы данных в таблицах.
посмотри на план. подумай.
нафига такие запросы выполнять - неясно. сразу же видно, что это жопное тормозилище.
перечитываю постоянно
я вот не могу план понять, вот в чем беда моя
kdv писал(а):
1. containing не даст использовать индекс.
2. по fxml_operation_type как я вижу, индекса нет
с containing понятно и индекса нет, так и задумывалось
kdv писал(а):
значит перебор этой таблицы будет от 1 до n записей (RX LX NATURAL). в среднем, считай 1500, или 2000, если у тебя в той таблице 3000 записей.
3. group by приводит к перебору таблицы в 1.5 миллионов записей в порядке индекса(C ORDER PHONE_CALLS) . Косвенно это означает, что таблица будет перебираться с повторяющимися чтениями одних и тех же страниц. т.е. будет жуткий дисковый ввод-вывод.
об этом читать тут
http://www.sql.ru/forum/actualthread.as ... 14#2535391
4. теперь, умножаем 1.5 миллиона, выбираемые вот таким мощным способом, на 2000. получаем 3 миллиарда перебираемых "записей". Причем, полтора миллиона раз еще и выполняем подзапрос.
вот я и хочу это научиться из плана понимать, пока плохо получается

кстати, а вот диск-то как раз и спокоен, очередь к диску около 0 болтается, проц на 100% загружен, но другим потокам время выделяет, FB с других клиентов другие запросы выполняет
kdv писал(а):
Ты когда пишешь такой запрос, по нему (и по его плану) совершенно ясно видно, как и чего будет делаться. А раз есть такое понимание, значит можно этот запрос переделать, например на процедуру.
по плану мне пока не ясно, а запрос-то, это не проблема
есть нормальный вариант:
Код: Выделить всё
--выполнение-порядка секунды
select c.phone_caller from calls c
join
(select rx.xml_phone from
(select substring(lx.fxml_operation from 30 for 10) as xml_phone,
lx.fxml_operation_type as o_type
from log_xml lx
where
(lx.fxml_operation_type='delete_phone' and
lx.fxml_operation containing('346'))
union all
select substring(lx2.fxml_operation from 31 for 10) as xml_phone,
lx2.fxml_operation_type as o_type
from log_xml lx2
where
(lx2.fxml_operation_type='insert_phone_migration' and
lx2.fxml_operation containing('346'))) as rx
group by
rx.xml_phone
having
count(rx.xml_phone)=1)as r
on c.phone_caller=r.xml_phone
where c.date_call>'01.11.2007'
group by c.phone_caller
План
PLAN SORT (JOIN ((R RX LX NATURAL)
PLAN (R RX LX2 NATURAL), C INDEX (PHONE_CALLS)))
Задача-то не реальная, попались под руку нормальные объемы данных, вот и решил потренировать мозг