это не должно занять много времени для запроса таблицы 1000 строк. Однако есть исключения, проверьте, находитесь ли вы в одном из следующих случаев:
1. Много строк было удалено
В прошлом в таблице было огромное количество строк. Поскольку отметка максимальной воды ( HWM ) все еще остается высокой (удаление не понизит ее) и FULL TABLE SCAN
считывает все данные до отметки максимальной отметки, для возврата результатов может потребоваться много времени даже если таблица сейчас почти пуста.
Анализ вашей таблицы (dbms_stats.gather_table_stats('<owner>','<table>')
) и сравнение пространства, фактически используемого строками (пространство на диске), с эффективным пространством (данными), например:
SELECT t.avg_row_len * t.num_rows data_bytes,
(t.blocks - t.empty_blocks) * ts.block_size bytes_used
FROM user_tables t
JOIN user_tablespaces ts ON t.tablespace_name = ts.tablespace_name
WHERE t.table_name = '<your_table>';
Вам нужно будет учитывать накладные расходы на строки и блоки, а также пространство, зарезервированное для обновления (PCT_FREE). Если вы видите, что используете намного больше места, чем требуется (типичные издержки ниже 30%, YMMV), вы можете сбросить HWM, либо:
ALTER TABLE <your_table> MOVE;
и затем перестройте ИНДЕКС (ALTER INDEX <index> REBUILD
), не забудьте впоследствии собрать статистику.
- использовать DBMS_REDEFINITION
2. Таблица имеет очень большие столбцы
Проверьте, есть ли у вас столбцы типа данных LOB, CLOB, LONG (irk) и т. Д. Данные размером более 4000 байтов в любом из этих столбцов хранятся вне строки (в отдельном сегменте), что означает, что если вы этого не сделаете выберите эти столбцы, вы будете запрашивать только другие меньшие столбцы.
Если вы в этом случае, не используйте SELECT *
. Либо вам не нужны данные в больших столбцах, либо используйте SELECT rowid
, а затем выполните второй запрос: SELECT * WHERE rowid = <rowid>
.