2017-11-29 3 views
0

Meine Anforderung besteht darin, Daten aus der DB2-Tabelle auszuwählen, in der die Telefonnummer gleich 16 Telefonnummern ist. Ich habe versucht, diese Abfrage auf meinen lokalen Testdaten auszuführen, und mein Programm funktioniert erfolgreich! Aber wenn ich versuche, das gleiche Programm auf realen Tisch (Backup-Tabelle) zu laufen, wird mein RUN jcl mit S722 am Ende fehlgeschlagen.Wie funktioniert 'IN' in db2 SQL-Abfrage?

Ich glaube, es ist nicht Platz ab, weil wir Datei mit Attributen von 7 Zylindern (1 primären, 6 sekundären) verwenden. Nach meinen Recherchen fand ich heraus, dass die SQL-Abfrage mit 'IN,' LIKE 'zu viel Zeit in Anspruch nimmt, um den geänderten Time-Parameter in Jobcard zu NOLIMIT auszuführen. Aber Noluck !!

Kann mir jemand mit einer anderen Möglichkeit helfen, diese Abfrage zu schreiben? oder mir helfen, dieses Problem zu beheben ....

Abfrage wie folgt:

EXEC SQL 
DECLARE WS-CURSOR CURSOR WITH HOLD FOR 
SELECT CUST_ID,CUST_NAME,SEQ_NUM,PHONE_NUM FROM PHONE_TAB 
    WHERE PHONE_NUM IN ('123456789','789456123','456789123','789456123' etc) AND 
     PHONE_TYPE = 'DU' 
END-EXEC. 

Vielen Dank im Voraus !!

+0

Wie sieht dein 'FETCH' aus? Der Grund, warum ich frage, ist, dass der Fehler nicht auf der Deklaration steht, die nicht ausführbar ist, und S722 könnte ein Array-Größenproblem sein. – jmarkmurphy

+0

Was ist die Definition der Spalten PHONE_NUM und PHONE_TYPE? – cschneid

+0

Verwenden Sie JOBPARM LINES = 999999. Dadurch sollten Sie alle Zeilen in der Ausgabe schreiben können. Übrigens, wie viele Ausgangsdatensätze erwarten Sie? Und ich glaube, Phone_type sollte in Anführungszeichen als 'DU' stehen. – user6542823

Antwort

2

Die Sx22-Familie der Abneigungen zeigt an, dass einige systemdefinierte Parameter überschritten wurden. Ein S322 zeigt in der Regel an, dass Sie beispielsweise den Wert für die CPU-Zeit im Parameter TIME auf Ihrer Jobkarte oder in Ihrem Jobschritt überschritten haben.

Ein S722-Abbruch zeigt an, dass Sie mehr Spool-Output produziert haben, als von den JES-Parametern Ihres Shops erlaubt wird. Sie müssen die Quelle dieser Spool-Ausgabe ermitteln, um den Abbruch zu beheben.

Möglicherweise verfügen Sie über einen Kernspeicherauszug (CEEDUMP), Debugging-Ausgabe, die Sie codiert haben (SYSOUT oder SYSPRINT oder STDOUT oder STDERR), oder einen unkontrollierten Bericht DD, den Sie codiert haben. Die JESMSGLG-DD, die in der Spool-Datei entweder am oberen Rand Ihrer Ausgabe in SDSF angezeigt wird, oder indem Sie Ihren Job mit einem '?' kann Fehler vorher an die S722 melden.

Vielleicht haben Sie eine S322, die führt zu der S722. Dies ist durchaus möglich, da das Problem bei einer großen Datenmenge auftritt.

Die Einstellung des Zeitparameters auf NOLIMIT ist ein teures Debugging-Verfahren, da die meisten Mainframe-Shops einen Chargeback-Algorithmus haben, typischerweise CPU-Zeit = Geld in jemandes Budget. In Ihrem Shop ist möglicherweise ein JES-Exit vorhanden, der NOLIMIT durch einen anderen Wert ersetzt, um dessen Verwendung zu verhindern.

Wie von user6542823 angezeigt, könnten Sie eine JOBPARM LINES = eine große Zahl hinzufügen, um den S722 zu umgehen, aber Sie müssen immer noch das zugrunde liegende Problem lösen.

z/OS versucht, Ihnen so viele Informationen wie möglich zum Debuggen zu geben. Nutze, was es dir gibt.

Gegeben ...

  • Sie haben gesagt, Ihr Programm mit lokalen Testdaten in Ordnung führt
  • das Problem manifestiert, wenn gegen eine Sicherung der Produktion große Daten

... dann wenn läuft ... in der Sicherung und die Produktionsdaten

  • die Definition der Tabelle PHONE_TAB in Ihren lokalen Testdaten übereinstimmt, dass
  • Ihr Programm bindet erfolgreich
  • Sie die Berechtigung haben die Backup-Daten

... das Problem ist wahrscheinlich nicht mit Ihrem SQL, sondern bezogen auf das Volumen der Daten zu lesen.

Schauen Sie sich die EXPLAIN-Ausgabe für Ihr Paket an und Sie werden wahrscheinlich sehen, dass Sie die gesamte PHONE_TAB-Tabelle scannen. Vielleicht gibt es in der Produktion einen Index, der in der Sicherung, gegen die Sie testen, fehlt.

0

Hier ist ein Inline-Join-Tabelle stattdessen eine, wo in Klausel

IRL tun würde ich die Werte in eine temporäre Tabelle setzen und auf die temporäre Tabelle verbinden. Aber ich habe das zum Beispiel inline gemacht.

SELECT CUST_ID,CUST_NAME,SEQ_NUM,PHONE_NUM FROM PHONE_TAB 

join (
values('123456789'),('789456123'),('456789123'),('789456123') 
) as b (ph) on phone_num = ph 

where PHONE_TYPE = DU 

Zwei Tabellenabfrage könnte schnellst schwer für mich zu sagen, aber es ist auf jeden Fall einfacher zwei Tabellen als ein Programm zu halten, dass jedes Mal, es läuft eine SQL-Anweisung erstellt.

SELECT CUST_ID,CUST_NAME,SEQ_NUM,PHONE_NUM FROM PHONE_TAB 

join look_tab b on phone_num = b.ph 

where PHONE_TYPE = DU 
+0

.... gibt es einen merklichen Leistungsunterschied dafür? Ich hätte (naiv) angenommen, dass der Optimierer sie alle in einen In-Memory-Lookup irgendeiner Art umwandelt, dass der Plan identisch sein sollte. –

+0

IRL In Real Lifel hätte ich zwei Tabellen, die phone_tab und eine look_tab. Look_tab wird nur mit dem Telefon # gefüllt, nach dem ich suche, dann würde ich die Abfrage ausführen und die Indexer-Empfehlungen überprüfen. Mit zwei Tabellen wissen Sie, dass Sie immer eine optimierte Abfrage haben und sich nicht mit den Details befassen müssen, mit denen Sie jedes Mal, wenn Sie die Abfrage ausführen, eine Textanweisung erstellen. Ich würde definitiv mit zwei Tabellen schneller sein, weil Sie die empfohlenen Indizes und so verwenden würden. – danny117

+0

.... außer das gilt wahrscheinlich nicht, wenn Sie eine kleine temporäre Tabelle verwenden. Ein Index stellt einen Kompromiss von Raum für (weniger) Zeit dar und hat vor allem noch Kosten. Optimierer ignorieren Indizes, von denen sie nicht glauben, dass sie einen ausreichenden Nutzen bieten. Wenn Ihre Tabelle (oder die temporäre Ergebnismenge) klein genug ist, wird sie vom Optimierer in eine Arbeitsmappe im Arbeitsspeicher gesplittet und ignoriert die Indizes, die Sie deklariert haben (obwohl sie für bestimmte Statistiken nützlich sein können). Dies ignoriert auch die Kosten für mehrere Fahrten zur Datenbank (für die Einfügung) und die Aufrechterhaltung des Index. –