2012-03-11 30 views
5
LV_id number; 
Cursor CR_test Is 
    select t.id 
    from table1 t 
    where t.foo = p_foo 
    order by t.creation_date; 

Open CR_test; 
Fetch CR_test 
Into LV_id; 
Close CR_test; 

hay này:plsql - nhận hàng đầu tiên - cái nào tốt hơn?

select x.id 
from(select t.id 
    from table1 t 
    where t.foo=p_foo 
    order by t.creation_date) x 
where rownum = 1 

Cả hai nói trên làm cho kết quả tương tự nhưng tôi cần biết về cái nào là hiệu quả hơn!

Trả lời

7

Đây là Tom Kyte của thần chú:

Bạn nên làm điều đó trong một câu lệnh SQL duy nhất nếu có thể.
Nếu bạn không thể thực hiện nó trong một câu lệnh SQL, thì hãy thực hiện nó trong PL/SQL.
Nếu bạn không thể làm điều đó trong PL/SQL, hãy thử một thủ tục lưu trữ Java.
Nếu bạn không thể làm điều đó trong Java, hãy làm điều đó trong một thủ tục bên ngoài C.
Nếu bạn không thể làm điều đó trong một thói quen bên ngoài C, bạn có thể muốn suy nghĩ nghiêm túc về việc tại sao nó là bạn cần phải làm điều đó ...

http://tkyte.blogspot.com/2006/10/slow-by-slow.html

3

Cách dễ nhất để tìm hiểu trong trường hợp này là để kiểm tra các truy vấn của bạn.

Đảm bảo tự kiểm tra điều này, chỉ mục và dữ liệu trong bảng của bạn có thể tạo ra các kết quả khác nhau với bảng của bạn.

Nếu không có bất kỳ chỉ số, có vẻ như có một cách tiếp cận tốt hơn sử dụng chức năng phân tích DENSE_RANK:

SELECT MIN(id) KEEP (DENSE_RANK FIRST ORDER BY creation_date) 
INTO lv_id 
FROM table1 
WHERE foo = p_foo; 

tôi đã sử dụng đoạn mã sau để kiểm tra thời gian tiêu thụ bởi các truy vấn của bạn (thực hiện khối này nhiều lần, kết quả có thể thay đổi):

DECLARE 
    p_foo table1.foo%TYPE := 'A'; 
    lv_id table1.id%TYPE; 
    t  TIMESTAMP := SYSTIMESTAMP; 
BEGIN 
    FOR i IN 1 .. 100 LOOP 
    -- Query here 
    END LOOP; 
    dbms_output.put_line(SYSTIMESTAMP - t); 
END; 

Kết quả:

  1. Sử dụng con trỏ, lấy hàng đầu tiên:
    2,241 s

  2. Sử dụng truy vấn với ROWNUM:
    1,483 s

  3. Sử dụng DENSE_RANK:
    1,168 s

+0

+1 để phân tích rất tốt với số liệu thống kê –

Các vấn đề liên quan