【问题标题】:Sybase nonclustered index selectionSybase 非聚集索引选择
【发布时间】:2010-12-16 05:17:15
【问题描述】:

我们有一个包含两个非聚集索引的表。这两个索引都具有相同的三列,它们的顺序相同,不同之处仅在于一个按升序排序,另一个按降序排序。一位开发人员创建了一个存储过程,该过程在他打算(但忘记了!)的地方进行选择,以强制使用索引而不是执行排序依据。当一个用户运行查询时,始终选择一个索引(具有讽刺意味的是,正确的索引掩盖了此错误一段时间),当另一个用户运行该过程时,返回另一个索引。运行完全相同的程序会影响索引选择的两个用户之间会有什么不同?

(注意:此代码将被重写,但我试图了解此处发生的事后报告)。

提前致谢

【问题讨论】:

    标签: sybase


    【解决方案1】:

    您尚未指定您拥有的 Sybase。我会假设 ASE。

    索引选择取决于几个因素。

    鉴于您的情况,代码没有更改,并且两个用户使用相同的存储过程,有两种可能性:

    • 检查统计信息是否是最新的。取决于您的 DBA 如何自动化 UPDATE STATISTICS 功能和级别(索引或表级别);一个索引可能是最新的,而另一个可能是过时的。与 ASE 12.5.4 优化器不同,ASE 15.x 优化器对统计数据很敏感。

    • 每个用户使用不同的数据集、搜索参数、变量等,它们作为输入提供给同一个存储过程。 ASE 在运行时根据 (a) 确切的输入数据(搜索参数)与 (b) 索引的有用性来选择索引。并且它只知道根据最后一次更新统计的统计信息。

    【讨论】:

      【解决方案2】:

      索引比看起来要复杂一些。数据库系统根据查询计划、表容量、行数、数据库缓存来决定是否使用索引。 数据库系统根据查询和以上数据进行成本估算(基数概率、I/O 估算等)。

      如果您有两个具有不同排序方案的相似索引,则所需的索引键 (i) 可能几乎位于 n/2 WHERE n=index size

      还有一种可能是sybase根据表中的数据(重复数据/串行数据)不关心索引,因此无法决定使用哪一个。

      一次删除一个索引,看看会发生什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        • 2021-01-14
        • 2013-11-27
        • 2021-02-23
        • 2016-01-05
        • 2020-08-04
        相关资源
        最近更新 更多