【问题标题】:Optimizing GROUP BY in hsqldb在 hsqldb 中优化 GROUP BY
【发布时间】:2016-07-15 13:23:19
【问题描述】:

我有一个包含 700K+ 记录的表,其中一个简单的 GROUP BY 查询需要超过 35+ 秒的时间才能执行。我不知道如何优化它。

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[]

【问题讨论】:

    标签: hsqldb


    【解决方案1】:

    好吧,在这种情况下似乎无法避免全列扫描。

    仅供参考,未来的灵魂会遇到这个问题,这就是我最后诉诸的:

    在原始表中创建了一个由INSERT / DELETE 触发器维护的汇总表。这与合适的索引相结合并在我的查询中使用LIMIT USING INDEX 子句会产生非常好的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2012-12-31
      • 2011-08-29
      • 1970-01-01
      • 2010-09-23
      • 2014-05-04
      相关资源
      最近更新 更多