Как улучшить производительность простого запроса на выборку в Oracle - PullRequest
0 голосов
/ 26 декабря 2018

Я недавно попал на собеседование, и мне задали вопрос

У нас есть стол employee(id, name).И в нашем Java-коде мы пишем логику для извлечения данных из этой таблицы и отображения их в пользовательском интерфейсе.Запрос:

Select id,name from employee

Запрос состоял в том, что во время отладки мы обнаружили, что этот вызов jdbc для запуска запроса и получения результата занимает, скажем, 20 секунд, и мы хотим уменьшить его доскажем 5 секунд или в оптимальное время.Как мы можем это сделать, или как мне решить эту проблему?

Поскольку в запросе нет where clause, я не предлагал индексировать столбец.Так как эта логика занимает 20 секунд каждый раз, поэтому и о другом коде, блокирующем эту таблицу, также не может быть и речи.Я предположил, что ограничение количества записей, извлекаемых из таблицы, должно помочь, но интервьюер не выглядел убежденным

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

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Можно попытаться увеличить fetchSize() на Statement/PreparedStatement, чтобы уменьшить количество сетевых обращений между сервером приложений / рабочим столом и сервером базы данных.Вы можете запустить несколько потоков, которые будут запрашивать часть данных, а затем объединить все данные из нескольких потоков.

0 голосов
/ 27 декабря 2018

ОК, так что это вопрос интервью, поэтому и проблема, и решения являются гипотетическими.Интервьюер запрашивает возможные оптимизации и / или подходы.Вот некоторые из них, которые, скорее всего, помогут:

  • Измените запрос на страницу данных, а не на выборку всего лота.Это выглядит применимо для примера запроса.Обратите внимание, что это не просто "ограничение количества строк, выбранных из таблицы" ... возможно, поэтому интервьюер выглядел сомнительным, когда вы сказали это!

  • Если вам нужно отобразить весь выбранный набор записей, но в сокращенной форме (например, суммировать, усреднить, отсортировать, сопоставить и т. Д.), Сделайте сокращение в запросе, а не извлекайте записи и делайте это в клиенте.

  • Настройте fetchSize() в соответствии с предложением Ивана.

Вот некоторые другие идеи, которые с меньшей вероятностью помогут и / или потребуют обширной доработки.

  • Посмотрите на настройки сети.Например, вы можете повысить пропускную способность путем настройки буфера TCP на уровне ОС или оптимизации физических или виртуальных сетевых путей.
  • Выполните запрос на самом сервере базы данных (чтобы исключить издержки сети)
  • Использовать таблицу в памяти
  • Запросить вторичный сервер базы данных;например, снимок только для чтения или подчиненный
0 голосов
/ 26 декабря 2018

РЕДАКТИРОВАТЬ: не относится к этой ситуации, потому что id и name являются единственными столбцами в этой таблице, но все же полезно для других читателей заметить.


Если вы создаете индекс, охватывающий как id, так и name, то база данных может использовать этот индекс для более быстрого чтения данных, поскольку ей даже не придется даже читать таблицу.

См. ссылка для более подробного объяснения.

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

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