【发布时间】: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-server是 Microsoft SQL Server 产品(不是 DB2) -
@MikaelEriksson...我已经与我们的 DBA 进行了核对,并且该字段上已经设置了索引。
-
这是干什么用的?特别是因为你发布的版本没有条件(没有
WHERE子句),我真的很怀疑这个需求。可能有更好的方法来查找/使用这些信息。例如,如果这表示“销售的最后一天”,但您有一个汇总信息的每日销售报告流程,只需将其从销售报告(或其他内容)中删除即可。 -
@Clockwork-Muse... 信不信由你,这仅用于显示表格填充数据的最后日期。这一切都没有什么花哨的。