oracle выполняет полное сканирование таблицы, но так быстро возвращает результаты

Когда я открываю TOAD и делаю select * from table, результаты (первые 500 строк) возвращаются почти мгновенно. Но план объяснения показывает полное сканирование таблицы, а таблица очень большая. Почему результаты такие быстрые?


person Victor    schedule 15.10.2012    source источник


Ответы (2)


Как правило, Oracle не нужно материализовать весь набор результатов, прежде чем он начнет возвращать данные (конечно, бывают случаи, когда Oracle должен материализовать набор результатов, чтобы отсортировать его, прежде чем он сможет начать возвращать данные). Предполагая, что ваш запрос не требует материализации всего набора результатов, Oracle начнет возвращать данные клиентскому процессу, независимо от того, является ли этот клиентский процесс TOAD, SQL*Plus или написанным вами приложением JDBC. Когда клиент запрашивает больше данных, Oracle продолжает выполнение запроса и возвращает следующую страницу результатов. Это позволяет TOAD относительно быстро возвращать первые 500 строк, даже если Oracle в конечном итоге потребуется много часов для выполнения всего запроса и возврата последней строки клиенту.

person Justin Cave    schedule 15.10.2012
comment
Спасибо. Но я вижу, что если я создам представление, выполнив select * в таблице, а затем выполнив :select * from view, это займет гораздо больше времени. Почему это? - person Victor; 15.10.2012
comment
@Kaushik - разницы быть не должно. Вы видите другой план запроса, о котором идет речь? Есть ли предикат (предложение WHERE) в любом запросе? - person Justin Cave; 15.10.2012
comment
Извините, я был неправ. В представлении есть некоторые сложные предикаты, и в этом проблема. - person Victor; 15.10.2012

Toad возвращает только первые 500 строк для повышения производительности, но если вы запустите этот запрос через интерфейс Oracle, например, JDBC, он вернет весь результат. Мое предположение состоит в том, что план объяснения показывает вам результаты в случае, если он не получает подмножество записей; вот как я его использую. У меня нет источника для этого, кроме моего собственного опыта.

person Christopher Gillis    schedule 15.10.2012
comment
Спасибо. Но мой вопрос в том, как результаты такие быстрые, даже если он возвращает только 500 строк? не будет ли он извлекать весь набор записей, а затем получать из него 500 строк? - person Victor; 15.10.2012
comment
Хорошее различие, извините, что я неправильно понял. Приведенный выше ответ объясняет это. - person Christopher Gillis; 15.10.2012