"паралельное" выполнение процедур
Tolikk
Дата: 02.03.2007 06:57:12
Пердпосылка - новый четырехголовый сервер.
8.1.7 на Suse9.1,
все "тяжелые" приложения построены как библиотеки Procedure&Package
при запуске юзером одного экземпляра, такое впечатление, что трудится
только один проц :( как сделать, чтоб при единичных запусках задействовать
все ресурсы? Можно ли както запустить в процедуре несколько других
процедур параллельно? А будет ли от этого толк? А может дело не в Оракле,
а в ОСи???
Вячеслав Любомудров
Дата: 02.03.2007 07:06:09
Параллелиться могут только SQL-операторы (в том числе и внутри PL/SQL). Для включения распараллеливания используются подсказки (--+PARALLEL) и/или настройки параллельности объектов (ALTER TABLE/INDEX PARALLEL)
Сам PL/SQL код не параллелится
PS. На небольших объемах от распараллеливания больше вреда, чем пользы
Tolikk
Дата: 02.03.2007 08:35:25
| Вячеслав Любомудров |
Параллелиться могут только SQL-операторы (в том числе и внутри PL/SQL). Для включения распараллеливания используются подсказки (--+PARALLEL) и/или
|
Извините за привередливость. А можно конкретный работающий пример на базе скотт/тигер :-)
все будет прозрачно и ясно. (лучшая дока - работающий программный код)
еще - эта "опция" както включается/выключается?
| Вячеслав Любомудров |
настройки параллельности объектов (ALTER TABLE/INDEX PARALLEL) Сам PL/SQL код не параллелится
PS. На небольших объемах от распараллеливания больше вреда, чем пользы |
Дыксть понятно никто не будет заморачиватся с отчетом который обсчитывается пару-тройку секунд. Есть повод мороковать когда юзерам приходится ждать несколько минут :(
Вячеслав Любомудров
Дата: 02.03.2007 08:56:08
Атрибут таблицы
tst> create table t1 parallel 5 as select * from all_objects;
Table created.
tst> exec dbms_stats.gather_table_stats(user, 't1')
PL/SQL procedure successfully completed.
tst> explain plan for
2 select min(object_name) from t1;
Explained.
tst> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | TQ |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 17 | 2 | | | |
| 1 | SORT AGGREGATE | | 1 | 17 | | | | |
| 2 | SORT AGGREGATE | | 1 | 17 | | 65,00 | P->S | QC (RAND) |
| 3 | TABLE ACCESS FULL | T1 | 3007 | 51119 | 2 | 65,00 | PCWP | |
-------------------------------------------------------------------------------------------------
Note: cpu costing is off
11 rows selected.
Tolikk
Дата: 02.03.2007 10:04:05
Гы
Больше интересует пример параллельного выполнения нескольких select-ов в рамках "хранимой процедуры".
dmitrysk
Дата: 02.03.2007 10:11:19
| Tolikk |
Гы Больше интересует пример параллельного выполнения нескольких select-ов в рамках "хранимой процедуры". |
Процедура сама по себе - это последовательное выполнение операторов. Поэтому если хотите что-бы несколько select-ов выполнялись параллельно, то меняйте дизайн приложения, пишите разные процедуры, рисуйте диаграммы workflow или используйте собственные решения для распараллеливания, и возможно в результате что-то такое получится.
Fucker
Дата: 02.03.2007 11:01:49
| Tolikk |
Пердпосылка - новый четырехголовый сервер.
8.1.7 на Suse9.1, все "тяжелые" приложения построены как библиотеки Procedure&Package при запуске юзером одного экземпляра, такое впечатление, что трудится только один проц :( как сделать, чтоб при единичных запусках задействовать все ресурсы? Можно ли както запустить в процедуре несколько других процедур параллельно? А будет ли от этого толк? А может дело не в Оракле, а в ОСи??? |
Не надо ничего делать...
Есть такая книжечка:
Scaling Oracle8i: Building Highly Scalable OLTP System Architectures. Думаю, начать надо с основ...
А там, глядишь и такие вопросы сами собой отпадут...
Fucker
PS: Никакие примеры пока тебе на данном этапе не нужны...
PPS: Есть повод вспомнить теорию массового обслуживания...
Tolikk
Дата: 02.03.2007 11:03:40
Дело в том что "alter table ..... parallel ..." не работает с "temp table" !!! (а они активно
используются для всех промежуточных выборок) По этому и интересуют другие пути,
гуру, пожалуйста, вглядитесь в н.у. и дайте рекомендации.
Гликоген
Дата: 02.03.2007 11:11:43
Берете C#, любимый ETL-пакет или любой язык программирования, позволяющий делать треды.
И выполняете либо PL/SQL, либо скармливаете SQL-скрипты параллельно запущеным инстанциям SQL+.
Сейчас занимаюсь прямо этим.
На серваке 9.2.0.7 4ГбRAM, 4 проца, солярка -
10 потоков почти в 2 раза быстрее 5-ти.
20 уже медленнее 10, но может быть, из-за моего десктопа - они все пишут подробные логи :)
Jannny
Дата: 02.03.2007 11:11:56
| Tolikk |
| вглядитесь в н.у. и дайте рекомендации. |
Их мало, все зависит от того, что Вы можете сделать с задачей. Если ее можно распараллелить алгоритмом, то это Вам и стоит сделать, если же можно запускать каждый оператор только последовательно (по условиям задачи), то распараллелить можно только один оператор (в общем все, что написано выше).