2011-09-20 25 views
29

Db'mdeki TÜM verilerinize SADECE LIMIT ve OFFSET kullanmadan önce sıralamak istiyorum. BöyleSQL (ORACLE): SIPARIŞ VE LIMIT

Sorgu:

SELECT select_list 
    FROM table_expression 
    [ ORDER BY ... ] 
    [ LIMIT { number | ALL } ] [ OFFSET number ] 

ben sıralama bu sıralı sonucunun ilk row_count satırları bulmuş en kısa sürede biter biliyorum. LIMIT ve OFFSET aramadan önce tüm verileri sıralayabilir miyim?

+0

İlgili: http://stackoverflow.com/q/470542/1461424 o Belki aynı kolaylıkla cevap değil – Krumia

cevap

54

12.1'den önce Oracle, LIMIT veya OFFSET anahtar sözcüklerini desteklemez.

SELECT a.* 
    FROM (SELECT b.*, 
       rownum b_rownum 
      FROM (SELECT c.* 
        FROM some_table c 
       ORDER BY some_column) b 
     WHERE rownum <= <<upper limit>>) a 
WHERE b_rownum >= <<lower limit>> 

ya kullanılarak analitik fonksiyonlar:

SELECT a.* 
    FROM (SELECT b.*, 
       rank() over (order by some_column) rnk 
      FROM some_table) 
WHERE rnk BETWEEN <<lower limit>> AND <<upper limit>> 
ORDER BY some_column 

bu yaklaşımların Ya tür verecektir satırlar N Sonuç kümesindeki M yoluyla sıraları N almak istiyorsanız, böyle bir şey gerekiyordu sıralı sonucun M ile.

12,1 yılında

ve daha sonra kullanabileceğiniz OFFSET ve/veya FETCH [FIRST | NEXT] operatörleri:

SELECT * 
    FROM some_table 
ORDER BY some_column 
OFFSET <<lower limit>> ROWS 
    FETCH NEXT <<page size>> ROWS ONLY 
+2

olarak sordu: Bu yaklaşımlardan hangisi büyük tablolarda (1-10 milyon satır) daha iyi olabilir? Belki de 3-derinlikli bir seçimle yaklaşık 2-derinlik rank()? Aslında sanırım ikisini de deneyeceğim. –

+7

Merak eden herkes için, ilk yaklaşımın birkaç saniye sonra daha hızlı olduğunu ve ikinci yaklaşımın birkaç saniyede olduğunu keşfettim. Zaman ekleyen veya herhangi bir sorgu optimizasyonunu engelleyen işlevin kendisinin olup olmadığından emin değilim. Her nasılsa birden çok yaklaşım gösterdiğiniz için teşekkür ederiz! –