我重新這種情況下是這樣的...
CREATE TABLE test_table
(id integer
, corpId integer
, paid_amt number(10,2)
, incoming_date DATE);
ALTER TABLE test_table
add CONSTRAINT test_table_pk PRIMARY KEY (id);
create index test_table_nui_1 on test_table(corpId);
create index test_table_nui_2 on test_table(incoming_date);
create sequence test_table_seq;
insert into test_table
select test_table_seq.nextval
,MOD(test_table_seq.currval,6)
,MOD(test_table_seq.currval,10) + 1
,sysdate - MOD(test_table_seq.currval,200)
from all_objects, user_objects;
笛卡爾ALL_OBJECTS和USER_OBJECTS之間的連接僅僅是一個黑客獲得快速插入記錄的負載。 (在這種情況下657000行)
通過選擇運行第一所有657000 ...
select sum(paid_amt)
from test_table;
計劃 SELECT語句ALL_ROWSCost:621字節:13基數:1個
2 SORT AGGREGATE字節:13基數:1
1個TABLE ACCESS FULL TABLE DAVE.TEST_TABLE費用:621字節:9923914基數:763378
然後109650一corpId ...
select sum(paid_amt)
from test_table
where corpId = 5;
計劃 SELECT語句ALL_ROWSCost:265字節:26基數:1個
3 SORT AGGREGATE字節:26基數:1
2表訪問由INDEX ROWID表DAVE.TEST_TABLE成本:265字節:3310138基數:127313
1 INDEX RANGE掃描索引DAVE.TEST_TABLE_NUI_1費用:213基數:3,054
最後20,836行按日期限制...
SELECT sum(paid_amt) totalamount
FROM test_table e
WHERE e.corpId = 5
AND e. incoming_date >= to_date('01-12-2012','dd-mm-yyyy')
AND e. incoming_date <= to_date('09-01-2013','dd-mm-yyyy')
計劃 SELECT語句ALL_ROWSCost:265字節:35基數:1個
3 SORT AGGREGATE字節:35基數:1
2表訪問由INDEX ROWID表DAVE.TEST_TABLE成本:265字節:871360基數:24896
1個索引範圍掃描INDEX DAVE.TEST_TABLE_NUI_1成本:213基數:3054個
所有3個查詢是快速(即< 0.5秒)
另一種方法是刪除nui_1和nui_2,並在兩列上創建組合索引。這則在31毫秒跑在我的分貝
create index test_table_nui_3 on test_table(corpId, incoming_date);
計劃 SELECT語句ALL_ROWSCost:15字節:35基數:1級
3排序骨料字節:35基數:1
2 TABLE ACCESS BY INDEX ROWID表DAVE。 TEST_TABLE費用:15字節:871360基數:24896
1索引範圍掃描索引DAVE.TEST_TABLE_NUI_3費用:3基數:14
這表明聚合函數是沒有問題的,但你的索引可能。最好的辦法是檢查你的解釋計劃。
什麼是您正在運行的兩個查詢?特別是,當你不使用聚合函數時,你是否選擇了「paid_amt」列?兩個查詢計劃是什麼?你是否說要返回64,000行中的最後一行需要不到一秒的時間?或者,您是否使用了GUI,在獲取最後一行之前顯示前幾行? –
2個查詢:第一個是我已經發布的一個,第二個是提取計數的計數(使用count(*))。計數在不到一秒的時間內達到64k,而總和需要4分鐘。 – user2194253