2016-07-15 99 views
0

我有一个700K +记录的表,其中有一个简单的GROUP BY查询需要超过35+秒才能执行。我没有关于如何优化这个的想法。在hsqldb中优化GROUP BY

SELECT TOP 10 called_dn, COUNT(called_dn) FROM reportview.calls_out GROUP BY called_dn; 
  • 在这里我想补充TOP 10限制网络传输引起的延迟。
  • 我有一个索引called_dn(hsqldb似乎没有使用这个)。
  • called_dn不可空。
  • reportview.calls_out是一个缓存表。

这里的表脚本:

CREATE TABLE calls_out (
    pk_global_call_id INTEGER GENERATED BY DEFAULT AS SEQUENCE seq_global_call_id NOT NULL, 
    sys_global_call_id VARCHAR(65), 
    call_start TIMESTAMP WITH TIME ZONE NOT NULL, 
    call_end TIMESTAMP WITH TIME ZONE NOT NULL, 
    duration_interval INTERVAL HOUR TO SECOND(0), 
    duration_seconds INTEGER, 
    call_segments INTEGER, 
    calling_dn VARCHAR(25) NOT NULL, 
    called_dn VARCHAR(25) NOT NULL, 
    called_via_dn VARCHAR(25), 
    fk_end_status INTEGER NOT NULL, 
    fk_incoming_queue INTEGER, 
    call_start_year INTEGER, 
    call_start_month INTEGER, 
    call_start_week INTEGER, 
    call_start_day INTEGER, 
    call_start_hour INTEGER, 
    call_start_minute INTEGER, 
    call_start_second INTEGER, 
    utc_created TIMESTAMP WITH TIME ZONE, 
    created_by VARCHAR(25), 
    utc_modified TIMESTAMP WITH TIME ZONE, 
    modified_by VARCHAR(25), 
    PRIMARY KEY (pk_global_call_id), 
    FOREIGN KEY (fk_incoming_queue) 
    REFERENCES lookup_incoming_queue(pk_id), 
    FOREIGN KEY (fk_end_status) 
    REFERENCES lookup_end_status(pk_id)); 

我我坚持这样的表现或者是有什么我可以尝试加快这个查询?

编辑:这里的查询计划,如果有帮助:

isDistinctSelect=[false] 
isGrouped=[true] 
isAggregated=[true] 
columns=[ COLUMN: REPORTVIEW.CALLS_OUT.CALLED_DN not nullable 
    COUNT arg=[ COLUMN: REPORTVIEW.CALLS_OUT.CALLED_DN nullable] 
    [range variable 1 
    join type=INNER 
    table=CALLS_OUT 
    cardinality=771855 
    access=FULL SCAN 
    join condition = [index=SYS_IDX_SYS_PK_10173_10177]]] 
groupColumns=[COLUMN: REPORTVIEW.CALLS_OUT.CALLED_DN] 
offset=[VALUE = 0, TYPE = INTEGER] 
limit=[VALUE = 10, TYPE = INTEGER] 
PARAMETERS=[] 
SUBQUERIES[] 

回答

0

好,因为它似乎没有办法避免这种情况下,全列扫描。

只是为了未来的灵魂达到了这个问题的参考,这是我最终使出:

创自INSERT/DELETE保持汇总表中原始表触发。这与适当的索引相结合,并在我的查询中使用LIMIT USING INDEX子句产生非常好的性能。