"паралельное" выполнение процедур

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
вглядитесь в н.у. и дайте рекомендации.
Их мало, все зависит от того, что Вы можете сделать с задачей. Если ее можно распараллелить алгоритмом, то это Вам и стоит сделать, если же можно запускать каждый оператор только последовательно (по условиям задачи), то распараллелить можно только один оператор (в общем все, что написано выше).