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 :

Optimisation Vue avec Fonction [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut Optimisation Vue avec Fonction
    Bonjour,

    Alors tout est un peut dit dans le titre.

    J'ai une vue qui me retourne ~200k lignes en 60 secondes.
    Je dois cependant ajouter un appelle avec un fonction scalaire qui prend <1 seconde pour un appel unique.
    Cependant lorsque j'ajoute la fonction à ma vue, elle semble être exécutée à chaque ligne, bien que le paramètre soit contant.

    quelqu’un a une idée ?

    Je ne peux malheureusement pas fournir le codes exactes mais l'exemple suivant est suffisamment représentatif.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM <La table avec 200 k lignes>
    Résultat en ~1 minute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Declare @bidon Varchar(max)
    SELECT @Bidon = dbo.LaFonction('Avec un paramètre en dur')
    GO 200000
    S’exécute les 200'000 fois en ~4 minutes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *, dbo.LaFonction('Avec un paramètre en dur')
    FROM <La table avec 200 k lignes>
    Coupé au bout de 20 minutes avec un résultat de 7 ligne

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Je ne commente pas le mécanisme interne, je laisse les experts sqlserver, mais je coderais comme ça l'accès à la fonction pour éviter la ré-exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with f as (
    select dbo.LaFonction('Avec un paramètre en dur') as res
    )
    SELECT t.*, f.res
      FROM <La table avec 200 k lignes> t
     cross join f
    On peut aussi se demander pourquoi inclure le résultat de cette fonction dans cette requête s'il n'est pas lié à une autre colonne de la requête et simplement dupliqué.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut
    ...

    Cross Join

    ... trop ... évident ...

    Merci

  4. #4
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    En effet ce n'est pas terrible, vous envoyez 200000 fois le résultat de votre fonction.

    notez également que les fonction scalaire faisant intervenir des tables sont à bannir (ne parlons même pas de celles avec "table incluses")
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  5. #5
    Modérateur

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

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    en solution rapide, lier la fonction au schéma devrait déjà faire des miracles, si la fonction est déterministe.
    Ajouter pour cela la clause WITH SCHEMABINDING à la déclaration de la fonction.

    pour aller plus loin, éviter en effet les fonctions multi-instruction, utiliser plutôt des fonctions table en ligne, plus performantes.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut
    Mal heureusement c'est des fonctions qui émulent le Row_Level_Security de 2016 mais comme elles sont dans une DB séparée, je ne peux pas lié les fonctions au schéma.

  7. #7
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    En revanche vous pouvez utiliser des fonctions de table en ligne :
    • en général les fonctions scalaires se réécrivent assez facilement en fonction de table en ligne, et toujours avec WITH SCHEMABINDING
    • il faut utiliser l'opérateur APPLY


    @++

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

Discussions similaires

  1. Optimisation vue avec beaucoup de jointures
    Par oneagaindoguys dans le forum Requêtes
    Réponses: 9
    Dernier message: 07/08/2012, 11h02
  2. [SQL SERVER 2K8] Droit lecture sur Vue avec Fonction
    Par 33Romain dans le forum Administration
    Réponses: 1
    Dernier message: 27/08/2009, 09h34
  3. [optimisation] vue ou fonction ?
    Par brolon dans le forum SQL
    Réponses: 5
    Dernier message: 20/01/2009, 10h48
  4. Réponses: 3
    Dernier message: 07/09/2006, 12h00
  5. [Optimisation] Requetes avec agregats et vue
    Par rad_hass dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 14/01/2006, 13h39

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