美好的一天,
在SQL Server 2005中,我有一个表有很多列,包括一些布尔(位)列。例如, 表'Person'具有列ID和列HasItem1,HasItem2,HasItem3,HasItem4。这个表有点大,所以我想创建索引以获得更快的搜索结果。
我知道在位列上创建索引并不是一个好主意,所以我考虑使用带有所有位列的索引。但是,问题是,所有这些位列都可能在查询中,也可能不在查询中。由于索引列的顺序在索引中很重要,而且我不知道哪些将在查询中使用,我该如何处理呢?
BTW,已经存在我无法删除的聚集索引。
答案 0 :(得分:2)
我认为这可能不是一个好主意。尝试索引具有非常低基数的字段通常不会使查询更快,并且您也有维护索引的开销。
如果您通常使用其他字段搜索某个位字段,那么这两个字段的复合索引可能会对您有所帮助。
如果要在位字段上创建复合索引,那么这将有所帮助,但前提是提供了索引开头的复合字段。如果您没有在复合索引中包含第一个值,那么索引可能根本不会被使用。
例如,如果在90%的查询中使用bita并在70%中使用bita而在20%中使用b和c位,那么(bita,bitd,bitb,bitc)上的复合索引可能会产生一些好处但是对于至少10%的查询,甚至可能40%的索引很可能不会被使用。
最好的建议可能是尝试使用相同的数据量和数据基数,并查看执行计划的内容。
答案 1 :(得分:2)
我不太了解sql server上的很多细节,但通常索引具有非唯一数据的列并不是很有效。在某些RDBMS系统中,优化器无论如何都会忽略小于某一特定百分比的索引,因此索引甚至可能都不存在。
使用复合索引或多列索引可以提供帮助,但仅限于过滤器约束与构建索引的顺序相同的特定情况。如果索引包含'field1,field2'并且您正在搜索'field2,field1'或其他一些组合,可能不使用索引。您可以为要优化的每个特定搜索案例添加索引,这就是我能想到的所有内容。如果您的数据不是很独特,即使在考虑了所有位字段之后,索引也可能会被忽略。
例如,如果您有3位字段,则只将数据分段为8个不同的组。如果表中有合理的行数,则将其分割为8将不会非常有效。
答案 2 :(得分:0)
我不知道2005年,但是在SQL Server 2000中(来自联机丛书): “类型位的列不能有索引。”
答案 3 :(得分:0)
如何使用校验和?
将一个名为mysum的int字段添加到表中并执行此
UPDATE checksumtest SET mysum = CHECKSUM(hasitem1,hasitem2,hasitem3,hasitem4)
现在您有一个表示位组合的值。
在搜索查询中执行相同的校验和计算并匹配mysum。
这可能会加快速度。
答案 4 :(得分:0)
您应该重新审视数据库的设计。而不是具有HasItem1到HasItem#字段的表,您应该创建一个桥实体,如果没有,则创建一个主项目表。桥实体(表)person_items将具有(至少)两个字段:person_id and item_
id。
以这种方式设计数据库不会将您锁定到仅根据列定义处理 N 项目数的数据库。您可以根据需要向主项目表添加任意数量的项目,并根据需要将尽可能多的项目与您需要的人员相关联。
答案 5 :(得分:0)
SQL很容易使用person_id和item_id以及BitValue查询大表,然后它将使用Item1,Item2,... Item N 搜索单个表。