|
|
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
Был у меня запрос: SELECT A."USER_ID", A."FIO", A."NAME_TERR", A."TTYPE", A."TOWN", A."SHORTNAME", A."STREET", A."STYPE", A."HOUSE", A."CORPUS", A."FLAT" FROM "KAMV" A WHERE ( ISCORP = 'N' AND IN09 = 'Y' AND USER_ID IN (SELECT USER_ID FROM T_USERS U WHERE U.ISCORP = 'N' AND U.HOUSE_ID IN (SELECT H.HOUSE_ID FROM V_HOUSES H WHERE H.STREET_ID LIKE '42%' AND H.STREET LIKE 'ХИМИКОВ%' AND H.TOWN LIKE '%' AND H.HOUSE = '15') UNION SELECT USER_ID FROM T_SERVICES S WHERE S.HOUSE_ID IN (SELECT H.HOUSE_ID FROM V_HOUSES H WHERE H.STREET_ID LIKE '42%' AND H.STREET LIKE 'ХИМИКОВ%' AND H.TOWN LIKE '%' AND H.HOUSE = '15')) AND FLAT = '164' ) ORDER BY A."FIO", A."USER_ID" call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 6 0.09 0.09 0 0 0 0 Execute 6 0.00 0.00 0 0 0 0 Fetch 6 0.05 0.06 0 9378 0 6 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 18 0.14 0.15 0 9378 0 6 Misses in library cache during parse: 1 Optimizer goal: FIRST_ROWS Parsing user id: 43 Rows Row Source Operation ------- --------------------------------------------------- 1 SORT ORDER BY 1 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 282 VIEW VW_NSO_1 282 SORT UNIQUE 562 UNION-ALL 280 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 6 TABLE ACCESS BY INDEX ROWID T_STREETS_REF 108 INDEX RANGE SCAN (object id 40942) 6 TABLE ACCESS BY INDEX ROWID O_HOUSES 6 AND-EQUAL 33 INDEX RANGE SCAN (object id 31098) 29 INDEX RANGE SCAN (object id 31099) 2 INDEX UNIQUE SCAN (object id 34845) 2 TABLE ACCESS BY INDEX ROWID T_TOWN 2 INDEX UNIQUE SCAN (object id 35019) 2 INDEX UNIQUE SCAN (object id 35021) 280 TABLE ACCESS BY INDEX ROWID T_USERS 284 INDEX RANGE SCAN (object id 35044) 282 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 6 TABLE ACCESS BY INDEX ROWID T_STREETS_REF 108 INDEX RANGE SCAN (object id 40942) 6 TABLE ACCESS BY INDEX ROWID O_HOUSES 6 AND-EQUAL 33 INDEX RANGE SCAN (object id 31098) 29 INDEX RANGE SCAN (object id 31099) 2 INDEX UNIQUE SCAN (object id 34845) 2 TABLE ACCESS BY INDEX ROWID T_TOWN 2 INDEX UNIQUE SCAN (object id 35019) 2 INDEX UNIQUE SCAN (object id 35021) 282 TABLE ACCESS BY INDEX ROWID T_SERVICES 283 INDEX RANGE SCAN (object id 34775) 282 TABLE ACCESS BY INDEX ROWID T_USERS 562 INDEX UNIQUE SCAN (object id 35051) 2 TABLE ACCESS BY INDEX ROWID O_HOUSES 2 INDEX UNIQUE SCAN (object id 31103) 2 TABLE ACCESS BY INDEX ROWID T_STREETS_REF 2 INDEX UNIQUE SCAN (object id 34843) 2 TABLE ACCESS BY INDEX ROWID T_STREET_TYPE 2 INDEX UNIQUE SCAN (object id 34845) 2 TABLE ACCESS BY INDEX ROWID T_TOWN 2 INDEX UNIQUE SCAN (object id 35019) 2 TABLE ACCESS BY INDEX ROWID T_TOWN_TYPE 2 INDEX UNIQUE SCAN (object id 35021) 2 TABLE ACCESS BY INDEX ROWID T_TERRITORY_CONSTITUTE 2 INDEX UNIQUE SCAN (object id 34956) 1 TABLE ACCESS BY INDEX ROWID T_TERRITORY_TYPE 2 INDEX UNIQUE SCAN (object id 34958) а я его переписал с использованием связанных переменных: SELECT USER_ID FROM "KAMV" A WHERE (ISCORP = 'N' AND IN09 = 'Y' AND USER_ID IN (SELECT USER_ID FROM T_USERS U WHERE U.ISCORP = 'N' AND U.HOUSE_ID IN (SELECT H.HOUSE_ID FROM V_HOUSES H WHERE H.STREET_ID LIKE '42%' AND H.STREET LIKE :b1 AND H.TOWN LIKE :b2 AND H.HOUSE = :b3 ) UNION SELECT USER_ID FROM T_SERVICES S WHERE S.HOUSE_ID IN (SELECT H.HOUSE_ID FROM V_HOUSES H WHERE H.STREET_ID LIKE '42%' AND H.STREET LIKE :b1 AND H.TOWN LIKE :b2 AND H.HOUSE = :b3 )) AND FLAT = :b7 ) ORDER BY A."FIO",A."USER_ID" call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 6 0.00 0.00 0 0 0 0 Execute 12 0.05 0.05 0 0 0 0 Fetch 6 1.39 1.37 2 22812 216 6 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 24 1.44 1.42 2 22812 216 6 Misses in library cache during parse: 1 Optimizer goal: FIRST_ROWS Parsing user id: 43 (recursive depth: 1) Rows Row Source Operation ------- --------------------------------------------------- 1 SORT ORDER BY 1 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 282 VIEW VW_NSO_1 282 SORT UNIQUE 562 UNION-ALL 280 NESTED LOOPS 281 HASH JOIN 280 NESTED LOOPS 281 HASH JOIN 2772 HASH JOIN 268 TABLE ACCESS FULL O_HOUSES 144033 TABLE ACCESS FULL T_USERS 5 TABLE ACCESS BY INDEX ROWID T_STREETS_REF 108 INDEX RANGE SCAN (object id 40942) 280 INDEX UNIQUE SCAN (object id 34845) 33081 TABLE ACCESS FULL T_TOWN 280 INDEX UNIQUE SCAN (object id 35021) 282 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 NESTED LOOPS 2 HASH JOIN 268 TABLE ACCESS FULL O_HOUSES 5 TABLE ACCESS BY INDEX ROWID T_STREETS_REF 108 INDEX RANGE SCAN (object id 40942) 2 INDEX UNIQUE SCAN (object id 34845) 2 TABLE ACCESS BY INDEX ROWID T_TOWN 2 INDEX UNIQUE SCAN (object id 35019) 2 INDEX UNIQUE SCAN (object id 35021) 282 TABLE ACCESS BY INDEX ROWID T_SERVICES 283 INDEX RANGE SCAN (object id 34775) 282 TABLE ACCESS BY INDEX ROWID T_USERS 562 INDEX UNIQUE SCAN (object id 35051) 2 TABLE ACCESS BY INDEX ROWID O_HOUSES 2 INDEX UNIQUE SCAN (object id 31103) 2 TABLE ACCESS BY INDEX ROWID T_STREETS_REF 2 INDEX UNIQUE SCAN (object id 34843) 2 INDEX UNIQUE SCAN (object id 34845) 2 TABLE ACCESS BY INDEX ROWID T_TOWN 2 INDEX UNIQUE SCAN (object id 35019) 2 INDEX UNIQUE SCAN (object id 35021) 2 TABLE ACCESS BY INDEX ROWID T_TERRITORY_CONSTITUTE 2 INDEX UNIQUE SCAN (object id 34956) 1 INDEX UNIQUE SCAN (object id 34958) и получил полное сканирование некоторых таблиц, вместо использования индекса и соответсвенно снижение скорости на порядок. Похоже оптимизатор не может оценить избирательность запроса по индексу по этим таблицам и принимает решение на full scan table. Возникает извечный вопрос, что делать ??? Причем kamv & v_houses - это view-ы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 06:07:06 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
а таблицы как давно анализированы? если нет, попробуй после анализа с хинтом FIRST_ROWS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 07:36:26 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
дык анализ здесь причем, ведь сказано - без связанных переменных все работает быстро и значит статистика актуальна. Да и перестраивал я ее. Вот если в некторых моментах like поменять на = сразу индекс цепляется, а сие означает, что избирательность запроса повысилась и оптимизатор принял решение использовать индекс????? Вот непонятно, Кайт пишет, что использовать связанные переменные обязательно. И приводит примеры. Я проверил - все правильно. НО !!! У него в примерах запросы простые. А в документации по Оракл написано - использование связанных переменых может помешать оптимизатору использовать индекс, из-за невозможности оценить избирательность, что у меня и происходит. Вывод !!???? Используй связанные переменные - улучшишь масштабируемость, но снизишь скорость выполнения. Кайт этот вопрос обходит стороной, и это неспроста, хотя говорит о связанных переменных много, это у него конек, похоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 07:48:35 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
Если Вы ВНИМАТЕЛЬНО читали Кайта, он пишет, что ИНГДА связанные переменные это плохо, именно потому, что оптимизатор не может применить статистику, которую он применяет в случае литералов. Если подумать, план запроса определяется при разборе (до подстановки переменных). Значит должен быть оптимальным при всех значениях подставляемых переменных, значит гистограммы применять нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 09:07:07 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
про план построения: а как вы хотите чтобы он со связанной переменной при условии like использовал индекс??? он этого не может, откуда он знает что у вас в переменной значение 'a%', а не '%a%' уже давно говорилось что bind переменных надо делать для OLTP систем, а для DSS его делать совершенно не обязательно! как вариант попробуйте указать ему хит --+ index (имя_таблицы имя_индекса) к тому же попробуйте выкинуть хинт first_row, он все равно не работает у вас там order by, и для того чтобы выдать вам 1-ю строчку ему надо все равно в памяти все данные получить и отсортировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 09:19:02 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
2 DAV2 Есно, а вы что хотели? oracle - это СУБД а не гадалка :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 09:20:23 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
во, раз статистика актуальна, то анализ как раз нужен.. проблема в том, что оптимизатор не знает что в bind переменной, но видит like и допускает возможность в переменной наличие лидирующего символа "%", чего не случается при прямом подставлении значений.. вывод такой - плохо использовать like в этом случае для bind переменных.. попробуй типа ... WHERE (H.STREET_ID >= :b1 and H.STREET_ID <:b1) AND (H.STREET >= :b2 and H.STREET <:b2) ..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 09:25:00 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
Для систем OLTP связанные переменные желательно использовать. Что это значит? То, что имеется много DML и простые запросы. Для нерегламентированных (напр, редко встречаемых или очень специфических с критическими требованиями по скорости) использование связанных переменных противопоказано. Не надо уподобляться религиозным фанатикам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 09:33:33 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
Переменные связывания и совместное использование курсоров: новые тенденции в СУБД Oracle9i . Особые ситуации Использование переменных связывания в операторах SQL либо непосредственно запрограммированных в приложении, либо косвенно с помощью установки значения параметра cursor_sharing , в общем, позволяет повысить производительность. Однако есть случаи, когда их использование либо не оказывает никакого реального влияния на производительность, либо вы подвергаетесь реальному риску снижения ее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 10:19:14 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
2 denis Popov:: Very well! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 10:37:52 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
Ага вот пошел конкретный треп, Вот цитата из Кайта: ... чем больше сеансов разбирает запросы, тем больше приходится ждать освобождения защелок в библиотечном кэше, и работа системы постепенно останавливается ... Во, это не я написал, да я читаю оччень внимательно, и прочитал, что применение связанных переменных может ухудшить ситуацию, но этому вопросу уделено две строки (буквально !!!), а вот преимуществам использования св. переменных - несколько страниц в 2-х (!!!) главах. У меня сорок пользователей за сутки выдают 20 000 в среднем запросов, и, по Кайту, если я не буду использовать св. переменные (а я их пока не использую), то моя система тихо умрет из-за блокирования разделяемого пула. А если я их использую (это уже я), то система тихо умрет из-за многочисленных full table scan ?????, а операторы - от ожидания ответов. Где же золотая середина, и почему Кайт о ней ничего не пишет, у него однозначно - используйте и все !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 10:42:18 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
2Dav а вы не пробовали писать запросы так, чтобы full table scan не было??? например, полазить по хелпу и посмотреть что такое context катридж или вместо like использовать символы > < и т п ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 10:51:53 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
to DAV2: Я могу обьяснить почему он так говорит. Его утверждение - зто исходная точка от которой нужно отталкиваться. А дальше всё зависит от уровня на котором ты находишься. Все ораклисты проходят через несколько трансформаций своего мировосприятия или точнее ораклевосприятия. Если ты только начал работать с Oracle - ты должен об этом знать и придёрживаться этого правила и всех которые декларируются Oracle. Когда ты уже приобрёл опыт , ты уже понимаешь когда это нужно, когда нет. Ты применяешь избирательно, со смыслом. Последняя стадия, это самая высшая, на этой стадии ораклист отрицает все основые постулаты. Ему говорят: индексы помогают в запросах, ог говорит: да вы рехнулись ребята - это миф. Ему говорят - использование связанных переменных - это хорошо. Он отвечает: ну что-вы упали - с дуба, это миф. Есть еще одна редкая категория, это подобные Тому Кайту - он не просто ораклист, он учитель. Поэтому он излагает с последней стадии, но как мудрый учитель для тех кто на первой стадии. Поэтому, диалог о пользе имеет смысл между ораклистами одного уровня. Осталось только определиться на каком ты уровне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 10:56:02 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
Действительно треп пошел, потому что обсуждается проблема на очень абстрактном уровне 1) не использовать пременные 2) использовать переменные Не только важно, использовать ли, но и как использовать. Том Кайт ясно пишет что не следует их использовать в запросах, если отсутсвие информации о распределени данных приведет к значительной потрере производительности. При разработке нужно тестировать запрос в различных вариантах. получил полное сканирование некоторых таблиц, вместо использования индекса и соответсвенно снижение скорости на порядок на это тебе дали ясный ответ во, раз статистика актуальна, то анализ как раз нужен.. проблема в том, что оптимизатор не знает что в bind переменной, но видит like и допускает возможность в переменной наличие лидирующего символа "%", чего не случается при прямом подставлении значений.. вывод такой - плохо использовать like в этом случае для bind переменных.. Использование bind переменных экономит время разбора операторов а не творит чудеса при их выполнении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 11:02:53 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
Ну по твоей классификации только начинаю работать с Оракл, но зерна от плевел уже отличаю. И вовсе не собираюсь верить всему, что говорят. Потому в форум полез. И все, что написали, верно, со всем согласен. Но !!! Категорически же утверждает - работать не будет, на протяжении всей книги. Или он пытается воспитать из нас закаленных профи, как в последнем варианте, типа я говорю, а вы не верьте. Прямо антисистема какя-то по Гумилеву. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 11:12:53 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
Вероятно, он имел в виду, что если вы решите увеличить пул, а такое поползновение бывает довольно часто, то система может встать из-за возрастания накладных расходов на поддержание пула. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 11:57:14 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
1) Интересна частота использования данного запроса. 2) Помещаются ли в кэш результаты фулл скана таблиц или происходит их перечитывание с диска Собственно после этого уже можно думать от чего "помрет" система :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 13:46:28 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
2 DAV2 А что подзапрос, если его отдельно запустить скажем из sqlplus с переменными привязки тоже full scan делает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 15:12:26 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
[quote] У меня сорок пользователей за сутки выдают 20 000 в среднем запросов [/quote] Это -- не OLTP система. Это показатели средненькие такие для DSS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2003, 15:39:37 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
Да, а по сути то это все-таки OLTP, с некоторыми элементами (АРМами) DSS. Да, прочитал я статью, которую указал (спасибо ему) Denis Popov про изменения в Oracle 9i. Там как раз перед первым выполнением значения переменных подставляются и на основе этих значений строится план выполнения, который затем используется для любых значений связанных переменных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2003, 04:38:14 |
|
||
|
СВЯЗАННЫЕ ПЕРЕМЕННЫЕ УМЕНЬШАЮТ СКОРОСТЬ
|
|||
|---|---|---|---|
|
#18+
Так и хочется ответить: "всю статистику и сложные запросы -- на исторический сервер". В твоём же случае "доктор, вы определитесь -- или туда, или обратно". То есть, что тебе выгоднее: проиграть немного на разборе и замусоренном shared pool, либо же проиграть неизвестно сколько на I/O из-за специфики запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2003, 23:41:38 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=2762&tid=1989884]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
32ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 305ms |

| 0 / 0 |
