2009-07-21 2 views
2

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

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

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

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

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

Цените и совет/направление y'all может обеспечить.

Спасибо!

JC

ответ

7

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

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

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

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

В 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

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

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

1

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

SELECT * FROM EMP SAMPLE (10);

или

SELECT * FROM EMP SAMPLE (5) БЛОКОВ;

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

edit1: После перечитывать, это уже было сказано (более или менее). Однако я не могу удалить этот ответ.

+0

Я думаю, что этот ответ стоит здесь, если кто-то прочитает этот вопрос и просто скопирует запрос, не глядя дальше. –

Смежные вопросы