我有一张桌子(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
我看不出如何使用索引。
您的建议?
答案 0 :(得分:0)
...用于测试元素是否是集合的成员。假阳性匹配是可能的,但假阴性不是。
创建一个hash int / bigint列,持久计算为480位的bloom。索引计算列。在索引上搜索,bloom将过滤掉所有肯定的负面信息(希望是一个重要的部分),其余的(希望是少数)你必须扫描它们并找出它们是否真正匹配该位。