/ / Comment optimiser les requêtes SQL pour BINARY (N)? - sql, sql-server, optimisation

Comment optimiser les requêtes SQL pour BINARY (N)? - sql, sql-server, optimisation

J'ai une table (10 millions de lignes). Pour chaque enregistrement, j'ai besoin de 480 drapeaux (0, 1).

Ma solution est d’avoir un champ binaire (60) et un bit pour chaque drapeau.

Cela ne semble pas grave, mais la question est de savoir comment optimiser les requêtes. Je dois sélectionner des enregistrements pour lesquels certains bits sont définis sur 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

Je ne vois pas comment utiliser les index.

Vos conseils?

Réponses:

0 pour la réponse № 1

Filtres Bloom:

... est utilisé pour tester si un élément est membre d'un ensemble. De faux résultats positifs sont possibles, mais les faux négatifs ne le sont pas.

Créer une colonne hash int / bigint, persistéecalculé comme une floraison de vos 480 bits. Indexez la colonne calculée. En recherchant sur l’index, la floraison filtrera tous certains aspects négatifs (espérons-le, une partie importante), le reste (espérons-en quelques-uns), vous devrez les scanner et déterminer s’ils correspondent vraiment.