2011-06-10 104 views
4

你好我有一個SQL查詢,我試圖優化。這個查詢在0.3秒內完成,但我需要爲噸的不同storeIds運行相同的查詢 - 無論如何要優化此查詢以使其更快,或者更改它以便一次獲得所有storeIds。優化Oracle SQL查詢

我總是可以在C#中創建一個新命令,連接到該命令以使其成爲大量不同查詢的聯合。

select /*+ PUSH_SUBQ */ * 
from mytable r 
where r.s in (1, 7) 
and r.d in (1, 75) 
and r.storeid = 1162 
and r.period = 20110528 
and r.pid in (select /*+ no_unnest qb_name(subq1) */ 
productid from otherTable where itmid=9999) 

我已經試過這樣的東西,但它需要永遠。

select /*+ PUSH_SUBQ */ * 
    from mytable r 
    where r.s in (1, 7) 
    and r.d in (1, 75) 
    and r.storeid in (1162, 1223, 1231, 51231, 231, ...) 
    and r.period = 20110528 
    and r.pid in (select /*+ no_unnest qb_name(subq1) */ 
    productid from otherTable where itmid=9999) 

MyTable的有索引這樣的: pid是不唯一的,分區,NO JOIN_INDEX 所有其他的列是唯一的,分區,NO JOIN_INDEX

+0

你是什麼意思「所有其他列都是唯一的」?每一列都是獨一無二的(我認爲不是)?或者,除了pid外,還有一個涵蓋所有列的唯一索引?或者是其他東西?如果有多列索引,那麼每個索引中的列順序是什麼?索引是分區的,也是表格嗎?當前查詢的執行計劃是什麼? – 2011-06-10 22:42:09

+0

你能發佈實際執行計劃嗎?您可以使用DBMS_XPLAN獲取它。 – eaolson 2011-06-11 00:53:30

+0

另外,您使用的是哪個版本的Oracle? – 2011-06-11 04:43:39

回答

0

我的猜測是,使用,而不是加入的子查詢可以提供幫助。也只選擇要使用的列:

select r.d, r.storeid, r.period, r.pid /* select only columns you need */ 
from mytable r, otherTable o 
where r.s in (1, 7) 
and r.d in (1, 75) 
and r.storeid = 1162 
and r.period = 20110528 
and r.pid = o.productid /* use a join instead of subquery */ 
and o.itmid=9999 

衡量它看看。

+1

charlie,1989年打電話給他們想讓他們隱式的'where'加入回來。 – Johan 2011-06-10 21:04:11

+1

@Johan:將連接轉換爲JOIN ON語法留給讀者的練習:) – 2011-06-10 21:07:52

+0

這是原始查詢,它要慢得多。 – Overload119 2011-06-10 21:10:25

1

如果您需要這許多不同的商店跑,你大概會或者指定不同STOREID值的列表,即

select * 
    from mytable r 
where r.s in (1, 7) 
    and r.d in (1, 75) 
    and r.storeid IN(1162, 1163, 1164, ...) 
    and r.period = 20110528 
    and r.pid in (select productid 
        from otherTable 
        where itmid=9999) 

如果你想優化查詢的性能,您需要提供兩個表(MyTable和OtherTable)的結構,讓我們知道這兩個表上存在哪些索引,並且讓我們瞭解各種條件的基數。

我非常關心提示的存在(尤其是PUSH_SUBQ提示,因爲它位於錯誤的位置,所以會被忽略)雖然添加顯式提示可能非常少見,幾乎總是這樣,當Oracle生成一個糟糕的查詢計劃時,底層的統計數據會誤導優化器,如果是這樣的話,那麼修復統計信息要比提示查詢要好得多

1

沒有看到執行計劃和實際的索引/分區細節,我不知道該怎麼建議使查詢的執行速度更快。但是,在這種情況下,解析時間似乎很重要。是否真的使用所有條件的文字值你的樣品?你應該使用綁定變量;否則,你正在解析每個單獨的查詢,這不僅需要時間,而且還會造成瓶頸。

您可能想要運行擴展SQL跟蹤,並手動讀取跟蹤或通過分析器運行它。

更改查詢以獲得「所有的storeids一次」很簡單 - 完全刪除storeid上的條件。如果實際上需要每個可能的storeid的結果,那麼通過對每個塊運行一個查詢,您很可能會浪費大量時間重複訪問塊。但是,也許通過「所有的裝備」你意味着所有的一小組ID。

0
select r.* 
    from mytable r 
    inner join otherTable o on r.pid = o.productid and o.itmid = 9999 
    where r.s in (1, 7) 
    and r.d in (1, 75) 
    and r.storeid IN(1162, 1163, 1164, ...) 
    and r.period = 20110528 

嘗試此查詢它必須花費更少的時間。