代码之家  ›  专栏  ›  技术社区  ›  Joe R.

有没有更好/更快的方法来定位列中具有最大值的行?

  •  2
  • Joe R.  · 技术社区  · 14 年前

    我有一个事务表,大约有5000个nrows。transaction.ticket\u number[INT]是一列,每次更新特定行时,该列都会更新为下一个可用的连续票号。列是唯一索引的。我当前正在使用以下SELECT语句来定位max(transaction.ticket\ num):

    SELECT MAX(transaction.ticket_number) FROM transaction;
    

    由于要更新的行是根据transaction.fk\u id[INT]进行集群的,在这里它与customer.pk\u id[SERIAL]连接,因此该行在物理上并不位于事务表的末尾,而是位于属于每个特定客户的事务行组中。我选择对属于每个客户的事务进行集群,因为当我滚动浏览每个客户事务时,响应时间更快。有没有一种更快的方法通过上面的查询来定位最大值(transaction.ticket\u number)?。。“事务唯一索引(票证号)降序”是否会改善访问,或者索引是否从开始到结束完全遍历?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jonathan Leffler    14 年前

    在一台现代机器上只有5000行的表上,您不太可能测量各种技术的性能差异,特别是在我认为您面临的单用户场景中。即使5000行都是允许的最大大小(略低于32kb),您也将处理160mb的数据,这些数据很容易放入机器的缓存中。实际上,我确信您的行要小得多,而且您永远不需要缓存中的所有数据。

    除非有明显的性能问题,否则使用票证号列上的索引并依赖服务器(Informix SE)来完成其工作。如果有明显的问题,请显示SET EXPLAIN output中的查询计划。然而,对SE性能的调整有很大的限制——这是一种安装即用技术,对调优的要求很低。

    我不确定informixse是否支持informixdynamic服务器支持的“firstn”(也称为“topn”)表示法;我相信不是。

        2
  •  1
  •   MatBailie    14 年前

    由于可为空的列和其他因素,使用索引等,您经常可以发现以下情况会更快,但通常只能忽略。。。

    SELECT TOP 1 ticket_number FROM transaction ORDER BY ticket_number DESCENDING
    

    我也不确定你是否真的有[车票号码]的索引?或者你只是有一个独特的约束?约束不能帮助确定最大值,但索引可以。

    如果存在以票证号作为第一个可索引列的索引:
    -可能会使用索引查找/查找,根本不需要扫描其他值


    -可能会进行索引扫描,检查索引中的每个唯一条目

    如果不存在可用索引:
    -整个桌子都会被扫描