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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    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 : 699
    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 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    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 éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    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 : 699
    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 : 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
    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")

  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
    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 éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    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 : 699
    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 : 44
    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
    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