|
|
|
Оптимизация select-запросов с хранимыми функциями.
|
|||
|---|---|---|---|
|
#18+
Привет, столкнулся с такой проблемой... Select-запрос на пересечение таблиц, где в качестве условия пересечения выступает выражение с использованием хранимых функций, повергает базу в недоуменее на долгое-долгое время. Все, конечно, выполняется, но за неприемлемое время!!! А теперь подробнее, есть объектный тип, например: create or replace type TestType as object ( ... member function getValue return integer, ... ); и есть таблица, например: create or replace table TestTable( Temp TestType; ... ); В таблице около 200 записей, но запрос, например, такой: select t1.Temp, t2.Temp from TestTable t1, TestTable t2 where t1.Temp.getValue()>t2.Temp.getValue() and ...; выводит Oracle в нокаут примерно на минуту. Насколько я понимаю, это происходит потому, что при пересечении двух таблиц для каждых двух строк вызывается метод getValue(), то есть он вызывается 200*200 - примерно 40000 раз. Но даже ежу понятно, что гораздо эффективнее сначала выбрать в какой-нибудь буфер значения getValue() для всех строк таблицы (тем более, что их не так уж и много), а затем использовать эти значения при пересечении таблиц. При этом getValue() надо вызвать только 200 раз и все будет летать. Как заставить Oracle оптимизировать запросы именно так, а не иначе? Или как это обойти? Танцы с бубном, типа создадим сначала вьюшку, в которой будем вызывать getValue() и т.п. не помогают. Может кто сталкивался с такой проблемой или знает как это лечится? Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2003, 16:37 |
|
||
|
Оптимизация select-запросов с хранимыми функциями.
|
|||
|---|---|---|---|
|
#18+
Индекс на функцию создать не пробовал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2003, 15:14 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32144582&tid=1990891]: |
0ms |
get settings: |
4ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
153ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 405ms |

| 0 / 0 |
