Сохранение набора результатов для последующей выборки - PullRequest
3 голосов
/ 07 ноября 2010

У меня есть несколько запросов, которые выполняются довольно долго (20-30 минут). Если одновременно запускается много запросов, пул соединений быстро истощается.

Можно ли обернуть длительный запрос в оператор (процедуру), который сохранит результат общего запроса во временную таблицу, разорвет соединение и извлечет (опрашивает) результаты позже по требованию?

РЕДАКТИРОВАТЬ: запросы и структуры данных оптимизированы, и такие советы, как «проверить свои индексы и план выполнения», не работают для меня. Я ищу способ сохранить [возможно] байтовое представление общего набора результатов для последующего получения.

Ответы [ 4 ]

6 голосов
/ 07 ноября 2010

Прежде всего, 20-30 минут - это чрезвычайно длительное время для запроса - вы уверены, что не пропускаете никаких индексов для запроса?Проверьте план выполнения - вы можете получить огромный выигрыш в производительности благодаря правильно размещенному индексу.

В MySQL вы можете выполнить

INSERT INTO `cached_result_table` (
    SELECT your_query_here
)

(конечно, cached_result_table необходимоиметь такую ​​же структуру столбцов, что и ваши SELECT, в противном случае вы получите ошибку).

Затем вы можете запросить эти кэшированные результаты (вместо исходных таблиц) и выполнить только вышеуказанный запросвремя от времени - обновлять cached_result_table.

Конечно, сначала потребуется выполнить запрос хотя бы один раз, что займет упомянутые вами 20-30 минут.Я предлагаю предварительно заполнить кэшированную таблицу до того, как будут запрошены данные, и оставить механизм блокировки, чтобы запрос на обновление не запускался несколько раз одновременно.Псевдокод:

init:
insert select your_big_query

work:
if your_big_query cached table is empty or nearing expiration:
  refresh in the background:
     check flag to see if there's another "refresh" process running
     if yes
       end // don't run two your_big_queries at the same time
     else 
       set flag
       re-run your_big_query, save to cached table
       clear flag
serve data to clients always from cached table
2 голосов
/ 07 ноября 2010

Простой способ сделать это в Oracle - «CREATE TABLE sometempname AS SELECT ...». Это создаст новую таблицу, используя столбцы результата из выбора.

1 голос
/ 08 ноября 2010

Не совсем уверен, что вы запрашиваете.

В настоящее время у вас есть 50 сеансов базы данных. Допустим, вы получаете 40 запущенных длительных запросов, а 10 оставляют для обслуживания остальных.

То, что вы, похоже, запрашиваете, так это то, что вы хотите, чтобы эти 40 запросов асинхронно (выполнялись в фоновом режиме) не забивали пул соединений из 50. Вопрос в том, хотите ли вы, чтобы эти 40 выполнялись одновременно с (потенциально) другими 50 запросы из пула соединений, или вы хотите, чтобы они каким-то образом были поставлены в очередь?

Очередь может быть выполнена (смотрите DBMS_SCHEDULER и DBMS_JOB). Но вам нужно будет доставить эти результаты в какую-то другую таблицу и знать, как доставить этот набор результатов. Старый способ - просто создавать отчеты по запросу, которые доставляются в каталог на общем диске или по электронной почте. Может быть PDF или CSV или Excel.

Если вы хотите, чтобы 40 одновременно работал с 50 настройками «пула соединений», то вам лучше всего настроить отдельный пул соединений для долго выполняющихся запросов.

Вы можете заглянуть в Resource Manager для завершения вызовов, которые занимают слишком много или слишком много ресурсов. Таким образом, пул быстрого доступа не может быть перегружен долгосрочными запросами.

0 голосов
/ 07 ноября 2010

Самый общий подход в Oracle, о котором я могу подумать, - это создание хранимой процедуры, которая преобразует набор результатов в XML и сохраняет его как CLOB XMLType в таблице с результатами ваших длительных запросов.

Более подробную информацию о генерации XML можно получить из общих наборов результатов здесь .

SQL> select dbms_xmlgen.getxml('select employee_id, first_name,
  2  last_name, phone_number from employees where rownum < 6') xml
  3  from dual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...