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 :

Sql Clause IN


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
    Juin 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 29
    Par défaut Sql Clause IN
    Bonjour,

    Suite à une recherche sur google je n'ais toujours pas trouvé une solution concrète à mon problème.
    Ce que je souhaite faire c'est lancer des requêtes sql avec une clause in qui peut contenir un trés grand nombre de résultats, Et c'est à priori un type de requête qui sera souvent exécutée.

    Exemple de requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT idref 
    FROM Matable 
    WHERE id IN (212, 787, 898 ,89898, 8989 , 444, ...
    (il peut y en avoir 50000))
    et la table Matable contient environ 3 millions de lignes.

    Et donc comme on peut l'attendre l'execution de la requête précédente peut être un petit plus longue (~20 secondes) pour une application qui doit être réactive c'est pas terrible.
    la question que je me poses c'est qu'elle serait la meilleur méthode pour répondre à ce genre de pb:
    - les tables temporaires ? pas top j'ai des erreurs de mémoire insuffisantes
    - une application externe qui charge la table et qui effectue le traitement à la place ? (ca prendra bp de place mémoire pour qu'un seul type de requête)

    Alors si vous avez d'autres pistes je suis vraiment preneur.

    Merci d'avance

    Note : Utilisation de SQL Server 2005

  2. #2
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Une idée : utilises une table de travail qui contiendra la liste des ID que tu veux rechercher. Fais un TRUNCATE de ta table pour la vider complétement puis un INSERT pour y ajouter chaque ID de ta clause IN. Ensuite, fais une simple requête SELECT qui utilisera cette table de travail et MaTable avec une liaison sur le champs commun ID.

    Penses bien sûr à indexer le champs ID (voire le mettre en cléf primaire).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 29
    Par défaut
    Dans ce cas là ca reviendrai à utilisé une table temporaire et ajouter les id dedans et de faire une jointure dessus. C'est ce que j'avais déja fait , mais c'est trop lent. J'ai tout de même essayer avec une table simple(table de travail) mais ca m'est tout autant de temps.

    La difficulté c'est que ce type de requêtes peut être executé par différents utilisateurs en même temps et avec des valeurs dans la clause IN différentes (c'est pour ça que j'avais pensée aux tables temporaires mais les performances ne le permettent pas)

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Comment sont déterminées les id qui doivent être dans la clause IN ?
    Si c'est le résultat d'une requête, pourquoi ne pas faire une simple jointure ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Par défaut
    - les tables temporaires ? pas top j'ai des erreurs de mémoire insuffisantes
    - une application externe qui charge la table et qui effectue le traitement à la place ? (ca prendra bp de place mémoire pour qu'un seul type de requête)
    Évidemment en SQL, ce serait mieux, mais avec 50 000 entrées dans un IN, la requête me parait un peu "obèse". Une solution intermédiaire entre une solution tout SQL et une solution pure .net serait pourquoi pas une procédure stockée en .net. Bien que cela demande un investissement en recherche/développement important pour une performance résultante inconnue, est ce que ce sera plus rapide que 20 secondes...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 29
    Par défaut
    Comment sont déterminées les id qui doivent être dans la clause IN ?
    Si c'est le résultat d'une requête, pourquoi ne pas faire une simple jointure ?
    Les valeurs sont générées par une application annexe. Cette application ne renvoit que des valeurs.


    Évidemment en SQL, ce serait mieux, mais avec 50 000 entrées dans un IN, la requête me parait un peu "obèse". Une solution intermédiaire entre une solution tout SQL et une solution pure .net serait pourquoi pas une procédure stockée en .net. Bien que cela demande un investissement en recherche/développement important pour une performance résultante inconnue, est ce que ce sera plus rapide que 20 secondes...
    La procédure stockée elle effectuerai une insertion dans une table puis ferai la jointure et retournerai les résultats c'est bien ca ? prquoi une procédure stockée et pkoi en .net ?

    Merci

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Citation Envoyé par alaks Voir le message
    ...Note : Utilisation de SQL Server 2005
    Effectivement, c'est plutôt SQL Server qui importe dans ce cas...

    alaks : ce que je voulais dire un peu plus haut, c'est simplement que si je devais me taper un écran (client lourd où léger) avec 50k lignes, j'aurais du mal à les exploiter d'un seul coup...
    Si c'est vraiment juste pour visualiser, on pourrait imaginer un système de pagination où tu envoies tes paquets de IN selon le besoin...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 29
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Effectivement, c'est plutôt SQL Server qui importe dans ce cas...
    Oui effectivement j'utilises bien SQL server, mais j'étais parti pour chercher l'equivalent du load init de mysql sous sql server.
    Donc merci pour l'idée Antoun
    Dés demain j'essai avec un bulk insert et je croise les doigts..

    Citation Envoyé par pacmann Voir le message
    alaks : ce que je voulais dire un peu plus haut, c'est simplement que si je devais me taper un écran (client lourd où léger) avec 50k lignes, j'aurais du mal à les exploiter d'un seul coup...
    Si c'est vraiment juste pour visualiser, on pourrait imaginer un système de pagination où tu envoies tes paquets de IN selon le besoin...
    Oui je serai tout à fait d'accord avec toi dans la mesure ou si c'était moi qui contrôlait le client, or c'est pas le cas. Tous ce que je dois faire c'est lors d'un appel à cette fonction de recherche, je dois retourner tous les résultats.

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    désolé, j'étais sur l'idée qu'on faisait du MySQL (ça doit être l'âge).

    Merci à ylarvor d'avoir rétabli et donné l'équivalence !

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 29
    Par défaut
    Impressionant le bulk insert, j'ai fait un bulk insert de 5 000 lignes ca a mise 0 secondes (enfin qq millisecondes qd mm); c'est terrible.
    Par contre j'ai pas tester le temps que ça prendrait pour créer un fichier de 5000 lignes.

    Donc ac cette méthode j'ai pu faire une jointure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select idref from maTable A, tableCree B, where A.photoid = B.photoid
    mais je crois qu'il me manque un index ou qq chose parce qu'elle mets 5 secondes. Je vais voir ça un peu plus en détails.

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par alaks Voir le message
    mais je crois qu'il me manque un index ou qq chose parce qu'elle mets 5 secondes. Je vais voir ça un peu plus en détails.
    Sur tableCree.photoID.

Discussions similaires

  1. requete SQL clause WHERE avec variable
    Par gabule dans le forum JDBC
    Réponses: 6
    Dernier message: 09/01/2019, 11h04
  2. [Oracle / Sql] clause where avec resultat d'une requete
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 2
    Dernier message: 31/01/2006, 09h37
  3. [SQL] clause Where sur un booléen
    Par mosquitout dans le forum Access
    Réponses: 3
    Dernier message: 21/12/2005, 21h29
  4. pb the requête sql clause UNION
    Par new_wave dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/11/2005, 13h38
  5. [SQL] Clause Having
    Par Lou Pitchoun dans le forum Access
    Réponses: 2
    Dernier message: 20/10/2005, 14h03

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