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

SQL Procédural MySQL Discussion :

Procédure VS code SQL


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Points : 511
    Points
    511
    Par défaut Procédure VS code SQL
    Bonjour,

    Je constate que l'execution de mon SQL est plus rapide que le même SQL executé via une procédure stocké. Est-ce normal ?

    Mon code SQL met 0.0014 seconde a s'executé :
    Code : 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
    CREATE TEMPORARY TABLE TMP_MAX_ID (HTR_ID INT);
    INSERT INTO TMP_MAX_ID (HTR_ID) SELECT MAX(HTR_ID) FROM TG_HISTORIC_HTR WHERE HST_ID = 1 GROUP BY CTR_ID;
     
    CREATE TEMPORARY TABLE TMP_LAST_VALUE (HTR_ID INT, HTA_VALUE VARCHAR(20));
    INSERT INTO TMP_LAST_VALUE (HTR_ID, HTA_VALUE) SELECT A.HTR_ID, HTI_VALUE FROM T_HISTORIC_INTEGER_HTI A INNER JOIN TMP_MAX_ID B ON A.HTR_ID = B.HTR_ID;
    INSERT INTO TMP_LAST_VALUE (HTR_ID, HTA_VALUE) SELECT A.HTR_ID, HTD_VALUE FROM T_HISTORIC_DECIMAL_HTD A INNER JOIN TMP_MAX_ID B ON A.HTR_ID = B.HTR_ID;
    INSERT INTO TMP_LAST_VALUE (HTR_ID, HTA_VALUE) SELECT A.HTR_ID, HTS_VALUE FROM T_HISTORIC_STRING_HTS A INNER JOIN TMP_MAX_ID B ON A.HTR_ID = B.HTR_ID;
    INSERT INTO TMP_LAST_VALUE (HTR_ID, HTA_VALUE) SELECT A.HTR_ID, HTX_VALUE FROM T_HISTORIC_TEXT_HTX A INNER JOIN TMP_MAX_ID B ON A.HTR_ID = B.HTR_ID;
    INSERT INTO TMP_LAST_VALUE (HTR_ID, HTA_VALUE) SELECT A.HTR_ID, HTE_VALUE FROM T_HISTORIC_DELTA_HTE A INNER JOIN TMP_MAX_ID B ON A.HTR_ID = B.HTR_ID;
     
    SELECT
    	ITM_NAME,
    	HST_NAME,
    	HTA_VALUE
    FROM
    	T_HOST_HST A INNER JOIN
    	TJ_USE_USE B ON A.HST_ID = B.HST_ID INNER JOIN
    	TJ_CONTAIN_CTN C ON B.TPL_ID = C.TPL_ID INNER JOIN
    	T_CONTROL_CTR D ON C.CTR_ID = D.CTR_ID INNER JOIN
    	T_ITEM_ITM E ON D.ITM_ID = E.ITM_ID LEFT JOIN
    	TG_HISTORIC_HTR F ON D.CTR_ID = F.CTR_ID AND A.HST_ID = F.HST_ID INNER JOIN 
    	TMP_LAST_VALUE G ON F.HTR_ID = G.HTR_ID
    WHERE
    	A.HST_ID = 1;
    La procédure - call sp_last_value(1) - met 0.2084 seconde :
    Code : 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
    28
    CREATE PROCEDURE SP_LAST_VALUE (VAR_HST_ID INT)
    BEGIN
    	CREATE TEMPORARY TABLE TMP_MAX_ID (HTR_ID INT);
    	INSERT INTO TMP_MAX_ID (HTR_ID) SELECT MAX(HTR_ID) FROM TG_HISTORIC_HTR WHERE HST_ID = VAR_HST_ID GROUP BY CTR_ID;
     
    	CREATE TEMPORARY TABLE TMP_LAST_VALUE (HTR_ID INT, HTA_VALUE VARCHAR(20));
    	INSERT INTO TMP_LAST_VALUE (HTR_ID, HTA_VALUE) SELECT A.HTR_ID, HTI_VALUE FROM T_HISTORIC_INTEGER_HTI A INNER JOIN TMP_MAX_ID B ON A.HTR_ID = B.HTR_ID;
    	INSERT INTO TMP_LAST_VALUE (HTR_ID, HTA_VALUE) SELECT A.HTR_ID, HTD_VALUE FROM T_HISTORIC_DECIMAL_HTD A INNER JOIN TMP_MAX_ID B ON A.HTR_ID = B.HTR_ID;
    	INSERT INTO TMP_LAST_VALUE (HTR_ID, HTA_VALUE) SELECT A.HTR_ID, HTS_VALUE FROM T_HISTORIC_STRING_HTS A INNER JOIN TMP_MAX_ID B ON A.HTR_ID = B.HTR_ID;
    	INSERT INTO TMP_LAST_VALUE (HTR_ID, HTA_VALUE) SELECT A.HTR_ID, HTX_VALUE FROM T_HISTORIC_TEXT_HTX A INNER JOIN TMP_MAX_ID B ON A.HTR_ID = B.HTR_ID;
    	INSERT INTO TMP_LAST_VALUE (HTR_ID, HTA_VALUE) SELECT A.HTR_ID, HTE_VALUE FROM T_HISTORIC_DELTA_HTE A INNER JOIN TMP_MAX_ID B ON A.HTR_ID = B.HTR_ID;
     
    	SELECT
    		ITM_NAME,
    		HST_NAME,
    		HTA_VALUE
    	FROM
    		T_HOST_HST A INNER JOIN
    		TJ_USE_USE B ON A.HST_ID = B.HST_ID INNER JOIN
    		TJ_CONTAIN_CTN C ON B.TPL_ID = C.TPL_ID INNER JOIN
    		T_CONTROL_CTR D ON C.CTR_ID = D.CTR_ID INNER JOIN
    		T_ITEM_ITM E ON D.ITM_ID = E.ITM_ID LEFT JOIN
    		TG_HISTORIC_HTR F ON D.CTR_ID = F.CTR_ID AND A.HST_ID = F.HST_ID INNER JOIN 
    		TMP_LAST_VALUE G ON F.HTR_ID = G.HTR_ID
    	WHERE
    		A.HST_ID = VAR_HST_ID;
     
    END
    Je ne sais pas si ça a un impact, j’exécute tout ça a partir du phpmyadmin, n'ayant pour l'instant, pas accès au serveur.

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 344
    Points : 18 919
    Points
    18 919
    Par défaut
    Salut Sebwar.

    Citation Envoyé par Sebwar
    Je constate que l’exécution de mon SQL est plus rapide que le même SQL exécuté via une procédure stocké. Est-ce normal ?
    SQL est un langage de requête. Donc Exécuter un langage ne veut rien dire. Dites plutôt "l'exécution de ma requête sql".

    Tout à fait normal, car en utilisant un trigger, une procédure, vous ajouter un niveau de traitement supplémentaire.

    Si vous faites du recopiage en ayant la certitude de ne pas rencontrer des problèmes d'intégrité de votre table temporaire, vous pouvez désactiver quelques contrôles.

    1) la désactivation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set unique_checks      = 0;
    set foreign_key_checks = 0;
    set sql_log_bin        = 0;
     
    alter table Cities DISABLE KEYS;
    2) l'activation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    alter table Cities ENABLE KEYS;
     
    set unique_checks      = 1;
    set foreign_key_checks = 1;
    set sql_log_bin        = 1;
    3) Je voie aussi que vous faites une jointure.
    Créez les index nécessaire à l'optimisation de vos requêtes. A priori, ce sont vos primary key. Est-ce bien cela ?

    4) ajouter "SELECT SQL_NO_CACHE" afin de ne pas stocker dans les buffers de MySql le résultat de vos requêtes.
    Il y a mieux, en mettant ceci avant votre traitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET  SESSION query_cache_type=off;
    Cela désacrive les buffers et va vous faire gagner un peu de temps.

    Si vous êtes en ligne de commande, ajouter ceci "mysql --unbuffered".

    5) le temps d'exécution n'est pas très significatif.
    --> pour la requête : 0.0014 secondes
    --> pour la procédure : 0.2084 secondes

    Je pourrai comprendre votre problème si d'un coté vous aviez 2 heures 30 minutes et de l'autre 1 minutes.
    Mais ce n'est pas le cas.

    Citation Envoyé par Sebwar
    Je ne sais pas si ça a un impact, j’exécute tout ça a partir du phpmyadmin, n'ayant pour l'instant, pas accès au serveur.
    Si, comme vous le dites, vous n'aviez pas accès au serveur MySql, vous ne pourriez pas exécuter vos requêtes.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Points : 511
    Points
    511
    Par défaut
    SQL est un langage de requête. Donc Exécuter un langage ne veut rien dire. Dites plutôt "l'exécution de ma requête sql".
    Je vois qu'on est très pointilleux ! Mais c'est bien, la précision apporte la qualité

    Je pourrai comprendre votre problème si d'un coté vous aviez 2 heures 30 minutes et de l'autre 1 minutes.
    C'est une question que je me pose maintenant alors que je n'ai que quelques centaines de milliers de lignes dans mes tables, affin d'anticiper les ralentissements quand dans quelques mois j'aurai des millions de lignes.

    Si, comme vous le dites, vous n'aviez pas accès au serveur MySql, vous ne pourriez pas exécuter vos requêtes.
    Je vois que le détail vous porte a cœur je vais rectifier ça tout de suite. Je n'aurai pas du dire "[...] j’exécute tout ça a partir du phpmyadmin, n'ayant pour l'instant, pas accès au serveur."
    mais plutôt "j'ai accès au MySQL uniquement via le phpmyadmin" donc pas d'accès ssh, ni rien d'autre.


    Tout à fait normal, car en utilisant un trigger, une procédure, vous ajouter un niveau de traitement supplémentaire.
    Dans le cas d'une procédure stockée, quel est ce niveau de traitement supplémentaire ? Il y a une étape compilation ou un truc du genre ?

  4. #4
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 676
    Points : 2 010
    Points
    2 010
    Par défaut
    Non, Mysql ne compile pas les procédures stockées à l'heure actuelle ni ne cache le plan d'exécution.

    Si on veut de la performance, il faut regarder du coté des prepared statements en sachant que ceux-ci ne bénéficient pas du query cache.
    La joie de l'âme est dans la planification -- Louis Hubert Liautey

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/04/2014, 17h28
  2. Réponses: 8
    Dernier message: 27/09/2010, 22h43
  3. [IB6] Code SQL.
    Par qi130 dans le forum SQL
    Réponses: 1
    Dernier message: 21/02/2005, 13h21
  4. Récupérer le code SQL à partir d'une requête
    Par Edith_T dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 23/11/2004, 15h10
  5. Procédures stockées imbriquées SQL Server
    Par Mike69 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/10/2003, 11h31

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