Теоретический Вопрос по скорости

Valdemar
Дата: 05.06.2006 07:57:04
select note, substr(note,instr(note,'par_value=',1)+length('par_value='),instr(note,',',instr(note,'par_value=',1))-instr(note,'par_value=',1)-length('par_value=')),
	   instr(note,'par_value=',1),instr(note,',',instr(note,'par_value=',1))
from table

в таблице данных более 30 милионов записей

вопрос вот в чем, вырезать строку в запросе или сделать отдельную функцию
так как если вы заметили там повторяющиеся вычисления
и может дешевле будет их сохранить в перемные а потом ниси работать

повторяеться length('par_value=') более 2 раз
RA\/EN
Дата: 05.06.2006 08:23:25
Valdemar
select note, substr(note,instr(note,'par_value=',1)+length('par_value='),instr(note,',',instr(note,'par_value=',1))-instr(note,'par_value=',1)-length('par_value=')),
	   instr(note,'par_value=',1),instr(note,',',instr(note,'par_value=',1))
from table

в таблице данных более 30 милионов записей

вопрос вот в чем, вырезать строку в запросе или сделать отдельную функцию
так как если вы заметили там повторяющиеся вычисления
и может дешевле будет их сохранить в перемные а потом ниси работать

повторяеться length('par_value=') более 2 раз


Так будет быстрее (по крайней мере, на 10ке).
Length('par_value=') можно заменить с помощью подзапроса
select note,
       substr(note,
              instr(note, 'par_value=', 1) lpv.v,
              instr(note, ',', instr(note, 'par_value=', 1)) -
              instr(note, 'par_value=', 1) - lpv.v),
       instr(note, 'par_value=', 1),
       instr(note, ',', instr(note, 'par_value=', 1))
  from table,
       (select length('par_value=') v
        from   dual) lpv
Valdemar
Дата: 05.06.2006 09:11:09
все таки я склоняюсь к функции

вот эту часть тоже выполнять надо три раза

instr(note, 'par_value=', 1)
RA\/EN
Дата: 05.06.2006 09:30:42
Valdemar
все таки я склоняюсь к функции

вот эту часть тоже выполнять надо три раза

instr(note, 'par_value=', 1)


select t.note,
       substr(note,t.ipv+lpv.v,instr(note,',',t.ipv)-t.ipv-lpv.v),
	     t.ipv,instr(note,',',t.ipv)
  from (select note,
               instr(note, 'par_value=', 1) ipv
        from   table) t,
       (select length('par_value=') v
        from   dual) lpv
Valdemar
Дата: 05.06.2006 09:42:23
Вы так на подзапросе настаиваете?

Скажите принципилаьно, подзапросы быстрее выполняються с вычислениями, чем просто подать данные в функцию и выислить их там

я сдела функцию

и выполнил два запроса

первый
select note, substr(note,instr(note,'par_value=',1)+length('par_value='),instr(note,',',instr(note,'par_value=',1))-instr(note,'par_value=',1)-length('par_value=')),
	   instr(note,'par_value=',1),instr(note,',',instr(note,'par_value=',1))
from table

второй
select note, util.getvalue(note,'par_value=')
from table

второй выполняеться быстрее в раз пять
RA\/EN
Дата: 05.06.2006 10:01:41
Что-то в консерватории не так.
Функция не в native-компиляции?

Стандартно, повторил на подобных данных - по логическим чтениям одинаково, по CPU с функцией в 10 раз медленне, и это 9.2.0.6.

Если выполнить запросы в другом порядке - счначала второй, потом первый - по прежнему в 5 раз будет расхождение?
А если перед каждым запросом сбрасывать buffer_cache (для 10-ки)

P.S. Первый запрос возвращает 4 поля, второй - 2.
orawish
Дата: 05.06.2006 11:57:33
RA\/EN
Что-то в консерватории не так.
..
+1
Не сравнивает, уважаемый, время исполнения одного запроса с временем реакции другого?
Valdemar
Дата: 05.06.2006 12:04:18
автор
+1
Не сравнивает, уважаемый, время исполнения одного запроса с временем реакции другого?


это усмешка или упрек?
Alexey Polovinkin
Дата: 05.06.2006 12:05:12
orawish
RA\/EN
Что-то в консерватории не так.
..
+1
Не сравнивает, уважаемый, время исполнения одного запроса с временем реакции другого?


+1
alex-ls
Дата: 05.06.2006 12:12:40
RA\/EN
Если выполнить запросы в другом порядке - счначала второй, потом первый - по прежнему в 5 раз будет расхождение?
А если перед каждым запросом сбрасывать buffer_cache (для 10-ки)

а может тогда просто выполнить не один раз, а несколько, и все в кэше будет гарантировано...