Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/05/2011, 17h29   #1
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Par défaut varbinary indexé en utilisation masque de bit

Bonjour,
Est-ce que quelqu'un peut me certifier ce que j'ai affirmé à savoir que sur une table telle que celle
Code :
1
2
CREATE TABLE fides_tdb_venues(venue typeVenue, etat varbinary(900)) -- car 8000 ne supporte par l'index
CREATE INDEX idx_fides_tdb_venues_etat ON fides_tdb_venues(etat)
L'index n'est pas utilisé dans des requêtes telles que :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
declare @bitMasque AS int
SET @bitMasque = (2 | 4)
 
print 'Requête 2 ou 4 :'
SELECT *
FROM fides_tdb_venues
WHERE (etat | (~@bitMasque)) <> (~@bitMasque)
 
print 'Requête 2 et 4 :'
SELECT *
FROM fides_tdb_venues
WHERE (etat & @bitMasque) = @bitMasque
Merci de votre aide.
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 18h38   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 668
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 668
Points : 8 718
Points : 8 718
Bonjour,

Effectivement l'index sur la colonne etat ne sera pas utilisé.
En effet SQL Server stocke les statistiques de distribution des valeurs dans cette colonne, pas les statistiques sur un calcul binaire.

En revanche vous pouvez ajouter une colonne calculée qui vous donne le AND et le OR binaire sur les valeurs stockées dans la colonne etat, et indexer celle(s)-ci.
Dans ce cas vous pourrez écrire :

Code :
1
2
3
4
5
6
7
8
SELECT *
FROM fides_tdb_venues
WHERE OR_bit_mask <> ...
 
print 'Requête 2 et 4 :'
SELECT *
FROM fides_tdb_venues
WHERE AND_bit_mask = ...
Et l'index sur la colonne calculée sera alors utilisé.
Pour savoir si un index est utilisé, il suffit de regarder le plan d'exécution réel (CTRL + M) dans Management Studio

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 19h33   #3
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Bonjour,

Je ne comprend pas
Citation:
En revanche vous pouvez ajouter une colonne calculée qui vous donne le AND et le OR binaire sur les valeurs stockées dans la colonne etat, et indexer celle(s)-ci.
L'idée générale est de pouvoir chercher efficacement sur chaque bit du champ de bit, et de ne pas être trop limité dans la taille du champ de bit.
L'idée est de faire une recherche sur 15 ou 50 critères en combinant les possibilités. Pour l'instant nous n'avons pas le nombre de critères possible. Il a été évoqué le champ de bit en varbinary.
@bitMasque peut également valoir 33 ou 25.

Quand à
Citation:
Pour savoir si un index est utilisé, il suffit de regarder le plan d'exécution réel (CTRL + M) dans Management Studio
Je sais mais pour l'instant on en est à la modélisation, en essaie de "prove of concept" la table a 3 lignes, en réalité elle en aura 3 millions.

J'ai donc exprimé mon idée que sur une grosse volumétrie, cette solution ne fonctionnerait pas car l'index ne serait pas utilisé. Et je voulais m'assurer de ne pas avoir dit de bêtise.

Cordialement
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 19h47   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 668
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 668
Points : 8 718
Points : 8 718
Citation:
J'ai donc exprimé mon idée que sur une grosse volumétrie, cette solution ne fonctionnerait pas car l'index ne serait pas utilisé. Et je voulais m'assurer de ne pas avoir dit de bêtise.
Je comprend la démarche.

Dans ce cas, il vaudrait peut-être mieux créer une table que je qualifierai d'annexe.
Elle aurait 3 colonnes :

- l'identifiant référencé par clé étrangère de la table fides_tdb_venues
- le type de bitwise (OR_33, AND_22), qui serait en fait un identifiant référencé par clé étrangère d'une autre table contenant tout les types de bitwise
- la valeur du bitwise

Au moment de l'insertion dans la table fides_tdb_venues, vous calculez tous les bitwise pour la valeur insérée, et vous insérez toutes les valeurs calculées dans cette nouvelle table.

Le tout bien indexé

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h11.


 
 
 
 
Partenaires

Hébergement Web