IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

varbinary indexé en utilisation masque de bit


Sujet :

MS SQL Server

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    @++

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,

    Je ne comprend pas
    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 à
    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

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    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é

    @++

Discussions similaires

  1. indexation non utilisée pour chaînes de caractères
    Par ctobini dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 11/02/2008, 09h43
  2. utilisation de chaque bit d'un short.
    Par poporiding dans le forum C++
    Réponses: 7
    Dernier message: 03/04/2007, 02h37
  3. [Optimisation] index non utilisé et using temporary
    Par jp_rennes dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/10/2006, 10h05
  4. Réponses: 30
    Dernier message: 23/08/2006, 21h53
  5. Réponses: 3
    Dernier message: 22/09/2005, 10h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo