【问题标题】:How to optimize SQL queries for BINARY(N)?如何优化 BINARY(N) 的 SQL 查询?
【发布时间】:2014-06-05 02:01:24
【问题描述】:

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

我的解决方案是使用 binary(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

我不知道如何使用索引。

你的建议?

【问题讨论】:

    标签: sql sql-server optimization


    【解决方案1】:

    Bloom filters:

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

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

    【讨论】:

    • 谢谢 Remus,使用 BF 听起来很有趣。唯一的问题是如何为这种字段计算合适的哈希值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多