Разница между двумя запросами при выборе случайной выборки из оракула - PullRequest
2 голосов
/ 21 июля 2009

Этот вопрос отвечает на вопрос о том, как выбрать случайную выборку из оракула, что именно то, что мне нужно. Я не понимаю, однако, разница между этим решением

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 1000

и что-то вроде

select * from mytable where rownum<=1000 order by dbms_random.value

Когда я выполняю запрос с использованием первого метода, это занимает много времени (все еще не завершено), но когда я запрашиваю с использованием 2-го метода, это очень быстро, но результаты не кажутся случайными.

Ценю и совет / направление, которое вы можете предоставить.

Спасибо!

JC

Ответы [ 4 ]

7 голосов
/ 21 июля 2009

Oracle выбирает строки на основе критерия до любой сортировки. Таким образом, ваш второй запрос может быть прочитан как:

  1. Выберите первые 1000 строк из mytable
  2. Сортировка этих 1000 строк по случайному значению

Следовательно, вы всегда будете получать одинаковые 1000 строк, только в случайном порядке. Первый запрос заставляет Oracle сначала случайным образом сортировать все строк:

  1. Сортировка всех строк по случайному значению
  2. Выберите первые 1000 из этих случайно упорядоченных строк
1 голос
/ 21 июля 2009

Более быстрая альтернатива:

ВЫБРАТЬ * ИЗ emp SAMPLE (10);

или

ВЫБРАТЬ * ИЗ emp SAMPLE (5) БЛОКОВ;

Читайте здесь: http://oracleact.com/papers/sampleclause.html

РЕДАКТИРОВАТЬ1: После перечитывания, это уже упоминалось (более или менее). Однако я не могу удалить этот ответ.

1 голос
/ 21 июля 2009

В Oracle, ORDER BY оценивается после ROWNUM.

Этот запрос:

SELECT  id, ROWNUM
FROM    (
        SELECT  NULL AS id
        FROM    dual
        UNION ALL
        SELECT  1 AS id
        FROM    dual
        )
ORDER BY
        id

получит следующее:

  id    rownum
----    ------
   1         2
NULL         1

Ваш первый запрос сначала упорядочивает значения случайным образом, выбирает первую тысячу записей, что занимает много времени.

Второй запрос сначала выбирает 1000 записей, затем сортирует их в случайном порядке, что, конечно, быстрее, но результаты не случайны.

0 голосов
/ 21 июля 2009

Второй вернет 1000 записей и упорядочит их в случайном порядке. В первом запросе это занимает больше времени, потому что он упорядочивает все записи и затем извлекает 1000 тыс., Которые закончились случайным образом в первых 1000 позициях.

Боюсь, что медленно или нет вам нужно что-то вроде первого запроса.

...