如何优化BINARY(N)的SQL查询?

时间:2014-06-04 17:54:12

标签: sql sql-server optimization

我有一张桌子(10 mio行)。对于每条记录,我需要有480个标志(0,1)。

我的解决方案是拥有二进制(60)字段并​​为每个标志使用位。

似乎不错,但问题是:如何优化查询? 我需要选择某些位设置为1的记录。

CREATE FUNCTION  [dbo].[fnBinarySet3] 
(@Value varbinary(60),@Position int)
RETURNS varbinary(60) AS  
BEGIN 
declare @retValue varbinary(60)

SELECT   @retValue=L + Convert(Binary(1),M | P) + R
FROM    (SELECT SubString(@Value,1,@Position / 8),
        SubString(@Value,  @Position / 8 + 1,   1)
    ,   SubString(@Value,  @Position / 8 + 2,60)
    ,   Power(2,@Position % 8)  )   X(L,M,R,P);

    return @retValue
END

GO
create table t
(
int_id int not null identity primary key,
banner binary(60)
)

declare @i int
set @i=1000
while @i>0
begin
    insert into t (banner) values(0x0);
    set @i = @i-1;
end
update t set banner= [dbo].[fnBinarySet3] (banner,int_id%48)

select top 100 * from t where <------- for example where 3 or 5 bit is 1

我看不出如何使用索引。

您的建议?

1 个答案:

答案 0 :(得分:0)

Bloom filters

  

...用于测试元素是否是集合的成员。假阳性匹配是可能的,但假阴性不是。

创建一个hash int / bigint列,持久计算为480位的bloom。索引计算列。在索引上搜索,bloom将过滤掉所有肯定的负面信息(希望是一个重要的部分),其余的(希望是少数)你必须扫描它们并找出它们是否真正匹配该位。