Есть ряд возможностей.Вы можете отфильтровывать большое количество строк с недействительными / нулевыми датами в pub_time, но я сомневаюсь, что вы не заметите / не упомянете значительное их количество.
Три вещи, которые мне запомнилисьявляются:
1 - у вас есть индекс или составной индекс, включающий pub_time, и ограничение в предложении where инициирует использование другого пути доступа
2 - у вас не было статистики для оптимизатора, когда вы выполняли свой первый запрос.При выполнении второго запроса был выбран лучший путь доступа благодаря некоторому кешированию информации, которое происходило при запуске первого запроса.Это можно проверить, выполнив первый запрос еще несколько раз и увидев существенное улучшение производительности.
3 - Как и в первом пункте, оптимизатор может просто выбрать лучшийпуть доступа основывается исключительно на последствиях предложения where.Возможно, намекнуть, что нулевые / недействительные значения не нужно обрабатывать, достаточно - ваша система может избежать одного или нескольких полных сканирований таблиц, чтобы отсеять недопустимые / нулевые pub_times.
Определение причин подобных вещейбыстро становится эмпирическим предприятием - мне сложно сказать больше, не зная вашей платформы и версии.Из тэга, который я понимаю, вы используете оракул, и в этом случае вы должны иметь возможность использовать некоторую форму инструмента «объяснить запрос» или «объяснить план», чтобы лучше понять, что происходит.Для получения дополнительной информации об оптимизаторе оракула см. http://docs.oracle.com/cd/B10500_01/server.920/a96533/optimops.htm (Это для Oracle 9i v9.2, но в нем есть достойное объяснение концепций, не зависящих от версии)