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 :

Persistance des tables temporaires globales


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut Persistance des tables temporaires globales
    Bonjour

    Dans une application web (IIS + ASP + SQL Server 2005) j'utilise une table temporaire globale pour récolter les informations issues de plusieurs bases de données. Je consulte ensuite cette table à partir de plusieurs pages ASP de manière plus ou moins rapide, en fonction des interactions des utilisateurs.

    Mon problème : je constate que la table temporaire que je crée est automatiquement détruite si l'utilisateur n'interagit pas avec le site pendant environ 1 minute.
    En gros : tant qu'il y a des consultations assez rapides sur la table temporaire tout va bien. Dès qu'il ne se passe rien pendant un petit moment .... la table n'est plus accessible.

    Pour caractériser le problème j'ai créé page1.asp qui crée la table temporaire :
    page1.asp :
    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
    <%
    set ConnBase1=server.CreateObject("adodb.connection")
    ConnBase1.CursorLocation=adUseServer
    ConnBase1.open "dsn=base1;uid=user;pwd=mdp;"
     
    set ConnBase2=server.CreateObject("adodb.connection")
    ConnBase2.CursorLocation=adUseServer
    ConnBase2.open "dsn=base2;uid=user;pwd=mdp;"
     
     
    StrSQL = "IF  EXISTS (SELECT * FROM TEMPDB..SYSOBJECTS WHERE NAME like '##req8' ) DROP TABLE ##req8"
    ConnBase1.execute (StrSQL)
     
    StrSQL = "create table ##req8 (Id [int],critere1 varchar(200), critere2 varchar(200), origine bit)"
    ConnBase1.execute (StrSQL)
     
    'Création de l'index
    StrSQL = "CREATE NONCLUSTERED INDEX [IX_req8_critere] ON ##req8 (	[critere1] ASC, [critere2] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]"
    ConnBase1.execute (StrSQL)
     
    StrSQL = "INSERT INTO ##req8 SELECT Id,societe,nom,'true' FROM Table1 where  Nom='TOTO'"
    ConnBase1.execute(StrSQL)
     
    StrSQL = "INSERT INTO ##req8 SELECT Id,societe,nom,'false' FROM Table2 where Nom='TOTO' AND ValeurCodee=28) "
    ConnBase2.execute (StrSQL)
    %>
    Et la page2.asp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <%
    set ConnBase1=server.CreateObject("adodb.connection")
    ConnBase1.CursorLocation=adUseServer
    ConnBase1.open "dsn=base1;uid=user;pwd=mdp;"
     
    StrSQL = "select count(*) from ##req8"
    Set RSTemp  =	ConnBaseClient.execute (StrSQL)
    response.write ("Nb Enreg : " + cstr(RSTemp(0)))
    %>
    Tant que je demande un rafraichissement régulier de la page2.asp ... tout se passe bien. Si j'arrête pendant un moment (1 min environ) puis que je demande le rafraichissement de la page2.asp, j'obtiens alors l'erreur :
    Microsoft OLE DB Provider for ODBC Drivers error '80040e37'
    [Microsoft][SQL Native Client][SQL Server]Nom d'objet '##req8' non valide.
    ==> la table temporaire a été supprimée par SQL Server.

    Je cherche donc une solution pour augmenter la durée de vie de la table temporaire .... ou tout autre solution !!

    Merci !

  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
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Une table temporaire est détruite dès que l'utilisateur qui l'a créé se déconnecte. Qu'elle soit locale ou globale n'y change rien. Or la technique web impose un mode déconnecté incompatible avec ce genre de choses.

    L'intérêt des tables temporaires est extrêmement minime à extrêmement mauvais. En effet les tables temporaires dupliquent généralement des données qui existent déjà et obligent à des écritures disques (journalisation) extrêmement pénalisantes. En dupliquant les données, vous encombrez artificiellement la mémoire de données redondantes, alors qu'en faisant des requêtes directe dans les tables vous l'économiser. En sus chaque table temporaire créée oblige a calculer de nouveaux plans de requêtes alors qu'en réitérant la même requête vous réutilisez systématiquement le même plan mis en cache.

    En règle général l'utilisation des tables temporaires est systématiquement contre performant. Pas toujours pour la requête elle même, mais pour l'ensemble du système (pression mémoire).
    Or SQL est un langage complet, ce qui signifie que tout traitement, aussi complexe soit-il peut se résumer à une et 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
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut
    Bonjour

    J'ai bien compris tous les inconvénients liés aux tables temporaires, cependant, dans mon cas, il me semble que je n'ai pas vraiment le choix : j'extraie des données issues de 2 base de données de structure différente et ensuite, je dois trier les données suivant un critère commun aux 2 bases.

    Il faut que je stocke l'information d'une manière ou d'une autre et que cette information soit persistante dans l'application web (donc lorsque l'on passe d'une page à l'autre). A part une table tampon (temporaire ou autre)... je ne vois pas quelle autre technique je pourrais utiliser... mais je suis preneur de toute idée.
    Dans le cadre de l'application la table tampon ne contiendrait pas plus de 600 lignes d'environ 405 octets chacune. Soit 243 Ko ... ce qui me parait raisonnable.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Vous n'avez donc pas besoin de table temporaire car il suffit de faire une requête interbase.
    Exemple :
    SELECT * FROM mabase.monschema.MaTable AS T1 INNER JOIN MonAutreBase.Monschema.Matable AS T2 ON ....


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

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Par défaut
    Si j'en reviens à mon problème,
    Citation Envoyé par SQLpro Voir le message
    Vous n'avez donc pas besoin de table temporaire car il suffit de faire une requête interbase.
    Exemple :
    SELECT * FROM mabase.monschema.MaTable AS T1 INNER JOIN MonAutreBase.Monschema.Matable AS T2 ON ....
    OK pour faire une requète qui tappe dans 2 tables de 2 bases différentes. Mais je dois maintenant trier le résultat le résultat combiné de 2 colonnes des 2 tables.
    Exemple : j'ai colonne 'societe' dans T1 et un colonne 'societe' dans T2. Comment fais-je pour que mon résultat soit trié par Société quelque-soit la table d'origine ?

  6. #6
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Citation Envoyé par yuan Voir le message
    Si j'en reviens à mon problème,


    OK pour faire une requète qui tappe dans 2 tables de 2 bases différentes. Mais je dois maintenant trier le résultat le résultat combiné de 2 colonnes des 2 tables.
    Exemple : j'ai colonne 'societe' dans T1 et un colonne 'societe' dans T2. Comment fais-je pour que mon résultat soit trié par Société quelque-soit la table d'origine ?
    Je suppose que vous voulez faire un tri de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
    FROM 
    (
    	SELECT col1, col2
    	FROM T1
    	UNION ALL
    	SELECT col1, col2
    	FROM T2
    ) AS T
    ORDER BY T.societe
    Donnez nous la structure de vos 2 tables et ce que vous voulez obtenir au final ...

    ++

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Or SQL est un langage complet, ce qui signifie que tout traitement, aussi complexe soit-il peut se résumer à une et une seule requête !

    A +
    Faux.
    Les query dynamiques n'existent d'ailleurs pas dans le seul but de faire parler.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Peut être ne savez vous pas ce qu'est un langage complet ? mais au sens mathématique qu'en a donné Turing, SQL admettant la récursivité depuis la norme de 1999, il est donc devenu complet, ce qui signifie qu'il est capable de traiter tout problème en une seule requête !
    A lire : http://fr.wikipedia.org/wiki/Turing-complet

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

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    ce qui signifie qu'il est capable de traiter tout problème en une seule requête !
    Faux.


    D'ailleurs :

    Problème : insérer une ligne dans 2 tables distinctes.
    Nombre de requête de la solution : minimum 2.

  10. #10
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    Faux.

    D'ailleurs :

    Problème : insérer une ligne dans 2 tables distinctes.
    Nombre de requête de la solution : minimum 2.
    Dans ce cas précis vous n'avez pas un problème mais 2 ....

    ++

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

Discussions similaires

  1. [mysql 5] utilisation des tables temporaires
    Par gene69 dans le forum MySQL
    Réponses: 7
    Dernier message: 04/11/2010, 16h59
  2. DROP des tables temporaires HT_ sous ORACLE
    Par bud_gw dans le forum Hibernate
    Réponses: 0
    Dernier message: 23/08/2010, 14h57
  3. Utilisation des tables temporaires avec une vue
    Par patic dans le forum Requêtes
    Réponses: 0
    Dernier message: 18/09/2009, 18h56
  4. Liste des tables temporaires(10gR2)
    Par LBO72 dans le forum SQL
    Réponses: 2
    Dernier message: 26/03/2008, 10h00
  5. Affichage des tables temporaires d'Access avec GetTableNames
    Par Oluha dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/05/2005, 16h23

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