Oracle - Почему ВЫБРАТЬ * ОТ Foo; так медленно? - PullRequest
7 голосов
/ 23 сентября 2011

Я работаю над некоторыми проблемами производительности Oracle в нашем веб-приложении. Одна вещь, которую я заметил, которая, кажется, запутывает любые виды тестов, это то, что простые запросы, которые возвращают много результатов, все еще очень медленные. Один пример:

select * from TPM_PROJECTWORKGROUPS;

Когда я запускаю его, я получаю:

 5825 record(s) selected [Fetch MetaData: 0ms] [Fetch Data: 59s] 

 [Executed: 9/22/2011 1:52:38 PM] [Execution: 203ms] 

Если я правильно понимаю, это означает, что для выполнения фактического запроса потребовалось 203 мс, но потребовалось 59 секунд для того, чтобы эти данные были возвращены клиенту, это означает, что в данном случае означает «выборка»?

У меня нет доступа для прямого подключения к компьютеру базы данных и локального выполнения запроса, но можно ли предположить, что виновником является фактическая пропускная способность сети? Это имеет смысл, поскольку я нахожусь в Сиэтле, а сервер - в Нью-Йорке, но минута для 5800 строк кажется довольно медленной.

Есть ли какой-нибудь быстрый совет для а) подтверждения того, что пропускная способность сети действительно является проблемой, и б) каких-либо "ошибок" или вещей, которые нужно проверить, почему сериализация данных по проводам такая медленная? Спасибо!

Несколько обновлений на основе комментариев:

ВЫБРАТЬ СЧЕТЧИК (*) ОТ (выберите * из TPM_PROJECTWORKGROUPS) t;

Результаты:

 1 record(s) selected [Fetch MetaData: 0ms] [Fetch Data: 0ms] 

 [Executed: 9/22/2011 2:16:08 PM] [Execution: 219ms] 

И если я попытаюсь выбрать только один столбец:

ВЫБРАТЬ ПРОЕКТ ИЗ TPM_PROJECTWORKGROUPS;

Результаты:

5825 выбранных записей [Fetch MetaData: 0ms] [Fetch Data: 1m 0s]

[Выполнено: 22.09.2011 14:17:20] [Выполнено: 203мс]

Схема таблицы:

ПРОЕКТ (НОМЕР) РАБОЧИЙ ГРУПП (НОМЕР)

Ответы [ 4 ]

6 голосов
/ 23 сентября 2011

Какой API вы используете для взаимодействия с базой данных (SQL * Plus, JDBC, ODBC и т. Д.)?Любой API будет иметь некоторую функцию, которая определяет, сколько строк (или сколько данных) нужно извлечь за один оборот в одну сеть.Например, в SQL * Plus это set arraysize N.В JDBC это setFetchSize .Другие API будут иметь аналогичные функции.Если вы находитесь в глобальной сети, вы, как правило, хотите свести к минимуму болтливость своего приложения, увеличив число строк, извлекаемых при каждом обходе сети.

В тех же строках вы, вероятно, выиграете от меньшего количества перемещений.данные по сети и проталкивают больше логики на сервер.Вы действительно отображаете сетку с 5800 строками данных для пользователя?Или вы извлекаете эти данные и затем выполняете некоторую обработку в приложении (то есть упорядочиваете данные и отображаете первые 100 строк)?Если вы сможете перенести эту обработку в базу данных и уменьшить объем данных, которые должны передаваться по базе данных, вам будет намного лучше.

Oracle имеет опции для настройки SDU и TDU, а такженесколько других сетевых параметров в SQL * Net.Однако я не стал бы рассматривать эти варианты, пока вы не оптимизируете размер выборки и не убедитесь, что извлекаете как можно меньше данных.

1 голос
/ 25 сентября 2011

Выбор нескольких тысяч строк в таблице не должен занимать почти минуту.Я предполагаю, что у вас есть проблемы с производительностью в других местах вашей системы.Может быть другая активность в БД или проблемы с сервером / сетью / хранилищем.Является ли производительность других запросов в вашей БД такой же низкой?

1 голос
/ 23 сентября 2011

Поскольку вы имеете дело с веб-приложением, очень важно быстро что-то вернуть.Исследуйте подсказку FIRST_ROWS.Это может иметь значение для вашей ситуации.

0 голосов
/ 17 сентября 2017

Пожалуйста, проверьте фрагментацию таблицы. Обычно Фрагмент таблицы вызывает больше операций ввода-вывода, и запрос идет медленно. Вы можете проверить это с помощью советника сегмента oracle и решить его, есть два способа, во-первых, с помощью команды oracle shrink table: замедлить и заблокировать таблицу, во-вторых, с помощью команды oracle move table, это слишком быстро, особенно если использовать параметр параллельной работы oracle , единственная точка в таблице перемещения - это неиспользуемые индексы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...