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 :

Question sur méthodes de comparaison d'entier


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : février 2020
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Question sur méthodes de comparaison d'entier
    Bonjour à tous,

    Je viens de commencer un nouveau CDI et, par conséquent, commence à analyser le code SQL de l'appli sur laquelle je vais bosser.
    Je tique sur la façon dont la vérification des statuts de commandes est réalisée.

    Le statut de la commande est stockée dans une colonne "Statut" en int.
    A coté de ça, j'ai des fonctions du genre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE FUNCTION [dbo].[COM_CHECK_PREPARED]() RETURNS INT AS
    BEGIN
    	RETURN 0x00000010
    END
    GO
    Et pour vérifier si une commande est préparée le test est fait comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF (@STATUT&dbo.COM_CHECK_PREPARED())=0
    ...
    Le statut doit donc être >= 16 et <=27 pour que la fonction renvoi 0. (Si une commande est préparée son statut est à 16)

    Y'a t'il un intérêt à cette façon de faire plutôt qu'une fonction qui prendrait le statut en entrée et renverrait Vrai si le statut est à 16(où même compris entre 16 et 27) avec une condition
    IF @STATUT = 16 ou IF @STATUT BETWEEN 16 AND 27 directement incluse dans la fonction.

    J'ai du mal à saisir la logique/intérêt de la chose.
    Surtout que des fonctions de ce type sont foison et la gymnastique cérébrale pour convertir les 0x00000040, 0x00000003 et compagnie n'est pas aisée

    Merci pour vos réponses!

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    janvier 2010
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 464
    Points : 12 670
    Points
    12 670
    Par défaut
    bonjour,

    Citation Envoyé par Mavoune Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF (@STATUT&dbo.COM_CHECK_PREPARED())=0
    ...
    Le statut doit donc être >= 16 et <=27 pour que la fonction renvoi 0.
    Non, c'est l'inverse ! ça renverra 0 si le statut est inférieur à 16, sinon renverra 16 (0x00000010)
    et la borne supérieure n'est pas 27 mais 31.
    Enfin, ça renverra aussi 16 si @STATUT est entre 48 et 63, ou 80 et 95....
    bref ça renverra 16 si la division entiére de @STATUT par 16 est impaire, et 0 si elle est paire.

    Pour ce qui est de la question de fond, le seul interet que j'y vois est de... dégrader les performances.

    En effet prenons la requete qui renvoie le nombre de commades livrées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT COUNT(*)
    FROM Commande
    WHERE Statut &dbo.COM_CHECK_PREPARED() <> 0
    Elle ne pourra pas utiliser d'index car il faut appliquer un calcul sur la colonne Statut
    Elle ne pourra pas être parallélisée du fait de l'utilisation d'une fonction scalaire.

    donc sera bien moins performante que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT COUNT(*)
    FROM Commande
    WHERE Statut BETWEEN 16 AND 31 -- (en supposant qu'il n'y a en fait pas de statut > 48, sinon les deux requêtes ne sont plus équivalentes)

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : février 2020
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    J'ai bien fait de tiquer du coup! Ça me semblait un peu bancal

    Merci pour les précisions.

  4. #4
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    janvier 2008
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2008
    Messages : 1 864
    Points : 3 754
    Points
    3 754
    Par défaut
    Bonjour,

    Je débute un peu en SQL et je voulais avoir une info.
    Est-ce que la mise en place d'une vue "Commande" avec un champ calculé, COM_CHECK_PREPARED de type BIT , permettrais d'amélioré encore les performances?
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    janvier 2010
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 464
    Points : 12 670
    Points
    12 670
    Par défaut
    Si la vue n'est pas indexée, cela ne changera rien aux performances

  6. #6
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    janvier 2008
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2008
    Messages : 1 864
    Points : 3 754
    Points
    3 754
    Par défaut
    Merci pour ce retour.
    Il me reste à chercher un peu de la doc pour faire des vues indexées.
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  7. #7
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    mai 2002
    Messages
    19 546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 19 546
    Points : 46 245
    Points
    46 245
    Par défaut
    Au niveau des performances, il n'y a pas photo... L'usage d'une UDF interdit :
    • l'usage d'un index
    • le multithreading de la requête (parallélisme)

    En cours d'optimisation chez orsys, je montre le gachis d'un tel usage :
    120 ms pour la requête sans UDF et 8 320 ms avec l'UDF sans index.
    avec un index : 0 ms pour la requête sans UDF et 8 320 ms avec l'UDF

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Votre opinion sur les méthodes de comparaison de données ?
    Par katanaenmousse dans le forum Débuter
    Réponses: 3
    Dernier message: 15/08/2010, 10h41
  2. [API] résultat d'un Insert sur un champs de type entier
    Par Popoyan dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/06/2006, 15h16
  3. [VBA-E]Erreur sur méthode de classeur
    Par vanima dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 20/02/2006, 13h32
  4. [C#] Aide sur méthode bloquante
    Par ArChAnGe76 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 22/12/2005, 19h32
  5. Pointeur de fonctions sur méthode
    Par Glosialabolas dans le forum C++
    Réponses: 9
    Dernier message: 04/12/2005, 15h55

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