너무 많은 답변을 본 후 PostgreSQL (9.6.3) 데이터베이스에서 모두 벤치마킹하기로 결정했습니다. 더 작은 100,000 개의 테이블을 사용하고 Model.order ( "RANDOM ()"). first는 이미 2 배 더 느리기 때문에 제거했습니다.
10 열이있는 2,500,000 개의 항목이있는 테이블을 사용하는 hand down 승자는 pluck 방법이 러너보다 거의 8 배 빠릅니다. 방법은 내가 결국 사용하게 될 것입니다. 또한 문제가 발생할 수 있다는 점에 주목할 가치가 있습니다. 각각 하나가 무작위 적이 지 않기 때문에 한 번에 하나 이상의 결과를 뽑을 수 있습니다.
Pluck은 내 25,000,000 행 테이블에서 100 번 실행됩니다. 편집 : 실제로이 시간은 루프에서 pluck을 포함하면 id에서 간단한 반복만큼 빠릅니다. 하나; 상당한 양의 RAM을 차지합니다.
RandomModel user system total real
Model.find_by(id: i) 0.050000 0.010000 0.060000 ( 0.059878)
Model.offset(rand(offset)) 0.030000 0.000000 0.030000 ( 55.282410)
Model.find(ids.sample) 6.450000 0.050000 6.500000 ( 7.902458)
무작위 행을 배제하기 위해 100,000 행 테이블에서 2000 번 실행되는 데이터는 다음과 같습니다.
RandomModel user system total real
find_by:iterate 0.010000 0.000000 0.010000 ( 0.006973)
offset 0.000000 0.000000 0.000000 ( 0.132614)
"RANDOM()" 0.000000 0.000000 0.000000 ( 24.645371)
pluck 0.110000 0.020000 0.130000 ( 0.175932)