Производительность Oracle через SQLDeveloper против приложения - PullRequest
4 голосов
/ 22 декабря 2009

Я пытаюсь понять производительность запроса, который я написал в Oracle. В настоящее время у меня есть доступ только к SQLDeveloper и его таймеру выполнения. Я могу запустить SHOW PLAN, но не могу использовать функцию автоматической трассировки.

Написанный мною запрос выполняется примерно за 1,8 секунды, когда я нажимаю «выполнить запрос» (F9) в SQLDeveloper. Я знаю, что по умолчанию выполняется выборка только первых пятидесяти строк, но могу ли я хотя бы быть уверен, что 1,8 секунды составляют общее время выполнения плюс время доставки первых 50 строк моему клиенту?

Когда я помещаю этот запрос в хранимую процедуру (возвращая результаты через OUT REF CURSOR) и пытаюсь использовать его из внешнего приложения (службы отчетов SQL Server), выполнение запроса занимает более одной минуты. Я получаю аналогичную производительность, когда нажимаю «запустить скрипт» (F5) в SQLDeveloper. Кажется, что разница здесь заключается в том, что в этих двух сценариях Oracle должен передавать все строки назад, а не первые 50. Это заставляет меня думать, что между клиентским ПК и экземпляром Oracle существуют некоторые проблемы с сетевым подключением.

Мой запрос возвращает только около 8000 строк, поэтому эта производительность удивительна. Чтобы попытаться доказать мою теорию о латентности выше, я запустил такой код в SQLDeveloper, как этот:

declare
    tmp sys_refcursor;
begin
   my_proc(null, null, null, tmp);
end;

... И это продолжается около двух секунд. Опять же, часы выполнения SQLDeveloper точно указывают время выполнения запроса? Или я что-то упустил, и возможно ли, что на самом деле мой запрос нуждается в настройке?

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

1 Ответ

5 голосов
/ 22 декабря 2009

«Я знаю, что это только получение первые пятьдесят строк по умолчанию, но могу ли я по крайней мере, быть уверенным, что 1,8 секунд охватывает общее время выполнения плюс время доставить первые 50 строк на мой клиент? "

Нет, пришло время вернуть первые 50 строк. Это не обязательно требует, чтобы база данных определила весь набор результатов.

Думайте о столе как о энциклопедии. Если вам нужен список животных с именами, начинающимися с «A» или «Z», вы, вероятно, получите Aardvarks и Аллигаторов довольно быстро. Зебры займут намного больше времени, так как вам придется читать всю книгу. Если ваш запрос выполняет полное сканирование таблицы, он не будет завершен до тех пор, пока не прочитает всю таблицу (или книгу), даже если после первой главы ничего не будет найдено, потому что он не знает там нет ничего важного, пока не прочтет).

declare
    tmp sys_refcursor;
begin
   my_proc(null, null, null, tmp);
end;

Этот кусок кода ничего не делает. Более конкретно, он будет анализировать запрос, чтобы определить, что необходимые таблицы, столбцы и привилегии на месте. Фактически он не выполнит запрос и не определит, соответствуют ли какие-либо строки критериям фильтра.

Если запрос возвращает только 8000 строк, маловероятно, что сеть представляет собой серьезную проблему (если только они не являются очень большими строками).

Попросите вашего БД для быстрого обучения по настройке производительности.

...