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

Langage SQL Discussion :

Requêtes avec IN(liste d'identifiant) qui plante


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut Requêtes avec IN(liste d'identifiant) qui plante
    Bonjour à tous,

    j'ai une requête de ce genre :

    SELECT certains champs
    FROM Table
    WHERE ID_Table IN (1,2,5,8,7,9,...)

    Je cherche à récupérer les informations que de certains enregistrements. le seul moyen que j'ai de cibler ces enregistrements sont les identifiants.

    Le problème c'est qu'avec un certain nombre >6000 identifiants, j'ai cette erreur :

    ---------------------------
    Microsoft SQL Server Management Studio Express
    ---------------------------
    Mémoire insuffisante pour cette opération.
    ---------------------------
    OK Aide
    ---------------------------

    j'utilise une base sous SQLServer et j'ai exécuté la requête directement dans le SQL Manager.

    Avez vous une idée ? est ce le fait de mettre trop d'identifiants ? ce qui lui demande trop de calcul ?
    dois-je faire mes requêtes en plusieurs fois ? en découpant mes listes d'identifiant ?
    Une autre requête possible ?

    merci pour votre aide
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ouah, sympa !
    Bon, je ne pense pas que c'est SQL Server, mais juste l'interface.
    J'ai trouvé une limite sur le nombre d'identifiants, mais c'est un peu plus long...
    http://support.microsoft.com/kb/913050/fr

    Ces identifiants sont dans un fichier ?
    Tu peux peut être commencer par importer le fichier dans une table, puis faire la jointure ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  3. #3
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Sur Oracle , je sais qu'il y a une limite au contenu du IN (s'il n'est pas issu d'un select) La limite est à 1000 en principe.


    Genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select * from TABLE1 
    where ident in ( 1,2,...1000,1001) 
    => ca plante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from TABLE1
    where ident in ( Select ident from TABLE2 where ....) 
    => ca ne plante pas
    Comment obtiens tu le contenu de ton IN ?
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  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
    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 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mémoire insuffisante pour cette opération.
    Signifie que vous n'avez pas assez de RAM pour effectuer cette opération. A ma connaissance il n'y a pas de limite de nombre dans un IN, juste la taille de la requête qui de mémoire ne doit pas dépasser 128 Mo de code en v 2000. Mais en v 2005 je crois que c'est bien plus.

    D'autre part il y a un problème et sa correction à ce sujet :
    http://support.microsoft.com/kb/912439/en-us

    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 régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    Merci à tous pour vos réponses.

    Alors, pour mon IN, j'obtiens les identifiants à partir d'une chaine. En fait dans mon programme Delphi, j'utilise des composants ADO et c'est une chaine qui est construite.
    Pour être sur que cela ne vient pas de mon composant ou autre j'ai fais un copier coller dans le SQLServer.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM TABLE1
    WHERE ident IN ( SELECT ident FROM TABLE2 WHERE ....)
    Et je peux mettre mes identifiants dans le WHERE ? ça va pas me faire la même chose ?

    @sqlPro : je vais regarder pour ton lien, merci

    Par contre si je remplace dans mon IN par un Select identifiant From Table sans rien de plus ça marche bien mais bon évidements je récupère trop d'enregistrement mais pas de soucis de mémoire.
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  6. #6
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par SkYsO Voir le message

    Par contre si je remplace dans mon IN par un Select identifiant From Table sans rien de plus ça marche bien mais bon évidements je récupère trop d'enregistrement mais pas de soucis de mémoire.
    C'est donc la construction de la requete qui est trop grosse

    regarde si tu peux pas regrouper certains identifiants ..
    genre pas la peine de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ident in ( 1,2,3,4,5,6,7,8,9,10,11,12,13,15,35)
    Fais plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ident <= 15 or ident = 35
    ce genre de truc peut faire gagner un peu.

    Enfin là ca reste de la bidouille quand même ....
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  7. #7
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par miloux32 Voir le message
    C'est donc la construction de la requete qui est trop grosse

    regarde si tu peux pas regrouper certains identifiants ..
    genre par la peine de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ident in ( 1,2,3,4,5,6,7,8,9,10,11,12,13,15,35)
    Fais plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ident <= 15 or ident = 35
    ce genre de truc peut faire gagner un peu.

    Enfin là ca reste de la bidouille quand même ....

    Je ne peux pas faire ça car ma liste est vraiment aléatoire et je pense que le traitement sera trop lourd si je dois faire ça. Mais c'est peut être une solution après tout.
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  8. #8
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par SkYsO Voir le message
    Je ne peux pas faire ça car ma liste est vraiment aléatoire et je pense que le traitement sera trop lourd si je dois faire ça. Mais c'est peut être une solution après tout.
    Ou alors la découper ....
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  9. #9
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    Oui j'avais pensé à ça mais bon.

    A oui sinon j'ai visité le lien SQLPro, le serveur de test actuel est SQLServer2000
    Par contre j'utilise de temps en temps l'interface du 2005 pour l'exécution de requête.
    Bref, y'a-t-il aussi un correctif sur 2000 ?
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ta requête que tu exécutes par DELPHI, elle plante dans le programme ?
    Dans ce cas, ça lève quelle exception ?
    Parce qu'il se peut également qu'il y ait des limites sur les paramètres des méthodes qui exécutent le SQL dans le programme...

    Si tel est le cas, tu peux insérer tes identifiants par paquets de [limite admissible] dans une table à 1 colonne, puis tu fais la jointure entre la table et la table temporaire...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  11. #11
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    Elle plante à l'ouverture, donc en fait c'est l'objet ADOQuery qui me renvoi l'erreur du SQLServer.
    Mais bon exécuter la requête par paquet est aussi une solution que je vais garder en tête.

    merci à tous


    D'autres avis ?
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  12. #12
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Et l'objet ADOQuery te renvoie la même Erreur que lorsque tu exécutes directement sur SQL server mangement ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  13. #13
    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 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Il serait bien plus simple d'utiliser une table temporaire, faire l'insertion de toutes tes valeurs dedans, voir même indexer l'unique colonne, puis de lancer la requête....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE #T (C INT)
    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO #T (C) VALUES (1);
    INSERT INTO #T (C) VALUES (2);
    INSERT INTO #T (C) VALUES (5);
    ...
    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX XXX ON #T (C)
    et enfin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT certains champs
    FROM Table T
           INNER JOIN #T ON ID_Table = C
    Non seulement ce serait plus élégant, mais aussi plus rapide et plus performant !

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

  14. #14
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    @pacman, oui la même erreur.

    @sqlPro : ça ne sera pas trop long de faire par exemple 6000 insert ? à la place de disons deux fois la requête avec 3000 ident dans le IN ?
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  15. #15
    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 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Selon toi, qu'est ce qui sera plus rapide : faire un gros tas de 6000 rails et dire aux ouvrier d'aller chercher les rails du tas un a un pour construire la voie de chemin de fer dessus ou bien apporter chaque nouveau rail au moment ou l'on en a besoin à la place ou l'on doit le poser ?

    Il y a encore plus rapide : faire des rails préassemblés en usine :
    construire un fichier ou un flux de données (XML par exemple) côté client et le faire absorber par le serveur à l'aide d'un outil genre ETL...
    Par exemple avec SQL Server en utilisant un flux XML mémoire et les procédures d'insertion du flux qui vont bien, ou alors créer un fichier sur disque et l'importer via la commande BULK INSERT.

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

  16. #16
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    hum ok,

    le côté XML aussi à l'air intéressant, je vais voir ce que je peux trouver. merci
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  17. #17
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 511
    Points
    511
    Par défaut
    Bonjour.
    Est-ce que SQL est vraiment adapté?
    est-ce que tu ne pourrais pas sélectionner plus de lignes, et refiltrer en logiciel (PHP, C Java, ou même peut-être XSL avec un rendu XML)

    en prenant pour la sélection par exemple le min et le max des valeurs utilisée dans le "in".
    d'ailleurs si tu as toutes ces valeurs de IN, tu as peut-être déjà fait la requête qui envoie davantage de lignes=> solution: conserver ce résultat.

  18. #18
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    je ne suis pas sûr que cela soit une bonne solution car si je me retrouve avec *100 d'enregistrement à parcourir ça risque de gâcher pas mal.
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

Discussions similaires

  1. SimpleDataSet avec requête qui plante
    Par blond1888 dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/02/2007, 16h22
  2. Critère de requête avec une zone de liste dans un formulaire
    Par Dehez dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/06/2006, 12h49
  3. Réponses: 2
    Dernier message: 03/05/2006, 17h00
  4. Requête UPDATE qui plante
    Par rsgo dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/04/2006, 11h30
  5. [Novice] Problème avec Eclipse 3.0.x qui plante
    Par esolarc dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/05/2005, 13h22

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