Если ваша таблица имеет одно нулевое значение, скрывающееся среди миллиарда строк, для ее обнаружения обычно требуется полное сканирование всей таблицы (остановка при ее обнаружении).
Это верно для ответов, использующих различные SQL формы, ответы, основанные на сборе статистики, и ответы, основанные на попытке применить ограничение NOT NULL
к столбцу.
После того, как вы используете ROWNUM=1
, чтобы убедиться, что вы остановились после первого нулевое значение, что вы можете попытаться сделать, это:
- Используйте подсказку
/*+ PARALLEL */
, чтобы сделать полное сканирование go быстрее - Если вы ' собрав статистику на столе, используя 100% выборку, вы можете посмотреть в
ALL_TAB_COLUMNS.NUM_NULLS
. Это не избавляет от необходимости полного сканирования таблицы, оно просто позволяет избежать его, используя тот, который был выполнен при сборе статистики. Недостатком этого подхода является то, что статистика может быть неактуальной. - Если в интересующем столбце есть индекс И в столбце
NOT NULL
в той же таблице есть индекс, вы можете попробуйте SELECT COUNT(INDEXED_COLUMN_NAME) FROM TABLE
и SELECT COUNT(INDEXED_NOT_NULL_COLUMN) FROM TABLE
и вычтите их. Это использует тот факт, что значения null
не будут отображаться в индексе, поэтому значения будут другими. Это будет быстрее, потому что индексы будут меньше и, следовательно, быстрее для чтения, чем полная таблица.
Если это то, что вам нужно будет делать часто, вы можете создать индекс на основе функции, чтобы ускорить это поиск в будущем:
CREATE index_name ON table_name ( NVL(column_name, impossible_value_for_column) );
например,
CREATE index_name ON table_name ( NVL(column_name, -99999999) );
Тогда
SELECT * FROM table_name
WHERE NVL(column_name, -99999999) = -99999999
AND column_name IS NULL -- in case your "impossible value" really wasn't impossible;