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

Développement SQL Server Discussion :

Rapidité requête avec where ou colonne additionnelle


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 37
    Par défaut Rapidité requête avec where ou colonne additionnelle
    Bonjour,

    j'ai une db avec plusieurs millions de lignes avec une colonne nvarchar(max) vide ou remplie sur laquelle je dois faire des centaines de recherches en fulltext/jour.

    J'aurai voulu savoir ce qui allait rendre les requêtes plus rapide :

    - lancer directement ma requête sans me soucier d'un "where .. is not null"
    - ajouter ce "where .. is not null"
    - travailler avec une colonne additionelle en booléen qui spécifie si la colonne est vide ou non

    Merci.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Quels sont vos critères de recherche ?
    Tout ceux-ci apparaissent dans la clause WHERE ou vous faites des filtres sur le résultat dans un second temps ?

  3. #3
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Bonjour,

    j'ai une db avec plusieurs millions de lignes avec une colonne nvarchar(max) vide ou remplie sur laquelle je dois faire des centaines de recherches en fulltext/jour.

    J'aurai voulu savoir ce qui allait rendre les requêtes plus rapide :

    - lancer directement ma requête sans me soucier d'un "where .. is not null"
    - ajouter ce "where .. is not null"
    - travailler avec une colonne additionelle en booléen qui spécifie si la colonne est vide ou non

    Merci.
    Ce qui va être important c'est le choix de votre clé de recherche(clé définie sur la table pour votre indexation FULLTEXT), l'idéal est un auto incrément.

    la recherche FULLTEXT sur votre colonne NVARCHAR(MAX) (au passage le UNICODE est'il nécessaire dans votre cas? avez vous des caractères autres que latin?) sera t'elle votre seul prédicat?


    Je ne pense pas que différentier les colonnes NULL sera bénéfique car vous nez requetez pas vraiment sur la colonne mais sur des données indexées par le FULLTEXT.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 37
    Par défaut
    Bonjour, mes requêtes les plus chargées ressemblent à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE table SET ... 
    WHERE col4 = 1 
    AND col3 IS NULL 
    AND CONTAINS (col5,'"abcd" AND "efgh" AND NOT "ijkl" AND NOT "mnop"') AND CONTAINS (col6,'"qrst" AND "xyz" ')
    Ma clé est sur une colonne id auto-incrémentée et la colonne NVARCHAR(MAX) se doit d'être en unicode sans quoi, je serai contraint de passer par un remplacement obligatoire de tous les caractères diacritiques ... ce qui pourrait, sans doute, alléger le process.

    La question concernait donc ces 2 filtres fulltext (CONTAINS). Devrais-je d'abord tester si la col5 et col6 sont nulles ou cela se fait-il indirectement par SQL Server de toute façon avant de passer à la suite?

    Aussi, est-ce que la place des clauses a-t-elle une influence ? Mettre les "where is not null" dans début de WHERE ?

    Merci.

  5. #5
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Aussi, est-ce que la place des clauses a-t-elle une influence ? Mettre les "where is not null" dans début de WHERE ?
    Non aucune, SQL SERVER est basé sur le cout... en gros il décortique votre requète puis détermine la manière la plus rapide de donner un résultat en fonction de la charge de votre server etc.

    UPDATE table SET ... WHERE col4 = 1 AND col3 IS NULL AND CONTAINS (col5,'"abcd" AND "efgh" AND NOT "ijkl" AND NOT "mnop"') AND CONTAINS (col6,'"qrst" AND "xyz" ')

    est-ce un exemple bidon?

    Vous tester si col3 est NULL puis vous faites vos recherches FULLTEXT sur deux autres colonnes?


    Ici vous devez clairement avoir un index sur col4 par exemple.

  6. #6
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DECLARE @ASCII VARCHAR(MAX)='ËîôÖœžŸÅÄÆ'
     PRINT @ASCII

    Quel caractères diacritiques ne pouvez vous pas gérer en NON UNICODE?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 37
    Par défaut
    Citation Envoyé par iberserk Voir le message
    est-ce un exemple bidon?
    Vous tester si col3 est NULL puis vous faites vos recherches FULLTEXT sur deux autres colonnes?
    Non, l'exemple est ok.

    Le process démarre en fait sur un premier serveur avec SSIS qui flag déjà certaines colonnes en fonction de ...
    Ensuite, le tout est injecté sur un autre serveur sql où sera lancé cette requête.

    Citation Envoyé par iberserk Voir le message
    Ici vous devez clairement avoir un index sur col4 par exemple.
    Y a-il un nombre d'occurences minimum à ne pas prendre en compte pour que cela vaille la peine de créer cet index?
    Exemple d'une colonne tinyint avec à peine 4 valeurs différentes.

    Pour l'unicode, tu as raison, mais je devrai quand même vérifier car SSIS prend ici des données du monde entier (internet) en dehors de ce qui est éloigné à 100% des caractères latin (asiatique, russe, etc.)

    merci iberserk.

  8. #8
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    AND CONTAINS (col5,'"abcd" AND "efgh" AND NOT "ijkl" AND NOT "mnop"') AND CONTAINS (col6,'"qrst" AND "xyz" ')
    Quand je vois cela.... a quoi sert le FULLTEXT ici?

    Vous pourriez obtenir de bonnes performances avec une colonne calculée indexée qui ferait le calcul lors de l'ajout... vous n'auriez plus qu'a filtrer dessus.

    Quant à votre colonne avec 4 valeurs distinctes... le mieux est de tester l’intérêt de votre index...

    Peut-être pouvez vous penser à un partitionnement de table sur cette valeur?

Discussions similaires

  1. Requête avec exclusion de colonnes
    Par lemfi dans le forum Langage SQL
    Réponses: 8
    Dernier message: 31/01/2008, 13h38
  2. [MySQL] Requête avec WHERE 1 AND et plein de OR le AND n'est pas pris en compte
    Par alsaco68 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/01/2008, 10h09
  3. [MySQL] requête avec WHERE sur primary key
    Par newbiemac dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 04/09/2007, 09h41
  4. requête avec WHERE A < Date < B de semaine en semaine
    Par cortex024 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 08/06/2007, 14h41
  5. Problème de requête avec WHERE MAX()
    Par seb92500 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 24/01/2007, 12h27

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