【问题标题】:Db2 max(DATE_FIELD) optimizationDb2 max(DATE_FIELD) 优化
【发布时间】:2014-01-14 06:28:53
【问题描述】:

我在我们的旧版软件中遇到了这个 SQL 语句: select max(DATE_FIELD) from schema.VERY_LARGE_TABLE.

现在,这本身不会有问题,但是 VERY_LARGE_TABLE 包含超过 20,000,000 条记录,并且语句的执行有时会超过指定的 30 秒超时。这现在代表了一个问题,因为用户看不到正确的日期。 我已将此日期存储在缓存中,因此一旦获得日期,当天就不再获得该日期。但这对原始问题没有帮助。

我想知道,有没有办法优化表或 SQL 语句以比现在更快地执行?

[编辑] 这种行为也仅在表位于 DB2 服务器的缓存中之前才存在。之后,查询将在大约 2 秒内运行。

[Edit2] 平台是 IBM DB2 9.7.6 for LUW。

[Edit3] DDL:

create table MYSCHEMA.VERY_LARGE_TABLE (
    ID integer not null generated always as identity (start with 1,
                                                      increment by 1,
                                                      minvalue 1,
                                                      maxvalue 2147483647,
                                                      no cycle,
                                                      cache 20),
    CODE_FIELD varchar(15) not null,
    DATE_FIELD date default CURRENT DATE not null
)
in TS_LARGE;

create unique index MYSCHEMA.VERY_LARGE_TABLE_1 on MYSCHEMA.VERY_LARGE_TABLE (CODE_FIELD asc, DATE_FIELD asc);
create index MYSCHEMA.VERY_LARGE_TABLE_ARCHIVE on MYSCHEMA.VERY_LARGE_TABLE (DATE_FIELD asc, CODE_FIELD asc);
create index MYSCHEMA.INDX_VERY_LARGE_TABLE_ID on MYSCHEMA.VERY_LARGE_TABLE (ID asc);

alter table MYSCHEMA.VERY_LARGE_TABLE add constraint MYSCHEMA.PK_VERY_LARGE_TABLE primary key (CODE_FIELD, DATE_FIELD);

【问题讨论】:

  • 您是否尝试在DATE_FIELD 上添加索引?
  • 重新标记为DB2,因为这就是你所说的你正在使用的东西。 sql-serverMicrosoft SQL Server 产品(不是 DB2)
  • @MikaelEriksson...我已经与我们的 DBA 进行了核对,并且该字段上已经设置了索引。
  • 这是干什么用的?特别是因为你发布的版本没有条件(没有WHERE 子句),我真的很怀疑这个需求。可能有更好的方法来查找/使用这些信息。例如,如果这表示“销售的最后一天”,但您有一个汇总信息的每日销售报告流程,只需将其从销售报告(或其他内容)中删除即可。
  • @Clockwork-Muse... 信不信由你,这仅用于显示表格填充数据的最后日期。这一切都没有什么花哨的。

标签: sql db2


【解决方案1】:

你可以做几件事。

  1. date_filed 上创建索引
  2. 在语句末尾执行带有with ur 的select 语句,例如 select max(DATE_FIELD) from schema.VERY_LARGE_TABLE with ur 这将加快进程。
  3. 尝试增加主要和次要日志文件的大小,但在执行此操作之前请注意获得DBA 的帮助,因为这会影响数据库,如果您不确定,请不要选择此选项。
  4. 如果有批量操作正在进行表问题频繁提交。

【讨论】:

  • 'with ur' 只有 0.4 秒左右
  • 这是一个依赖于平台的答案。
【解决方案2】:

只要你只有在 DATE_FIELD DESCENDING 上有索引,那么试试

SELECT DATE_FIELD
  FROM VERY_LARGE_TABLE
  ORDER BY DATE_FIELD DESC
  FETCH FIRST ROW ONLY
  WITH UR

【讨论】:

  • 比原来的语句慢了1.2秒。
猜你喜欢
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多