/ / Ako optimalizovať dotazy SQL pre BINARY (N)? - sql, sql-server, optimalizácia

Ako optimalizovať dopyty SQL pre BINARY (N)? - sql, sql-server, optimalizácia

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

Bloom filtre:

... 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.