2013-07-17 92 views
0

我在執行以下查詢時遇到性能問題。需要太多時間來獲取結果。它一次獲取整個結果(比如說3000)。我試圖通過以下方式獲取10條記錄:使用rownum <11。但它只顯示3-4條記錄。重複的header_ids存在。我們可以使用DISTINCT和rownum來獲得10行。有沒有其他方法可以解決這個問題?使用DISTINCT和rownum獲取記錄

SELECT DISTINCT oh.header_id, 
oh.cust_po_number purchase_order, 
oh.order_number, 
DECODE(oh.orig_sys_document_ref, NULL, oh.orig_sys_document_ref, SUBSTR(oh.orig_sys_document_ref, LENGTH('OE_ORDER_HEADERS_ALL')+1)) web_reference_number, 
TO_CHAR(oh.ordered_date, 'FMMon-DD-YYYY') date_ordered, 
(SELECT MIN(schedule_ship_date) 
FROM oe_order_lines_all 
WHERE header_id = oh.header_id 
And Oh.Sold_To_Org_Id = 12338 
) oldest_schedule_ship_date, 
oe_totals_grp.get_order_total(ol.header_id,NULL,'ALL') total_value, 
oh.transactional_curr_code currency_code, 
COUNT(*) over() AS total_count 
FROM oe_order_headers_all oh, 
oe_order_lines_all ol 
Where Oh.Header_Id = Ol.Header_Id 
-- AND ol.actual_shipment_date BETWEEN sysdate - 180 AND sysdate 
AND oh.sold_to_org_id = 12338 

回答

3

如果您使用的是rownum,那麼我認爲您使用的是Oracle。

Oracle在之後應用rownum,而不是在之前,distinct。唉。我認爲這是後面應用order by的同樣邏輯的一部分。

您可以使用子查詢解決這個問題:你的性能問題的

select s.* 
from (<your query here>) s 
where rownum < 11; 

部分原因可能是由於select子查詢。我認爲你可以解析函數替換它:

SELECT DISTINCT oh.header_id, 
     oh.cust_po_number purchase_order, oh.order_number, 
     DECODE(oh.orig_sys_document_ref, NULL, oh.orig_sys_document_ref, 
     SUBSTR(oh.orig_sys_document_ref, LENGTH('OE_ORDER_HEADERS_ALL')+1)) web_reference_number, 
     TO_CHAR(oh.ordered_date, 'FMMon-DD-YYYY') date_ordered, 
     min(schedule_ship_date) over (partition by oh.header_id) as oldest_schedule_ship_date, 
     oe_totals_grp.get_order_total(ol.header_id,NULL,'ALL') total_value, 
     oh.transactional_curr_code currency_code, 
     COUNT(*) over() AS total_count 
FROM oe_order_headers_all oh join 
    oe_order_lines_all ol 
    on Oh.Header_Id = Ol.Header_Id 

- 其中oh.sold_to_org_id = 12338

其實,對我來說,它看起來像180和SYSDATE - 與ol.actual_shipment_date之間SYSDATE應使用group by而不是具有分析功能的distinct來編寫整個查詢。這也可能有助於表現。

+0

是的,rownum是作爲where子句的一部分被過濾的resultrow的實習編號。所以它發生在獨特之前。 – Koryu