Оптимизация SQL без создания индекса - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь оптимизировать SQL-запрос, который выполняется в базе данных Oracle.Запрос:

SELECT Col_5, Col_10, Col_15, Col_20, ..., Col_100
FROM TABLE
WHERE Col_5 = 37 AND Col_10 IS NOT NULL

TABLE содержит более 100 миллионов строк и часто обновляется.Это выглядит так:

+--------+-------+-----+-------+-----+------------+-----+---------+
| Col_1  | Col_2 | ... | Col_5 | ... |  Col_10    | ... | Col_100 |
+--------+-------+-----+-------+-----+------------+-----+---------+
| 12     | Bob   | ... | 18    | ... | 08/06/1992 | ... | 12.6    |
| 6      | Mike  | ... | 37    | ... | NULL       | ... | 18.0    |
| 18     | Sally | ... | 6     | ... | NULL       | ... | 16.3    |
| :      | :     | :   | :     | :   | :          | :   | :       |
| 94     | Eli   | ... | 37    | ... | 01/22/2003 | ... | 19      |
+--------+-------+-----+-------+-----+------------+-----+---------+

Мой запрос возвращает около 10 миллионов строк, но его выполнение занимает около 30 минут.Я должен добавить, что этот запрос считывается в Pandas DataFrame в Python через pd.read_sql (SQL_query, data_connection).Как только он в Python, все последующие манипуляции с данными выполняются в течение нескольких секунд.По этой причине я исключил возможность простого добавления большего количества предложений WHERE, чтобы уменьшить количество возвращаемых строк, поскольку я хотел бы выполнять операции со всеми возвращенными примерно 10 миллионами строк.

К сожалению, создание индекса не вариант.Учитывая это ограничение, могу ли я как-нибудь ускорить мой запрос?

Спасибо!

1 Ответ

0 голосов
/ 26 июня 2018

Ваш запрос возвращает около 10% строк таблицы.Он выбирает несколько столбцов по всей строке.Если предположить, что опубликованные примеры данных являются репрезентативными, данные не объединяются, и выбранные строки будут поступать со всей таблицы.

Так что индексация вам не поможет.Вам нужно полное сканирование таблицы.

Запустите план объяснения по вашему запросу, чтобы убедиться, что вы его используете.Если по какой-либо причине вы используете какую-либо форму индексированного чтения, то исправьте это (например, обновив устаревшую статистику).Кроме того, существует не так много способов настроить полное сканирование таблицы: если у вас есть Enterprise Edition и доступно несколько процессоров, параллельный запрос может помочь.

Но давайте вернемся на минуту назад.

«Мой запрос возвращает около 10 миллионов строк, но его выполнение занимает около 30 минут».

Где узкое место?Почти наверняка не база данных.10 миллионов строк по ~ 20 столбцов - это большой объем данных, но полное сканирование таблицы на одну таблицу должно выполняться за пару минут, если не намного меньше (в зависимости от работоспособности вашего сервера).

Скорее всего, это будет сеть (если вы не выполняете этот запрос локально, то есть клиент pandas находится на сервере базы данных).Вы передаете много-много пакетов по сети.Возможно, вы работаете с ограничением доступной пропускной способности, поэтому поговорите со своей командой сетевого администратора (или установите wireshark !).Если проблема связана с задержкой в ​​сети, проверьте, помогает ли настройка pd.read_sql() chunksize.

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


'Команда EXPLAIN PLAN FOR ничего не возвращает'

EXPLAIN PLAN заполняет таблицу. Узнайте больше .Вам нужно запросить таблицу, чтобы получить план.Встроенный пакет DBMS_XPLAN - ваш лучший друг здесь. Проверьте это .Некоторые IDE (например, PL / SQL Developer) обрабатывают это прозрачно.

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