2016-05-19 15 views
0

Ich habe lokale Daten mit IDs aus einer externen Datenbank. Ich möchte dann Daten aus dieser externen Datenbank Wählen Sie die die ID verwenden, so kann ich so etwas wie:Verwenden IN Zustand mit einer großen Anzahl von Elementen

SELECT * FROM table WHERE id IN (:listofids) 

aber ich bemerkt habe (ich bin nicht sicher, ob es ein DB DB-Einstellung oder die Art der DB ist oder was) es kann eine maximale Anzahl von Werten in dieser IN-Anweisung erlaubt sein. Wenn möglich mache ich natürlich WHERE id IN (SELECT id FROM ...) aber manchmal mit externen Daten ist es nicht möglich.

Meine Fragen:

  1. Was neben meiner Möglichkeiten hier sind, was ich in der oben tue?
  2. Sind die Beschränkungen von Max Elemente auf der DB-Ebene, der Typ der DB, was? Im Moment beschäftige ich mich speziell mit einer externen RedShift-Datenbank, aber ich habe mir ihre Dokumente angeschaut und sie erwähnen kein Limit. Unsere lokale DB hat ein Limit von 2100, aber ein anderes, das ich verwende, ist 9999. Sobald die Liste groß wird, kann es langsam werden, also suche ich auch nach einem Leistungsschub.
  3. Sollte ich tun . Das scheint nicht zu glatt zu sein. Sind alle diese Optionen möglich?
  4. Ich habe ein wenig über mögliche Verwendung von temporären Tabellen gelesen, um dies zu tun, aber ohne Beispiele. Wie würde ich Daten in eine temporäre Tabelle laden, um sie dann in die Tabelle aufzunehmen, aus der die Daten stammen sollen?

Antwort

0

Was sind meine Optionen hier neben dem, was ich oben tun?

Sie begrenzt sind - man könnte Kette eine lange Folge von OR id = X Anrufe Sie können jedoch Probleme WESENTLICHE Leistung im Vergleich zu IN haben.

Die beste Option Performance-weise ist die Verbindung zu einer Tabelle (Parameter, temporäre, CTE, Inline UNION oder statische) auf der Serverseite. Dies ist jedoch nicht immer eine Option, abhängig davon, wie Sie Abfragen ausführen und welche Berechtigungen Sie haben.

Natürlich können Sie auch eine separate Abfrage für jeden Wert ausführen, die einfacher zu programmieren wäre, aber auch Leistungsprobleme haben könnte.

Sind die Beschränkungen von max Elemente auf der DB-Ebene, der Typ der DB, was?

Das ist plattformspezifisch, so gibt es keine universelle Antwort

Soll ich in() oder in() oder in(). Das scheint nicht zu glatt zu sein. Sind alle diese Optionen möglich?

Das ist eine Option, die Sie den anderen oben hinzufügen können - Sie müssen es ausprobieren, um zu sehen, welche Auswirkungen die Leistung hat.

Ich habe ein wenig über mögliche Verwendung von temporären Tabellen gelesen, um dies zu tun, aber ohne Beispiele. Wie würde ich Daten in eine temporäre Tabelle laden, um sie dann in die Tabelle aufzunehmen, aus der die Daten stammen sollen?

die auf der Plattform abhängt, Ihre Berechtigungen, Ihre API verfügbar, usw.

+0

Vielen Dank für Ihre Kommentare. Wenn Sie sagen, dass die Max-Elemente plattformspezifisch sind, meinen Sie, dass MSSQL immer maximal 2100, Orakel immer 9999 usw. oder etwas anderes sein wird? – Leeish

+0

möglicherweise - oder das Maximum könnte von der Gesamtgröße (in Zeichen) der Abfrage oder etwas ganz anderes abhängen. –

1

Eine recht einfache Lösung, die temporären Tabellen vermeidet, ist so etwas wie dies zu tun:

SELECT 
    t.* 
FROM 
    [table] t 
    INNER JOIN (
     SELECT 'id1' AS id 
     UNION ALL 
     SELECT 'id2' 
     UNION ALL 
     SELECT 'id3') i ON i.Id = t.Id; 

es ist offensichtlich ein wenig mehr Arbeit eine Unterabfrage mit vielen UNIONs zu schaffen, aber diese erstellt effektiv eine temporäre Tabelle, die Sie verwenden können, ohne sich darum kümmern zu müssen.

Verwandte Themen