用于存储标志数组的数据类型(位图/位数组)

krl*_*mlr 15 sql-server-2005 sql-server-2008 sql-server datatypes

我需要为表的每条记录存储一个位数组,支持以下操作:

  • 测试是否设置了位,并设置了位(使用 SQL)

  • 使用 ADO 2.8(不是 ADO.NET)查询和设置值

  • 索引(为了从“覆盖索引”功能中受益)

要存储在此数组中的最大位数是固定的,但可能会超过 32。也就是说,一个简单的int列并不总是有效。

从我目前所见,我的选择是:

  1. 使用多个int
  2. 使用bigint(只要位数 <= 64 即可)
  3. 使用二进制
  4. ?

第一个选项可行,但需要对访问数据的代码进行大量重构。第二个选项只是暂时的缓解,从我目前的搜索来看,我不太确定 ADO 是否与bigint一起工作得那么好。我没有使用binary 的经验,我不知道任何其他选项。

根据要求,您会选择哪种数据类型?

JNK*_*JNK 12

我不能强烈主张不要为此使用单个字段。

我目前正在处理使用bigint位掩码字段维护一个非常大的数据集,这有点像性能噩梦。

如果您检查一点就可以了。如果您检查多于一位,则性能会很快下降。

由于位掩码整数的性质,数据分布将非常不平衡,您将获得次优计划。

多位检查会导致范围或索引扫描,其中一个函数针对每一行运行。一团糟。

我的解决方法很简单 - 我制作了一个表格来存储每个要检查的条件的 PK。这最初是违反直觉的,但所需的空间很小(您只存储 PK)并且查找速度非常快,特别是如果您使用UNIQUE CLUSTERED INDEX.

您可以根据需要添加任意数量的条件,而不会影响您的主表,更新也不会影响您的主表。

索引很简单,因为您只需单独索引所有查找表,并且您的聚集键在主表上是相同的,并且查找所有评估merge join都是非常有效的。

  • 您能详细说明一下您的解决方法吗?我发现这一点是因为我正在尝试解决相同的基本问题,但不确定如何最好地做到这一点。 (2认同)