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 :

Nombre limite d'occurences dans un IN


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut Nombre limite d'occurences dans un IN
    Bonjour,

    Je me demandais que ce soit sous ORACLE ou sous MSQL, y'a-t-il une limitation du nombre d'occurences ?

    J'ai 4 à 5 tables à "jointer" pour Consolider une nouvelle table sur une liste de 2 millions d'identifiants et je me demandais si c'était optimal de mettre ma "liste" de 2 millions d'occurences dans un IN...

    Y'a-t-il une manière plus "propre" ?

    merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 082
    Points : 30 841
    Points
    30 841
    Par défaut
    S'il s'agit d'une liste de valeurs "en dur", il existe en effet des limites qui différent d'un SGBD et d'une version à une autre. Tu trouveras l'information dans la documentation technique.
    S'il s'agit de vérifier si une valeur est dans une table, il n’y a pas de limite à ma connaissance.
    Tu peux aussi utiliser une jointure ou EXISTS.
    Regarde le plan d'exécution, ajoute éventuellement les index qui vont bien... il n'y a pas de recette unique
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 155
    Points : 7 404
    Points
    7 404
    Billets dans le blog
    1
    Par défaut
    SQL Server ne semble pas avoir de limite, même pour les valeurs littérales.
    En effet, il y a une limite de taille du lot batch, mais à ce moment le reste du IN est évalué dans un second batch (trouvé sur les forums de la MSDN).

    En revanche, IL NE FAUT PAS utiliser de IN littéral de grande taille : cela consomme énormément de ressources (surtout mémoire) et aura des performances catastrophiques, sans oublier de potentiels plantages (pas assez de mémoire entre autres).

    Il faut donc passer par une sous-requête sur une table temporaire par exemple.

    Dans Oracle la limite des valeurs littérales est très basse (quelques milliers il me semble, si ce n'est moins).
    Mais à nouveau, passer par une sous-select qui tape dans une table temporaire ne pose aucun problème.

    Quand le IN porte sur un sous-select, la requête est réécrite sous forme de jointure.

    Sinon, tu veux faire quoi au juste avec ton IN ?

    C'est pas plutôt un UNION que tu cherches à faire (n'oublie pas le ALL dans ce cas, sous réserve de performances très dégradées sur de gros volumes).
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut
    Il s'agit pour moi de consolider une nouvelle table avec de nouvelles données liées à mes identifiants. l'idée est donc de réaliser des jointures à partir de cet identifiant pour récupérer des données. (et j'ai 1.8M de données => pour 3 à 5 jointures à réaliser...

    Le but : créer une table d'entrée avec ces données

    Pour résumer : j'ai une liste en entrée d'identifiants ( que je ne peux pas reproduire ) pour aller chercher un certain nombre de données liées à ces identifiants dans d'autres tables. Consolider ma table.

    Je vais gratter un peu ce que vous m'avez donné comme information mais non pas d'UNION

    PS : En plus, je suis cantonné à du SQL-VIEW => -500 occurences dans mon IN ...

    Ou alors est-il possible de créer une "automatisation" pour créer les requêtes sur un nombre d'occurences définies ? la lune *.*

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 155
    Points : 7 404
    Points
    7 404
    Billets dans le blog
    1
    Par défaut
    Créez une table temporaire (ou physique si votre SGBD ne le supporte pas) contenant l'ensemble de vos ID.
    Vous pouvez alors faire une simple jointure dessus, et vous n'aurez plus de souci de IN volumineux.
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Oracle n'est pas limité dans utilisation de IN
    car on peut faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from la_table
    where le_champ IN (select le_champ_prime from autre_table)
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 155
    Points : 7 404
    Points
    7 404
    Billets dans le blog
    1
    Par défaut
    Ben comme j'ai déjà dit, ça dépend de ce qu'on entends par "IN" :
    - Littéral : where id in (1, 2, 3, 4) qui est TRES limité chez Oracle (quelques milliers tout au plus)
    - Sous-requête : where id in (select id from ...) qui est illimité

    Notre ami a une liste de valeurs littérales.
    Il est donc bloqué par Oracle.

    Et la seule solution, c'est de passer par une table temporaire pour remplacer les valeurs littérales par une sous-requête sur la table temporaire.
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    @Nikimizi , envoyez un jeu de données et je concrétiserai votre besoin.

    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/05/2008, 08h05
  2. Réponses: 4
    Dernier message: 09/09/2006, 10h18
  3. un nombre limité de feuilles dans un MDI
    Par elasfer dans le forum MFC
    Réponses: 1
    Dernier message: 14/02/2006, 08h43
  4. [AS] Nombre d'occurences dans une string
    Par frol dans le forum Flash
    Réponses: 3
    Dernier message: 26/12/2005, 15h13
  5. recherche du nombre d'occurences dans une table
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/01/2004, 20h03

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