Sybase ASE 15:在多个列上创建索引,这些值的值不同

时间:2017-07-01 13:32:57

标签: sql performance indexing sybase-ase

我有500万条记录的表格和一个看起来像

的查询
select *
from mytable
where column1 = 'value1' and column2 = 'value2' and column3 = 'value3'

所以我考虑过根据3列创建一个索引,但我的问题是我没有最好的列放在索引的第一个位置,因为没有列与其他列相比真的是discrimating。

因此,我希望使用基于这3列的哈希码来构建类似于哈希表的东西。我尝试了基于这三个列的串联的基于函数的索引,但它创建的时间很长,我从来没有创建它,我相信这是实现我想要的错误方法。实现这一目标的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

只需创建一个包含三列的索引:

create idx_mytable_col1_col2_col3 on mytable(col1, col2, col3)

你有平等比较。在这种情况下,索引中列的顺序无关紧要。

让数据库为您完成工作。

答案 1 :(得分:0)

ASE的索引通常存储为b-trees,而且还有一些散列'魔法'在索引搜索期间发生的,仍然需要一些遍历/搜索;如果索引的第一列不是非常有选择性,那么与首先列出更具选择性的列的索引相比,您可以看到索引搜索性能有所下降;性能的差异实际上取决于所讨论的列的选择性和索引的绝对大小(即索引级别和必须读取/处理的页面的数量)。

如果您正在运行ASE 15.0.3+,并且您在Linux上运行ASE,则可能需要查看虚拟散列表。简而言之...... ASE将PK索引存储为哈希而不是普通的b树,最终结果是索引搜索时间减少了。对虚拟散列表有很多要求/限制,因此我建议您查看Transact-SQL用户指南以获取更多详细信息。

显然(?)表格/索引设计比这里讨论的要多得多;当然不是通过查看单个通用查询可以解决的问题。 (" Duh,Mark!"?)