• Keine Ergebnisse gefunden

2 Highlights aus SQL

N/A
N/A
Protected

Academic year: 2022

Aktie "2 Highlights aus SQL"

Copied!
28
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

ROWSET

FIRST FIRST ROW

2 Highlights aus SQL

(2)

Eine Vorstellung im Hause

im

März 2009

(3)

Inhalt

• SQL-Code – ROWSET

• SQL-Code – SELECT ... FETCH FIRST ROW

(4)

SQL-Code – ROWSET

Was ist ROWSET-Verarbeitung?

• statt 1 Zeile werden n Zeilen an DB2 übergeben

• unterschiedliche Begriffe

– ROWSET-Verarbeitung

– multi-row-Verarbeitung / multiple-row

• benutzbar bei

– Cursorverarbeitung (multi-row FETCH) – insert (multi-row INSERT)

– merge (multi-row MERGE)

• gibt es übrigens nicht erst seit DB2-V9

(5)

SQL-Code – ROWSET

Warum ROWSET-Verarbeitung?

• klarer Performancevorteil

• jeder SQL heißt: Adressraumwechsel

(6)

SQL-Code – ROWSET

Testkonstellation – nur mit FETCH

• DB2-Tabelle aus MFF (Flotte)

– SYSIBM klappte nicht 

• Testprogramme in PL1 und COBOL

• Anzahl zu lesender Zeilen via JCL übergeben

• Anzahl Loops via JCL übergeben

(7)

SQL-Code – ROWSET

Cursor-Declare – ohne ROWSET

/* Declare Cursor "normal" Index-Only */

EXEC SQL DECLARE C_N_I CURSOR FOR

SELECT FK_POL_NR , FK_OFFERT_VAR , DN_ENTITY_ID_ATTTY , GUELTIG_AB , VERSION , GUELTIG_BIS , TYP_WERT_DATUM FROM UFLO_UTEXAZU

FOR FETCH ONLY WITH UR

(8)

SQL-Code – ROWSET

Cursor-Declare – mit ROWSET

/* Declare Cursor "multi-row-fetch" Index-Only */

EXEC SQL DECLARE C_M_I CURSOR WITH ROWSET POSITIONING FOR SELECT FK_POL_NR , FK_OFFERT_VAR , DN_ENTITY_ID_ATTTY , GUELTIG_AB , VERSION , GUELTIG_BIS , TYP_WERT_DATUM FROM UFLO_UTEXAZU FOR FETCH ONLY WITH UR

(9)

SQL-Code – ROWSET

Cursor-Fetch – ohne ROWSET

EXEC SQL

FETCH C_N_I

INTO :DB-FELDER-N.FK-POL-NR , :DB-FELDER-N.FK-OFFERT-VAR , :DB-FELDER-N.DN-ENTITY-ID-ATTTY , :DB-FELDER-N.GUELTIG-AB , :DB-FELDER-N.VERSION , :DB-FELDER-N.GUELTIG-BIS , :DB-FELDER-N.TYP-WERT-DATUM :DB-FELDER-N.TYP-WERT-DATUM-IND

;

(10)

SQL-Code – ROWSET

Cursor-Fetch – mit ROWSET

EXEC SQL

FETCH NEXT ROWSET C_M_I

FOR :I-FETCH-MAX ROWS INTO :DB-FELDER-M.FK-POL-NR , :DB-FELDER-M.FK-OFFERT-VAR , :DB-FELDER-M.DN-ENTITY-ID-ATTTY , :DB-FELDER-M.GUELTIG-AB , :DB-FELDER-M.VERSION , :DB-FELDER-M.GUELTIG-BIS , :DB-FELDER-M.TYP-WERT-DATUM :DB-FELDER-M.TYP-WERT-DATUM-IND

;

(11)

SQL-Code – ROWSET

Felddefinitionen – ohne ROWSET

DCL 01 DB_FELDER_N,

05 EX_ATTRIBUT_ZUT_ID FIXED BIN(31), 05 FK_POL_NR FIXED BIN(31), 05 FK_OFFERT_VAR FIXED BIN(15), 05 DN_ENTITY_ID_ATTTY FIXED BIN(31), 05 GUELTIG_AB CHAR(10),

05 VERSION FIXED BIN(15), 05 GUELTIG_BIS CHAR(10),

05 TYP_WERT_DATUM CHAR(10),

05 TYP_WERT_DATUM_IND FIXED BIN(15);

(12)

SQL-Code – ROWSET

Felddefinitionen – mit ROWSET

DCL 01 DB_FELDER_M,

05 EX_ATTRIBUT_ZUT_ID (1000) FIXED BIN(31), 05 FK_POL_NR (1000) FIXED BIN(31), 05 FK_OFFERT_VAR (1000) FIXED BIN(15), 05 DN_ENTITY_ID_ATTTY (1000) FIXED BIN(31), 05 GUELTIG_AB (1000) CHAR(10) , 05 VERSION (1000) FIXED BIN(15), 05 GUELTIG_BIS (1000) CHAR(10) , 05 TYP_WERT_DATUM (1000) CHAR(10) , 05 TYP_WERT_DATUM_IND (1000) FIXED BIN(15);

(13)

SQL-Code – ROWSET

Testvorgehensweise

• Test mit „normalem“ Fetch

• Test mit multiple-row-Fetch 1 Zeile

• Test mit multiple-row-Fetch 2 Zeilen

• Test mit multiple-row-Fetch 5 Zeilen

• ... 10, 20, 50, 100, 200, 500, 1000

• unterschiedliche Anzahl Zugriffe

• Loop über die Zugriffe

(14)

SQL-Code – ROWSET

Ergebnisse

5,00 10,00 15,00 20,00 25,00 30,00 35,00

CPU-Zeiten

ROW 1 ROWSET 1 ROWSET 2 ROWSET 5 ROWSET 10 ROWSET 20 ROWSET 50 ROWSET 100 ROWSET 200 ROWSET 500 ROWSET 1000

(15)

SQL-Code – ROWSET

Fazit

• ROWSET-Verarbeitung sichtbar effektiver,

• aber nur, wenn mindestens 2 Zeilen gelsen werden.

• Es lohnt sich, darüber nachzudenken, dass und

wann mit ROWSET gearbeitet werden sollte.

(16)

SQL-Code – ROWSET

Programme

• vollständige Testprogramme stehen unter SDE

• Kopien (auch JCL unter X016291.#.DB2V9.SRC)

• PL1-Version: U442RLF

• COBOL-Version: U441RLF

(17)

Inhalt

• SQL-Code – ROWSET

• SQL-Code – SELECT ... FETCH FIRST ROW

(18)

SQL-Code – SELECT ... FETCH FIRST ROW

Was ist „FETCH FIRST ROW“ und Warum braucht man das?

• „normaler“ SELECT liest immer nach

• Falls weitere Zeile vorhanden: -811 / 21000

• Wenn ich aber genau die erste Zeile brauche?

• Üblich ist, stets mit Cursor zu arbeiten.

• Ergebnis: 1 Addressraumwechsel

• Warum nicht anders? Geht es anders?

(19)

SQL-Code – SELECT ... FETCH FIRST ROW

SQL normal

EXEC SQL SELECT

FK_POL_NR

, FK_OFFERT_VAR

, DN_ENTITY_ID_ATTTY , GUELTIG_AB

, VERSION . . .

INTO

:DB_FELDER_N.FK_POL_NR , :DB_FELDER_N.FK_OFFERT_VAR

, :DB_FELDER_N.DN_ENTITY_ID_ATTTY , :DB_FELDER_N.GUELTIG_AB

, :DB_FELDER_N.VERSION . . .

FROM UFLO_UTEXAZU

WHERE FK_POL_NR = 2000101

(20)

SQL-Code – SELECT ... FETCH FIRST ROW

Cursor-Verarbeitung – 1

EXEC SQL

DECLARE C_N_I CURSOR FOR SELECT

FK_POL_NR

, FK_OFFERT_VAR

, DN_ENTITY_ID_ATTTY , GUELTIG_AB

, VERSION . . .

FROM UFLO_UTEXAZU

WHERE FK_POL_NR = 2000101 FOR FETCH ONLY

WITH UR

;

(21)

SQL-Code – SELECT ... FETCH FIRST ROW

Cursor-Verarbeitung – 2

. . .

EXEC SQL OPEN C_N_I;

. . .

EXEC SQL FETCH C_N_I INTO

:DB_FELDER_N.FK_POL_NR

, :DB_FELDER_N.FK_OFFERT_VAR

, :DB_FELDER_N.DN_ENTITY_ID_ATTTY , :DB_FELDER_N.GUELTIG_AB

, :DB_FELDER_N.VERSION . . .

; . . .

EXEC SQL CLOSE C_N_I ; . . .

(22)

SQL-Code – SELECT ... FETCH FIRST ROW

SQL normal (Wdh.)

EXEC SQL SELECT

FK_POL_NR

, FK_OFFERT_VAR

, DN_ENTITY_ID_ATTTY , GUELTIG_AB

, VERSION . . .

INTO

:DB_FELDER_N.FK_POL_NR , :DB_FELDER_N.FK_OFFERT_VAR

, :DB_FELDER_N.DN_ENTITY_ID_ATTTY , :DB_FELDER_N.GUELTIG_AB

, :DB_FELDER_N.VERSION . . .

FROM UFLO_UTEXAZU

WHERE FK_POL_NR = 2000101

(23)

SQL-Code – SELECT ... FETCH FIRST ROW

SQL mit FETCH FIRST ROW

EXEC SQL SELECT

FK_POL_NR

, FK_OFFERT_VAR

, DN_ENTITY_ID_ATTTY , GUELTIG_AB

, VERSION . . .

INTO

:DB_FELDER_N.FK_POL_NR , :DB_FELDER_N.FK_OFFERT_VAR

, :DB_FELDER_N.DN_ENTITY_ID_ATTTY , :DB_FELDER_N.GUELTIG_AB

, :DB_FELDER_N.VERSION . . .

FROM UFLO_UTEXAZU

WHERE FK_POL_NR = 2000101

(24)

SQL-Code – SELECT ... FETCH FIRST ROW

Testvorgehensweise

• Test mit „normalem“ Fetch

• Test mit multiple-row-Fetch 1 Zeile

• unterschiedliche Anzahl Zugriffe

• ...100, 1‘000, 10‘000, 100‘000

• Loop über die Zugriffe

(25)

SQL-Code – SELECT ... FETCH FIRST ROW

Ergebnisse

10,00 20,00 30,00 40,00 50,00 60,00

ROW 1 ROWSET 1 SELECT SEL FIRST

SELECT normal vs. SELECT FETCH FIRST ROW ONLY

(26)

SQL-Code – SELECT ... FETCH FIRST ROW

Fazit

• SELECT mit FETCH FIRST ROW effektiver.

• Es lohnt sich, darüber nachzudenken, dass und wann mit Zusatzangabe gearbeitet werden

sollte.

(27)

SQL-Code – SELECT ... FETCH FIRST ROW

Programme

• vollständige Testprogramme stehen unter SDE

• Kopien (auch JCL unter X016291.#.DB2V9.SRC)

• PL1-Version: U442RLF

• COBOL-Version: U441RLF

(28)

c’est tout

Fragen?

--- Danke!!

Referenzen

ÄHNLICHE DOKUMENTE

Stellungnahme Fraktion Bündnis 90 / DIE GRÜNEN zum Klimaschutzkonzept / Klimaziele Wir begrüßen ausdrücklich, dass die Verwaltung als erstes Ziel die Klimaneutralität für ihr

Ein funda- mentaler Gegensatz zwischen Men- schenrechtspolitik und Realpolitik be- steht nicht, soll sich das Eintreten für die Menschenrechte nicht in Heuche- lei oder reiner

Weil nicht alle Bedingungen erfüllt sind, ist anzunehmen, dass der Bau zumindest noch längere Zeit nicht weitergeführt wird.. Wie kön- nen sich in dieser Zeit die Bevölkerung und

schmerzen treten seltener auf als unter einem Schorf und ein Verkleben mit einer zusätzlich angewendeten mechanischen Schutzbarriere, also einem Pflaster oder einem Verband, ist

§ 45 SGB V besteht der Anspruch auf Vergü- tung für die Dauer von 10 Tagen, und nur wenn das Kind noch keine 12 Jahre alt ist. Außerdem besteht gemäß § 45 SGB V ein Anspruch auf

No  matter  whether  he  was  pleased  or  angry,  Rudolph’s  nose  glowed  in  full  splendor.  His  parents  and  brothers  and  sisters  had  their  fun  with 

Während wir feiern, müssen wir uns daran erinnern, dass diese Geschen- ke zu unserem Vorteil sind und wir die Verantwortung haben, sie nicht nur für unsere heutigen Bedürfnisse

Der Bezirksverband Hamburg-Mitte steht inner- halb der Partei DIE LINKE Hamburg für eine klare Oppositionsorientierung, offensive Friedenspolitik, hintergründige Kritik am