是否有更好/更快的方法在列中找到具有最大值的行?

时间:2010-06-21 13:47:47

标签: sql informix

INFORMIX-SE 7.32:

我有一个约5,000个nrows的事务表。 transaction.ticket_number [INT]是每次更新特定行时使用下一个可用顺序票号更新的列。该列是唯一索引的。我目前正在使用以下SELECT语句来定位max(transaction.ticket_num):

SELECT MAX(transaction.ticket_number) FROM transaction;

由于正在更新的行是根据transaction.fk_id [INT]进行聚类的,它连接到customer.pk_id [SERIAL],该行实际上并不位于事务表的末尾,而是位于属于每个特定客户的交易行组。我选择对属于每个客户的交易进行集群,因为当我滚动每个客户交易时,响应时间会更快。是否有更快的方法使用上述查询定位max(transaction.ticket_number)?..'事务(ticket_number)降序的唯一索引是否会改善访问权限,还是索引完全从开始到结束无关?

2 个答案:

答案 0 :(得分:1)

由于NULLABLE列和其他因素,使用索引等,你经常会发现以下会更快,但通常只能忽略不计......

SELECT TOP 1 ticket_number FROM transaction ORDER BY ticket_number DESCENDING

我也不确定你是否真的在[ticket_number]上有一个索引?或者你只有一个UNIQUE约束?约束无助于确定MAX,但是INDEX将有效。

如果INDEX与ticket_number一起作为第一个可索引列存在:
- 可能会使用索引搜索/查找,而不需要扫描其他值

如果存在INDEX且ticket_number不是第一个可索引列:
- 可能会发生索引扫描,检查索引中的每个唯一条目

如果不存在可用的INDEX:
- 整个表格将被扫描

答案 1 :(得分:1)

在现代机器上只有5000行的表格上,您不太可能衡量各种技术的性能差异,尤其是在我认为您所面临的单用户场景中。即使5000行都处于允许的最大大小(不到32 KB),您将处理160 MB的数据,这些数据很容易适应机器的缓存。实际上,我确信你的行要小得多,而且你永远不需要缓存中的所有数据。

除非您有可证明的性能问题,否则请使用故障单编号列上的索引并依赖服务器(Informix SE)来完成其工作。如果您有可证明的问题,请显示SET EXPLAIN输出中的查询计划。但是,对于调整SE性能的程度有很大的限制 - 它是安装即用的技术,对调优的要求很低。

我不确定Informix SE是否支持Informix Dynamic Server支持的'FIRST n'(又名'TOP n')表示法;我不相信。