2015-05-08 4 views
0

Если у меня есть представление (или таблица), содержащее миллионы строк, и я выполнил эти два запроса из разных сеансов, на какой-нибудь запрос будет оказано неблагоприятное влияние на другое? (Обратите внимание, что DML не будет продолжаться)Одновременные запросы в той же таблице/представлении влияют на производительность

например. Выберите * из t1, где sex = 'M'; (Возвращает 20 столбцов и 10 000 строк) выбрать секс из t1 где rownum < 2;

Что делать, если у меня было несколько сеансов, выполняющих запрос 1? Все ли они будут одинаково медленными, пока один из них не будет кэширован (при условии, что он будет достаточно большим)?

В настоящее время я испытываю ухудшение производительности при выполнении подобных запросов в тесте балансировки нагрузки для более быстрых запросов, однако при выполнении отдельно (даже если результат не был кэширован), я получаю «нормальное» время ответа.

ответ

0

Если таблицы не изменяются и запросы используют базовые таблицы, то было бы удивительно, если бы эти два запроса мешали друг другу. В частности, второй запрос:

select sex 
from t1 
where rownum < 2; 

Необходимо просто выбрать один ряд и очень быстро.

Первый может воспользоваться индексом на t1(sex).

Если t1 действительно является видом, то Oracle, вероятно, должен выполнить всю обработку для представления. Дважды, один раз для каждого запроса. Если представление сложное, тогда это поставит нагрузку на сервер и замедлит все.

+0

Вид представляет собой объединение нескольких небольших таблиц, чтобы создать представление «master_all_clients». Запросы, которые работают медленно, не так просты, как в приведенном примере, однако я вижу тайминги> 2 сек, когда они работают за пределами балансировки нагрузки, они берут 0,1-0,2 секунды. Есть ли способ ускорить этот процесс? Если я создал другое представление, например. «view_for_slow_sql» (20 столбцов), а другой для «view_for_quick_sql» (2 столбца), как для ссылок на одни и те же базовые таблицы - будет ли это вообще помогать, или все еще требуется одно и то же общее чтение блоков в таблицах? –

0

Вы посмотрели, что происходит в буферном кеше, в частности, V $ DB_CACHE_ADVICE для загрузки/промаха буфера? Существуют ли какие-либо кандидаты (в базовых таблицах) для добавления в буфер «KEEP», чтобы избежать ввода-вывода? Чтобы быть справедливым, может потребоваться некоторое время, чтобы контролировать это и понять, что представляет собой картина, прежде чем принимать решение о том, какие действия нужно предпринять, но стоит посмотреть. Более подробная информация здесь: https://docs.oracle.com/database/121/TGDBA/tune_buffer_cache.htm#TGDBA555.

+0

Я считаю, что эти данные кэшируются каждые 12 часов в памяти, однако я думаю, что это «начальное» кэширование, которое вызывает баланс нагрузки для тайм-аута для других запросов, однако я не уверен на 100%, если это причина или нет, или если это реально возможно, что это было бы причиной. –

+0

Итак, если вы сбросили буфер до запуска другого запроса, не имеет значения? – TenG

+0

Как мне очистить буфер? Я пытался сделать это в прошлом, и это в значительной степени связано с тем, что a. На самом деле очень сложно сделать надежно и b. на самом деле не будет похож на живую среду, потому что она находится в искусственном состоянии. Если мне нужно кэшировать результаты, а затем запускать тесты, это нормально, в течение периода два раза в день, когда результаты кэшируются, это должно быть признанным деградации обслуживания, однако мне нужно «знать», это то, что вызывало другое время в моих тестах, и не является чем-то более серьезным. –

Смежные вопросы