【发布时间】: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