【问题标题】:Is there a better/faster method locating a row with the maximum value in a column?是否有更好/更快的方法来定位列中具有最大值的行?
【发布时间】:2023-03-23 05:43:02
【问题描述】:

INFORMIX-SE 7.32:

我有一个大约 5,000 行的事务表。 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)下降'会改善访问还是索引完全遍历从开始到结束无关?

【问题讨论】:

    标签: sql informix


    【解决方案1】:

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

    除非您有明显的性能问题,否则请使用票号列上的索引并依靠服务器 (Informix SE) 来完成它的工作。如果您有明显的问题,请从 SET EXPLAIN 输出中显示查询计划。但是,您可以在多大程度上调整 SE 性能存在重大限制 - 它是一种安装即用技术,对调整的要求最低。

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

    【讨论】:

    • 是的,单用户,rowsize=512,不支持 SE 中的 FIRST。 ISQL(即 perform & ace)可以使用 IDS 而不是 SE 吗?.. 我的应用程序是单用户,尽管有 >500K nrows 历史 DSS 事务表驻留在单独的数据库中,但您永远不知道客户端何时可能需要分布式多-user db 用于他们所有的当铺分行。
    • @Frank:是的,ISQL 与 IDS 一起工作得很好,但需要注意的是,Perform 不能与碎片表一起使用,除非它们是使用 WITH ROWIDS 子句创建的。但是,对于直接迁移,您不会有碎片表,然后就可以了。
    • 太棒了!.. 我计划使用“FRAGMENT BY EXPRESSION customer.date_last_activity
    【解决方案2】:

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

    SELECT TOP 1 ticket_number FROM transaction ORDER BY ticket_number DESCENDING
    

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

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

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

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

    【讨论】:

    • 如果我在同一个表的不同列上有多个索引,我创建每个索引的顺序是否重要?在 SE 中,我注意到属于一个表的所有索引都存储在一个 IDX 文件中,如果您创建更多索引,这个单一文件会增长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多