Sybase非聚簇索引选择

时间:2010-09-14 12:58:44

标签: sybase

我们有一个包含两个非聚集索引的表。这两个索引都具有相同的三列,按照相同的顺序,它们的区别仅在于一个索引按另一个降序排序。开发人员已经创建了一个存储过程,该存储过程执行选择,他想要(但忘记了!)强制使用索引而不是执行Order by。当一个用户运行查询时,一致地选择一个索引(具有讽刺意味的是,在一段时间内屏蔽此错误的正确索引),当另一个用户运行该过程时,返回另一个索引。两个用户运行完全相同的程序会影响索引选择会有什么不同?

(注意:这段代码将被重写,但我试图对此后发布的“行动后报告”的内容进行了解释。)

先谢谢

2 个答案:

答案 0 :(得分:1)

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

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

根据你的情况,代码没有改变,两个用户使用相同的存储过程,有两种可能:

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

  • 每个用户使用一组不同的数据,搜索参数,变量等,它们作为同一存储过程的输入提供。 ASE根据(a)确切的输入数据(搜索参数)与(b)索引的有用性,在运行时做出索引选择。并且它根据最新的更新状态了解统计信息。

答案 1 :(得分:0)

索引比它们看起来要复杂得多。数据库系统决定根据查询计划,表卷,行数,数据库缓存使用索引(或不使用索引)。 数据库系统根据查询和以上数据进行成本估算(基数概率,i / o估计等)。

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

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

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