Mám stôl (10 miliónov riadkov). Pre každý záznam potrebujem 480 vlajok (0, 1).
Moje riešenie je mať binárne (60) pole a používať bit pre každú vlajku.
Zdá sa, že to nie je zlé, ale otázky znejú: ako optimalizovať otázky? Musím vybrať záznamy, kde sú niektoré bity nastavené na 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
Nechápem, ako môžem používať indexy.
Vaše rady?
odpovede:
0 pre odpoveď č. 1... sa používa na testovanie, či je prvok členom množiny. Možné sú falošné pozitívne zhody, ale nie nesprávne falošné negatívy.
Vytvorte stĺpec hash int / bigint, pretrvávavypočítané ako rozkvet vašich 480 bitov. Vypočítajte vypočítaný stĺpec. Pri vyhľadávaní v indexe bude kvet odfiltrovať všetky určité negatívy (dúfajme, že významná časť), ostatné (dúfajme, že niekoľko) ich budete musieť naskenovať a zistiť, či sa skutočne zhodujú s bitom.