Что происходит при ограничении подзапроса оракула - PullRequest
1 голос
/ 25 мая 2011

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

Как правило, для эмуляции синтаксиса LIMIT start_index,result_count MySQL и функциональности LIMIT result_count OFFSET start_index MySQL и PostgreSQL в Oracle мы используем:

SELECT P.* FROM
  ( SELECT COL1...COLN, ROW_NUMBER() OVER ID_COLUMN AS RN FROM MY_TABLE )
WHERE P.RN BETWEEN START_INDEX AND END_INDEX;

Вместо явной функции предела необходимо использовать это альтернативное средство. (Если есть лучший способ, пожалуйста, дайте мне знать)

Один из нас утверждал, что это означает, что Oracle фактически извлекает записи END_INDEX, а затем возвращает только те записи, которые имеют значение rn больше START_INDEX. Это означает, что при поиске записей 123,432-123,442 Oracle получит 123,431 ненужных записей. Затем было высказано мнение, что из этого следует, что две упомянутые БД с открытым исходным кодом (MySQL и PgSQL) косвенно имеют возможность сократить это.

Аргумент счетчика состоит в том, что СУБД оптимизированы для обработки подзапросов, что означает, что синтаксис не обязательно подразумевает поведение. Кроме того, синтаксисы LIMIT, вероятно, являются просто синтаксическим сахаром, который действительно является оберткой вокруг того, что должно быть явно указано в Oracle.

Есть ли кто-нибудь, кто может определить, какая из них является правильной интерпретацией? Возможно, оба в некотором роде верны?

1 Ответ

3 голосов
/ 25 мая 2011

Правильно, что Oracle обрабатывает END_INDEX строк и сбрасывает строки 1 в START_INDEX-1, но только выбирает строк START_INDEX в END_INDEX в курсоре.

Я не знаю, как LIMIT реализован в других СУБД, но я не представляю, как они могли бы поступить иначе: как они узнали бы, что выбирают 123 432-ю строку набора результатов без предварительного нахождения и отбрасывания предыдущие 123 431 строка?

На практике, если вы обнаружите, что применяете предложение LIMIT (или эквивалент Oracle) с START_INDEX более нескольких сотен, вам действительно необходимо переосмыслить свои требования.

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