Laden Sie alle Postleitzahlen in der Datenbank in eine Liste. Und in der Benutzerliste der eingefügten Zip-Codes machen Sie %code% .
Problem gelöst!
In meiner Datenbank habe ich eine zip
Tabelle mit einer code
Spalte. Der Benutzer kann eine Liste von Postleitzahlen hochladen und ich muss herausfinden, welche bereits in der Datenbank sind. Derzeit verwende ich die folgende Hibernate-Abfrage (HQL):
Der Wert des Parameters :zipCodes
ist die Liste der vom Benutzer hochgeladenen Codes. In der Version von Hibernate, die ich verwende, gibt es jedoch einen Fehler , der die Größe solcher Listenparameter begrenzt Gelegenheiten überschreiten wir diese Grenze.
Ich muss also einen anderen Weg finden, um herauszufinden, welche der (möglicherweise sehr langen) Postleitzahlen bereits in der Datenbank sind. Hier sind einige Optionen, die ich in Betracht gezogen habe
Schreiben Sie die Abfrage mit SQL statt mit HQL neu. Während dies den Hibernate-Fehler vermeiden wird, vermute ich, dass die Leistung schrecklich sein wird, wenn 30.000 Postleitzahlen vorhanden sind, die überprüft werden müssen.
Teilen Sie die Liste der Postleitzahlen in eine Reihe von Unterlisten auf und führen Sie eine separate Abfrage für jede Unterliste aus. Auch dies wird den Hibernate-Fehler vermeiden, aber die Leistung wird wahrscheinlich immer noch schrecklich sein
Verwenden Sie eine temporäre Tabelle, d. h. fügen Sie die zu prüfenden Postleitzahlen in eine temporäre Tabelle ein, und verbinden Sie diese mit der Tabelle zip
. Es scheint, dass der abfragende Teil dieser Lösung einigermaßen gut funktionieren sollte, aber das Erstellen der temporären Tabelle und das Einfügen von bis zu 30.000 Zeilen wird nicht funktionieren. Aber vielleicht gehe ich nicht den richtigen Weg, hier ist, was ich im Pseudo-Java-Code im Sinn hatte
Gibt es einen effizienteren Weg, dies zu implementieren als im obigen Pseudo-Code, oder gibt es eine andere Lösung, an die ich nicht gedacht habe? Ich benutze eine Postgres-Datenbank.
Option D:
Laden Sie alle vorhandenen Postleitzahlen aus der Datenbank (Paginierung?) Und machen Sie den Vergleich in Ihrer Anwendung.
Was Ihre Option A betrifft:
Ich erinnere mich an eine Beschränkung der SQL-Abfrage Länge, aber das war auf DB2, ich weiß nicht, ob es eine Beschränkung für PostgreSQL gibt.
In meiner Datenbank habe ich eine removeAll(databaseList)
Tabelle mit einer %code% Spalte. Der Benutzer kann eine Liste von Postleitzahlen hochladen und ich muss herausfinden, welche bereits in der Datenbank sind. Derzeit verwende ich die folgende Hibernate-Abfrage (HQL):
Der Wert des Parameters %code% ist die Liste der vom Benutzer hochgeladenen Codes. In der Version von Hibernate, die ich verwende, gibt es jedoch einen Fehler , der die Größe solcher Listenparameter begrenzt Gelegenheiten überschreiten wir diese Grenze.
Ich muss also einen anderen Weg finden, um herauszufinden, welche der (möglicherweise sehr langen) Postleitzahlen bereits in der Datenbank sind. Hier sind einige Optionen, die ich in Betracht gezogen habe
Schreiben Sie die Abfrage mit SQL statt mit HQL neu. Während dies den Hibernate-Fehler vermeiden wird, vermute ich, dass die Leistung schrecklich sein wird, wenn 30.000 Postleitzahlen vorhanden sind, die überprüft werden müssen.
Teilen Sie die Liste der Postleitzahlen in eine Reihe von Unterlisten auf und führen Sie eine separate Abfrage für jede Unterliste aus. Auch dies wird den Hibernate-Fehler vermeiden, aber die Leistung wird wahrscheinlich immer noch schrecklich sein
Verwenden Sie eine temporäre Tabelle, d. h. fügen Sie die zu prüfenden Postleitzahlen in eine temporäre Tabelle ein, und verbinden Sie diese mit der Tabelle %code% . Es scheint, dass der abfragende Teil dieser Lösung einigermaßen gut funktionieren sollte, aber das Erstellen der temporären Tabelle und das Einfügen von bis zu 30.000 Zeilen wird nicht funktionieren. Aber vielleicht gehe ich nicht den richtigen Weg, hier ist, was ich im Pseudo-Java-Code im Sinn hatte
%Vor%Gibt es einen effizienteren Weg, dies zu implementieren als im obigen Pseudo-Code, oder gibt es eine andere Lösung, an die ich nicht gedacht habe? Ich benutze eine Postgres-Datenbank.
Haben Sie versucht, Unterabfragen IN zu verwenden?
wäre so etwas
%Vor%sry, wenn ich den Code irreführe, es dauert eine Weile, da ich Hibernate nicht verwende
Es gibt ungefähr 45'000 Postleitzahlen in den USA und die scheinen auf dem neuesten Stand zu sein. Wenn dies ein jährlicher Job ist, schreib es nicht in Java. Erstellen Sie ein SQL-Skript, das die Postleitzahlen in eine neue Tabelle lädt und eine Insert-Anweisung mit
schreibt%code%
Lassen Sie Ihre Mitarbeiter dieses zwei Zeilen umfassende SQL-Skript einmal pro Jahr ausführen und kaufen Sie sich das nicht im Java-Code. Plus, wenn Sie dies aus Java heraushalten, können Sie grundsätzlich jede Annäherung angehen, weil es niemanden interessiert, ob das für 30 Minuten in Offpeak-Zeiten läuft.
teile und imperra
Laden Sie alle Postleitzahlen in der Datenbank in eine Liste. Und in der Benutzerliste der eingefügten Zip-Codes machen Sie %code% .
Problem gelöst!
Angenommen, Sie validieren 1000 Codes gegen eine Tabelle von 100000 Datensätzen, in denen der Code der Primärschlüssel ist und einen Clustered-Index hat.
Option C (Erstellen einer temporären Tabelle, Ausgabe von 1000 INSERT-Anweisungen und Verbinden von 1000 Zeilen mit 100000 in einem einzigen SELECT) ist nicht wettbewerbsfähig mit der Ausgabe von 1000 einfachen und indexfreundlichen Abfragen für jeweils einen einzelnen neuen Code:
SELECT COUNT (*) Von Zip WHERE Zip.code =: neuerCode
Angenommen, Sie validieren 1000 Codes gegen eine Tabelle von 100000 Datensätzen, in denen der Code der Primärschlüssel ist und einen Clustered-Index hat.
Option C (Erstellen einer temporären Tabelle, Ausgabe von 1000 INSERT-Anweisungen und Verbinden von 1000 Zeilen mit 100000 in einem einzigen SELECT) ist nicht wettbewerbsfähig mit der Ausgabe von 1000 einfachen und indexfreundlichen Abfragen für jeweils einen einzelnen neuen Code:
SELECT COUNT (*) Von Zip WHERE Zip.code =: neuerCode
Option D:
Laden Sie alle vorhandenen Postleitzahlen aus der Datenbank (Paginierung?) Und machen Sie den Vergleich in Ihrer Anwendung.
Was Ihre Option A betrifft:
Ich erinnere mich an eine Beschränkung der SQL-Abfrage Länge, aber das war auf DB2, ich weiß nicht, ob es eine Beschränkung für PostgreSQL gibt.
Es gibt ungefähr 45'000 Postleitzahlen in den USA und die scheinen auf dem neuesten Stand zu sein. Wenn dies ein jährlicher Job ist, schreib es nicht in Java. Erstellen Sie ein SQL-Skript, das die Postleitzahlen in eine neue Tabelle lädt und eine Insert-Anweisung mit
schreibt insert XXX into zip where zip.code not in (select code from ziptemp)
Lassen Sie Ihre Mitarbeiter dieses zwei Zeilen umfassende SQL-Skript einmal pro Jahr ausführen und kaufen Sie sich das nicht im Java-Code. Plus, wenn Sie dies aus Java heraushalten, können Sie grundsätzlich jede Annäherung angehen, weil es niemanden interessiert, ob das für 30 Minuten in Offpeak-Zeiten läuft.
teile und imperra
Tags und Links sql java hibernate postgresql