Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Была процедурка:
+
create or replace procedure p_netelement_hist_i(
	in_id_element in number,
	in_id_param in number,
	in_value in varchar2,
	in_bdate_id in number)
as
begin
	for temp in
	(
		select r.id
			from net_element r
				join common.spr_bsc_sw sw
					on sw.id = r.id_sw
			where ((sw.id_spr_vendor = 1139
					and r.id = in_id_element
					and exists(
						select t.id
							from net_changes_param4nettype t
							where t.id_net_changes_param = in_id_param
								and t.id_spr_net_type = 3)))
				or
				(sw.id_spr_vendor = 2139
					and r.id = in_id_element
					and exists(
						select t.id
							from net_changes_param4nettype t
							where t.id_net_changes_param = in_id_param
								and t.id_spr_net_type in (1, 2)))
	)
	loop
		insert into net_element_hist (
				id_element,
				id_net_changes_param,
				param_value,
				id_bdate)
			values (
				in_id_element,
				in_id_param,
				in_value,
				in_bdate_id);
	end loop;
end;
я подумал, что лучше ее немного переписать, и переписал вот так:
+
create or replace procedure p_netelement_hist_i(
	in_id_element in number,
	in_id_param in number,
	in_value in varchar2,
	in_bdate_id in number)
as
begin
	insert into net_element_hist (
			id,
			id_element,
			id_net_changes_param,
			param_value,
			id_bdate)
		select seq_bts_hist_id.nextval,
				in_id_element,
				in_id_param,
				in_value,
				in_bdate_id
			from net_element r
				join common.spr_bsc_sw sw
					on sw.id = r.id_sw
			where r.id = in_id_element
				and (sw.id_spr_vendor = 1139
						and exists(
							select null
								from net_changes_param4nettype t
								where t.id_net_changes_param = in_id_param
									and t.id_spr_net_type = 3)
					or sw.id_spr_vendor = 2139
						and exists(
							select null
								from net_changes_param4nettype t
								where t.id_net_changes_param = in_id_param
									and t.id_spr_net_type in (1, 2)));
end p_netelement_hist_i;
Но теперь, при трассировке, для этого этот запроса (INSERT SELECT) видно ужасно большой показатель "elapsed". А какой именно этот показатель был для запросов исходной процедуры я не помню :(
Дело в том, что эта процедура очень часто вызывается из множества мест.

Возможно ли такое, что второй вариант процедуры (INSERT SELECT) оказался медленнее исходного (SELECT + INSERT), как вы думаете?
14 мар 13, 12:07    [14046687]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
2 вариант будет более быстрее работать если добавить хинт

insert /*+ append */ into ...
select ....
14 мар 13, 12:19    [14046772]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
--Eugene--,

а если конкретно ответить на вопрос
--Eugene--
Возможно ли такое, что второй вариант процедуры (INSERT SELECT) оказался медленнее исходного (SELECT + INSERT), как вы думаете?

трудно, так как в этот момент много чего могло быть не так, например статистика мог быть старым, фиг его знает как отработал CBO в этот момент.
14 мар 13, 12:21    [14046784]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
--Eugene--
Была процедурка...
create or replace procedure p_netelement_hist_i(
	in_id_element in number,
	in_id_param in number,
	in_value in varchar2,
	in_bdate_id in number)
as
...
		insert into net_element_hist (
				id_element,
				id_net_changes_param,
				param_value,
				id_bdate)
			values (
				in_id_element,
				in_id_param,
				in_value,
				in_bdate_id);



--Eugene--
переписал вот так...
	insert into net_element_hist (
			id,
			id_element,
			id_net_changes_param,
			param_value,
			id_bdate)
		select seq_bts_hist_id.nextval,
				in_id_element,
				in_id_param,
				in_value,
				in_bdate_id



--Eugene--
Но теперь, при трассировке, для этого этот запроса (INSERT SELECT) видно ужасно большой показатель "elapsed". А какой именно этот показатель был для запросов исходной процедуры я не помню :(


1. Два разных оператора INSERT, мягко скажем.
2. Любимец богов, зачем тебе вообще SELECT ? Ты же ни одного значения, извлеченного из SELECT не вставляешь
в таблицу.
3. Ты сам-то понял, что написал ? "Не помню, но сумлююсь..."

Цирк с конями, столько времени мусолить Oracle и так и остаться лохом - это какой же степенью лени нужно обладать ?
14 мар 13, 12:38    [14046905]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
--Eugene--,

но, в смысле теории ползучего эмпиризма, ответ на
автор
Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?

- да, может.
более того, инсерт селект может гарантированно приводить к ора600, тогда как оно же поочерёдно - полный ажур
14 мар 13, 12:50    [14047025]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Серафимный Шестикрыл
зачем тебе вообще SELECT ? Ты же ни одного значения, извлеченного из SELECT не вставляешь
в таблицу
SELECT мне нужен чтобы учесть условие для вставки
...
where r.id = in_id_element
	and (sw.id_spr_vendor = 1139
			and exists(
				select null
					from net_changes_param4nettype t
					where t.id_net_changes_param = in_id_param
						and t.id_spr_net_type = 3)
		or sw.id_spr_vendor = 2139
			and exists(
				select null
					from net_changes_param4nettype t
					where t.id_net_changes_param = in_id_param
						and t.id_spr_net_type in (1, 2)));
предложите что-то получше?
или хотите сказать, что первый вариант был более подходящий? но там ведь было два запроса (следует учесть, что это условие оказывается истиной гораздо чаще, чем наоборот)
14 мар 13, 13:53    [14047532]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
--Eugene--
SELECT мне нужен чтобы учесть условие для вставки


1. Вставка - от чего зависит количество вставляемых записей ? Оно должно совпадать
с количеством выбранных в SELECT ? Почему тогда не подсчитывается COUNT ?
Если важен там факт существования записи - почему выбирается все ?
2. В первом варианте как класс отсутствет ID = значение из последовательности.

Скалыдывается впечатление какой-то мешанины в голове.
Давай ты сначала сформулируешь задачу, которую решаешь, а посетители форума подскажут,
как ее можно решить.
14 мар 13, 15:10    [14048013]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
кашаВголове
Guest
--Eugene--,

insert into net_element_hist
  (id, id_element, id_net_changes_param, param_value, id_bdate)
  select seq_bts_hist_id.nextval, in_id_element, in_id_param, in_value, in_bdate_id
    from dual
   where exists (select null
            from net_element r, common.spr_bsc_sw sw, net_changes_param4nettype t
           where r.id = in_id_element
             and t.id_net_changes_param = in_id_param
             and r.id_sw = sw.id
             and sw.id_spr_vendor in (1139, 2139)
             and t.id_spr_net_type = decode(sw.id_spr_vendor, 2139, 1, 2139, 2, 1139, 3)))
14 мар 13, 15:13    [14048034]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
кашаВголове,

интересно, как, по-вашему, должно отработать это:
... = decode(sw.id_spr_vendor, 2139, 1, 2139, 2, 1139, 3) ...
?
14 мар 13, 15:26    [14048097]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
123йй
Member

Откуда:
Сообщений: 1639
--Eugene--,
так же как и написано в документации
14 мар 13, 15:59    [14048338]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
123йй
Member

Откуда:
Сообщений: 1639
123йй,
только там ошибка вернет в запросе кашаВголове,
для 2139 всегда 1
если уж так то

and sw.id_spr_vendor= decode(t.id_spr_net_type ,1, 2139, 2, 2139, 3, 1139)))
14 мар 13, 16:09    [14048409]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
--Eugene--
кашаВголове,

интересно, как, по-вашему, должно отработать это:
... = decode(sw.id_spr_vendor, 2139, 1, 2139, 2, 1139, 3) ...
?


Т.е. вот это

    from dual
   where exists (select null


у тебя никакого баттхарта не вызвало ?

Еще раз (надеюсь, последний) - СКОЛЬКО ЗАПИСЕЙ ДОЛЖНО ВСТАВЛЯТЬСЯ В ТАБЛИЦУ ЕСЛИ
SELECT ВОЗВРАЩАЕТ БОЛЕЕ ОДНОЙ ЗАПИСИ ?
14 мар 13, 16:22    [14048508]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Серафимный Шестикрыл
СКОЛЬКО ЗАПИСЕЙ ДОЛЖНО ВСТАВЛЯТЬСЯ В ТАБЛИЦУ ЕСЛИ
SELECT ВОЗВРАЩАЕТ БОЛЕЕ ОДНОЙ ЗАПИСИ ?
такого быть не может, поскольку для этого есть специальные предикаты:
...
from net_element r
	join common.spr_bsc_sw sw
		on sw.id = r.id_sw
where r.id = in_id_element
...
а net_element.id и common.spr_bsc_sw.id - уникальные колонки
14 мар 13, 16:34    [14048603]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Серафимный Шестикрыл
В первом варианте как класс отсутствет ID = значение из последовательности.
в первом варианте для этого ID есть специальный триггер:
create or replace trigger bts_hist_bi_r01
before insert
on net_element_hist
for each row
when (new.id is null)
begin
	select seq_bts_hist_id.nextval
		into :new.id
		from dual;
end;
(не я придумал)
я решил, что задавать ID в выражении INSERT лучше, чем тратить время на исполнение триггера
14 мар 13, 16:40    [14048653]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
--Eugene--
я решил, что задавать ID в выражении INSERT лучше, чем тратить время на исполнение триггера


OK.
Теперь допустим, что у тебя возвращается не более одной записи.
Тебе осталось

a) Наглядно продемонстрировать разницу в производительности двух вариантов.
b) Показать нам всем execution plan запроса.
14 мар 13, 16:51    [14048736]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Серафимный Шестикрыл
a) Наглядно продемонстрировать разницу в производительности двух вариантов.
b) Показать нам всем execution plan запроса.
ради того, чтобы этого не делать, я и создал этот топик.
я же спрашиваю у опытных старших товарищей: (теоретически) неужели второй вариант хуже?
14 мар 13, 17:04    [14048811]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2386
Блог
--Eugene--
Серафимный Шестикрыл
a) Наглядно продемонстрировать разницу в производительности двух вариантов.
b) Показать нам всем execution plan запроса.
ради того, чтобы этого не делать, я и создал этот топик.
я же спрашиваю у опытных старших товарищей: (теоретически) неужели второй вариант хуже?
И тебе опытные старшие товарищи говорят: в твоем случае - может, тем более, что похоже на то, что ты не понимаешь что делаешь.
14 мар 13, 17:13    [14048847]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
--Eugene--
ради того, чтобы этого не делать, я и создал этот топик.


АдЪ и ИзраилЬ.
А не проще было оторвать мозги от ягодиц и сделать элементарный тест ?
14 мар 13, 17:39    [14048988]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
--Eugene--,
чтобы ты предпочел сделать в ситуации когда младший товарищ наступил себе на яйца, и спрашивает у старших товарищей что лучше: сразу сойти, или есть другие методы решения проблемы, в это же самое время старшие товарищи жуют поп-корн и удивляются стойкости младшего. если можно сделать тест- делай. мнение теста намного более показательно мнения старшего товарища)
14 мар 13, 17:56    [14049086]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54398
Vint
мнение теста намного более показательно мнения старшего товарища)
ну... разные тесты можно написать

Тот же Кайт писал - можно написать запрос, где not in производительнее not exists... и наоборот тоже можно
14 мар 13, 18:10    [14049168]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
andreymx,

мнение теста в конкретной ситуации намного более показательно обшего мнения старшего товарища
так лучше?)
14 мар 13, 18:14    [14049182]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54398
Vint,

ты ж помнишь, сколько раз тут были топики:
- запрос отработал в жабе за полсекунды, а в приложении - две минуты
- а ты сколько строк отфетчил?


Тот же тест, только интерпретация разная
14 мар 13, 18:38    [14049278]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
andreymx,
а сколько было простых ответов по типу, надо просто слезть с яиц и боли пройдут?))) если есть возможность сделать тест лучше делать. если мозгов на интерпретацию нет - ораклом заниматься не стоит)
14 мар 13, 18:42    [14049291]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
andreymx,

Если человек после 4 лет работы не способен произвести тест на Oracle в SQL*Plus
ему в профессии делать нечего.
14 мар 13, 18:44    [14049300]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INSERT SELECT быть медленнее, чем SELECT + INSERT ?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18399
Серафимный Шестикрыл
Если человек после 4 лет работы не способен произвести тест на Oracle в SQL*Plus
ему в профессии делать нечего.

Задача адекватно сформулировать, качественно провести и правильно интерпретировать тесты производительности на oracle, вообще говоря, тривиальной отнюдь не является.
14 мар 13, 18:50    [14049320]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить