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 :

Passer un curseur en paramètre d'une fonction?


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Passer un curseur en paramètre d'une fonction?
    Bonjour à tous,
    Tout d'abord je dois préciser que mon niveau SQL est tres faible...

    voilà mon problème :

    j'ai une procédure stockée qui parcours une table tres volumineuse et dans la close where du select de cette procedure, j'utilise le résultat d'une fonction.

    Cela fonctionnait bien jusque maintenant mais on doit maintenant modifirer la fonction.
    Le problème est que cette modification implique de parcourir une table assez volumiseuse aussi.

    Donc je me retrouve à parcourir une premiere table tres volumineuse et pour chaque élément de cette table, je dois parcourir une autre table volumineuse.
    Donc en gros si la première table contient 10000 lignes, je parcourerai 10000 fois la seconde table ... Qui elle meme peut contenir le meme nombre de ligne ...

    Le but de passer la seconde table comme paramètre à la fonction, sous forme de curseur, serait de la charger une seule fois en mémoire afin de gagner en rapidité d'exécution

    Est ce que c'est possible ?
    La solution du curseur est elle la meilleure d'un point de vue performance ?

    Merci d'avance pour votre aide

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 848
    Points : 52 966
    Points
    52 966
    Billets dans le blog
    6
    Par défaut
    non, cela n'est pas possible.

    en revanche je m'étonne que vous ayez besoi de tout se fatras. Une simpel requête avec une sous requête corrélée doit faire l'affaire.

    commencez donc pas apprendre le SQL, parce que si vous commencez par imbriquer des appels de procédure sur des curseur de curseur de curseur, votre applications sera un veau !

    En principe depuis SQL Server 2005, tout traitement aussi complexe qu'il soit doit pouvoir être écrit en une seule requête.

    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Citation Envoyé par SQLpro
    En principe depuis SQL Server 2005, tout traitement aussi complexe qu'il soit doit pouvoir être écrit en une seule requête.
    "I had a dream..."
    Martin Luther King
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bon vous aviez raison, on peut résoudre cela par un subselect, le tout est de savoir si ma première table fait 5000 lignes et ma seconde en fait autant ca me fait 5000X5000 tests à faire ce qui peut etre un peu lourd. D'autant que le retour de la procédure est lui aussi traité par la suite.

    Enfin je me suis arrangé pour faire passer un des select en code C# et pour ne le lire que quand c'est vraiment utile et le stocker une seule fois en mémore dans un dataset ce qui a l'air de fonctionner plus rapidement que le subselect.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 848
    Points : 52 966
    Points
    52 966
    Billets dans le blog
    6
    Par défaut
    Une requête sera généralement toujours plus efficace qu'un curseur à de très rares exceptions près....

    De plus rien ne vous interdit d'imbriquer les requêtes les unes dans les autres ce qui sea aussi plus efficace que de les enchainées dans des tables temporaires :

    SELECT ..
    FROM ( SELECT ... )
    )

    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Passer un curseur en paramètre d'une procédure
    Par tommy_f dans le forum Forms
    Réponses: 4
    Dernier message: 13/05/2008, 16h54
  2. Réponses: 2
    Dernier message: 26/12/2007, 12h04
  3. [Débutant] Comment passer un fichier en paramètre d'une fonction?
    Par Rires et Chansons dans le forum MATLAB
    Réponses: 4
    Dernier message: 23/10/2007, 21h12
  4. Passer un pointeur en paramètre d'une fonction
    Par oranoutan dans le forum C
    Réponses: 18
    Dernier message: 11/09/2007, 21h48
  5. Passer un buffer en paramètre d'une fonction
    Par jomeo dans le forum C++
    Réponses: 3
    Dernier message: 26/02/2007, 17h00

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