如果我们创建这样的索引:
create nonclustered index idx_person on person(gender, name)
在ASE 12.5中,将为主要属性(性别)创建统计信息(更确切地说是直方图),但不会对次要属性名称进行任何操作。
因此,优化器可以在进行如下选择时选择最差的查询计划:
select * from person
where gender = 'M'
and name = 'John Doe'
它可能会选择最差的查询计划,因为它会为列名提供默认的选择性值。这样,表扫描可能比选择索引更好。
<!/ P>
我想知道的是,如果在ASE 15.x中,当创建具有多个列的索引时,将为所有索引列运行统计信息?
或者,如果我们要使用以下命令来更新索引统计信息:
update statistics person(name)
update index statistics person index_person
提前致谢! :)
答案 0 :(得分:3)
默认情况下,您没有获得第二列和后续列的统计信息,我想因为Sybase必须进行更多处理并使用tempdb来编译它们。因此,您需要决定哪些索引需要所有列的统计信息。
如果您使用的是v15并且优化级别设置为“mix”或“dss”,那么您可能会遇到一个问题,即您不会在所有索引列上保留统计信息,因为优化程序无法轻松完成在没有所有索引列统计信息的情况下获得合并和散列连接。如果您打开了MERGE JOIN,则在v12.5上同样适用。
我认为,由于第二列和后续列没有直方图,你可能会遇到比错误计划更多的问题,但我认为这取决于。
您可以使用DATACHANGE函数找出更改的值超过您提供的百分比,这样您就可以定期编写一个shell脚本(或其他任何内容)(每小时一次/几小时/每天开始)批处理/批处理结束/等)检查数据库并更新受影响表的统计信息。 (实际上我不太确定它是在12.5上 - 它可能只是v15。)