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

Requêtes PostgreSQL Discussion :

Procédure Stockée, ou pas ?


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 585
    Points : 1 139
    Points
    1 139
    Par défaut Procédure Stockée, ou pas ?
    Bonjour.
    Dans le cadre du développement d'un petit jeu "just for fun", nous avons décidé de séparer le serveur d'authentification, le serveur de jeu et le serveur de BDD. Et contrairement à ce qu'on trouve dans beaucoup de code sur internet, nous ne voulons pas que le serveur d'authentification/de jeu construise pas à pas ses requêtes (du genre req = "SELECT * FROM " + variableTable + "WHERE truc = " + variableCond1 + " AND chose = " + variableCond2), mais plutôt passe au serveur de BDD une commande du genre "requête_n°3, variableTable, variableCond1, variableCond2" (il n'y a guère qu'une quinzaine de requêtes courantes utilisées très souvent en général).
    A votre avis, vaut-il mieux que le serveur de BDD :
    - reconstuise lui-même ce genre de requête à chaque fois, par exemple en remplaçant dans une requête modèle les variables par leur contenu (remplacement de texte dans une chaine) ?
    - utilise des instructions préparées ?
    - utilise des procédures stockées (et sont-elles préparables ?) ?
    Merci !
    T.
    L'avis publié ci-dessus est mien et ne reflète pas obligatoirement celui de mon entreprise.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    du genre req = "SELECT * FROM " + variableTable + "WHERE truc = " + variableCond1 + " AND chose = " + variableCond2
    1) Il vaut mieux éviter la guerre des étoiles !

    2) Je n'ai jamais compris l'intérêt d'utiliser des variables pour les noms de table et de colonnes dans la construction d'une requête qui est de toute façon spécifique au besoin précis au morceau de code applicatif.
    Par exemple, si la méthode d'authentification est dans une classe Utilisateur, je trouve plus clair et plus facile d'écrire directement la requête SQL dans le code applicatif, du genre :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    	/**
    	 * Récupère les informations de l'utilisateur
    	 * @param string $login
    	 * @return \PDOStatement
    	 */
    	public function getUserByLogin($login)
    	{
     
    		$sql = "
    			SELECT userId, userValide, userNom, userPrenom, userLdap
    			FROM v_utilisateur
    			WHERE userLogin = :login
    		";
     
    		$result = $this->executerRequete($sql, array(array('param'=>':login', 'value'=>$login, 'data_type'=>PDO::PARAM_STR)));
     
    		if(!empty($result))
    		{
    			$this->setIdentifiant(intval($result[0]['userId']));
    			$this->setNomUsuel($result[0]['userNom']);
    			$this->setPrenom($result[0]['userPrenom']);
    			$this->setUtiValide(intval($result[0]['userValide']));
    			$this->setUtiLdap(intval($result[0]['userLdap']));
    		}
     
    		return $result;
    	}
    Dans mon code, v_utilisateur est une vue qui rassemble les informations d'un utilisateur à partir des différentes tables où sont stockées les informations (table des personnes, des personnes physiques, des utilisateurs).

    Comme l'authentification se fera toujours sur cette vue, à quoi ça servirait d'utiliser une variable à la place de v_utilisateur ?


    Bref, j'ai l'impression que vous vous compliquez inutilement la vie !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    PostgreSQL ne met pas en cache les requêtes ah-hoc qui sont envoyées directement par l'application cliente. Pour forcer la mise en cache des plans de requêtes et donc leur réutilisation (ce qui permet de gagner du temps) il faut accepter d'en perdre en demandant un "prepare" qui envoie une première fois la requête pour établir un plan consigné puis exécuter la requête qui va reprendre le plan consigné.

    En revanche en utilisant des fonctions (il n'y a pas de procédure dans PostgreSQL) la mise en cache des plans de requête est automatique.

    Donc, oui, ce sera plus intéressant d'un point de vue sécurité et performances.

    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/ * * * * *

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 585
    Points : 1 139
    Points
    1 139
    Par défaut
    @Cinephil: j'ai écrit ma ligne d'exemple en vitesse sans trop réfléchir et je le regrette: il n'a jamais été question de mettre un nom de table en variable ! Ca m'apprendra à ne relire que les phrases, pas les exemples !
    @SQLPro : il me semblait bien avoir lu quelque part qu'une mise en cache se faisait automatiquement mais je n'avais pas retrouvé dans quelles circonstances. Allons-y donc pour les fonctions, ce qui me semblait d'ailleurs mieux organisé et plus simple d'emploi !

    Merci à vous !
    L'avis publié ci-dessus est mien et ne reflète pas obligatoirement celui de mon entreprise.

  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 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Il y a plusieurs states de cache dans un SGBDR. Par exemple dans SQL Server il y en a une centaine... Les principales sont :
    1) les données
    2) les procédures (ou fonctions dans le cas de PG)
    3) les plan d'exécution
    ...
    Le but étant de réutiliser plutôt que de reconstruire.
    PG fait essentiellement les deux et le 3e uniquement si :
    1) la requête ad hoc est préparée
    2) la requête est incluse dans une routine SQL (fonction dans PG).

    Le cache étant géré par un algorithme de la famille LRU (Least Recently Use)

    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/ * * * * *

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

Discussions similaires

  1. [WD17] Erreur dans Procédure stockée et pas dans code de fenêtre
    Par Xsara 167 cv dans le forum WinDev
    Réponses: 3
    Dernier message: 02/10/2013, 10h14
  2. Problème procédure stockée insérant pas de données
    Par Yogy dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/11/2011, 15h26
  3. Réponses: 8
    Dernier message: 27/09/2007, 08h58
  4. Procédure stockée qui ne marche pas
    Par sheura dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/02/2007, 18h15
  5. Debuger une procédure stockée en mode pas à pas
    Par Oluha dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/12/2004, 10h59

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