cbe
01-06-11, 08:08
Hallo liebe SQL-Spezialisten,
ein Kollege hat eine nette Funktion programmiert, das aus 3 numerischen Feldern für JJJJ, MM, TT ein Zeichenfeld im ISO-Format macht. Also z.B. JMT2DATE(2011, 4, 1) würde '2011-04-01' liefern.
Das funktioniert auch prima, nur die Laufzeit ist katastrophal schlecht.
with x as (select JMT2DATE(TSL10J, TSL10M, TSL10T) from SSLTST)
select count(*) from x
braucht für 100000 Sätze ca 1 Minute, während
with x as (select digits(TSL10J) concat '-' concat digits(TSL10M) concat '-' concat TSL10T from SSLTST)
select count(*) from x
deutlich unter 1 Sekunde benötigt!
(Das "with x as ..." habe ich nur eingebaut, um die Laufzeit prüfen zu können)
Haben Funktionen so einen Overhead, oder ist die vielleicht nur ungeschickt programmiert?
Vieleicht könnt Ihr mal einen Blick auf die Funktion werfen:
CREATE FUNCTION MHK/JMT2DATE(p_JJ dec(4, 0),
p_MM dec(2, 0),
p_TT dec(2, 0))
RETURNS CHAR(10)
LANGUAGE SQL
SPECIFIC JMT2DATE1
func1_lab:
BEGIN
DECLARE s_date CHAR(10);
DECLARE InvalidDate CONDITION FOR '22007';
DECLARE EXIT HANDLER FOR InvalidDate
BEGIN
RETURN '1900-01-01';
END;
IF p_JJ IS NULL OR p_jj = 0 THEN
RETURN '1900-01-01';
END IF;
IF p_JJ < 50 THEN
SET p_JJ = 2000 + p_JJ;
END IF;
IF p_JJ < 100 THEN
SET p_JJ = 1900 + p_JJ;
END IF;
SET s_date = trim(char(p_JJ)) concat '-'
concat trim(char(p_MM)) concat '-'
concat trim(char(p_TT)) ;
RETURN s_date;
END
drop specific function mhk/JMT2DATE2
CREATE FUNCTION MHK/JMT2DATE(p_JJ INTEGER,
p_MM INTEGER,
p_TT INTEGER )
RETURNS CHAR(10)
LANGUAGE SQL
SPECIFIC JMT2DATE2
func2_lab:
BEGIN
DECLARE s_date CHAR(10);
DECLARE InvalidDate CONDITION FOR '22007';
DECLARE EXIT HANDLER FOR InvalidDate
BEGIN
RETURN '1900-01-01';
END;
IF p_JJ IS NULL OR p_jj = 0 THEN
RETURN '1900-01-01';
END IF;
IF p_JJ < 50 THEN
SET p_JJ = 2000 + p_JJ;
END IF;
IF p_JJ < 100 THEN
SET p_JJ = 1900 + p_JJ;
END IF;
SET s_date = trim(char(p_JJ)) concat '-'
concat trim(char(p_MM)) concat '-'
concat trim(char(p_TT)) ;
RETURN s_date;
END
drop specific function mhk/JMT2DATE3
CREATE FUNCTION MHK/JMT2DATE(p_Date INTEGER)
RETURNS CHAR(10)
LANGUAGE SQL
SPECIFIC JMT2DATE3
func3_lab:
BEGIN
DECLARE s_date CHAR(10);
DECLARE InvalidDate CONDITION FOR '22007';
DECLARE EXIT HANDLER FOR InvalidDate
BEGIN
RETURN '1900-01-01';
END;
IF p_Date IS NULL OR p_Date = 0 THEN
RETURN '1900-01-01';
END IF;
SET s_date = substr(digits(p_Date), 1, 4) concat '-' concat
substr(digits(p_Date), 5, 2) concat '-' concat
substr(digits(p_Date), 7, 2);
RETURN s_date;
END
drop specific function mhk/JMT2DATE4
CREATE FUNCTION MHK/JMT2DATE(p_Date decimal(8, 0) )
RETURNS CHAR(10)
LANGUAGE SQL
SPECIFIC JMT2DATE4
func3_lab:
BEGIN
DECLARE s_date CHAR(10);
DECLARE InvalidDate CONDITION FOR '22007';
DECLARE EXIT HANDLER FOR InvalidDate
BEGIN
RETURN '1900-01-01';
END;
IF p_Date IS NULL OR p_Date = 0 THEN
RETURN '1900-01-01';
END IF;
SET s_date = substr(digits(p_Date), 1, 4) concat '-' concat
substr(digits(p_Date), 5, 2) concat '-' concat
substr(digits(p_Date), 7, 2);
RETURN s_date;
END
Fällt Euch dazu was ein?
Mit Funktion ist es schon besser lesbar, aber so arg die Laufzeit strapazieren darf es auch nicht.
Gruß,
Christian
ein Kollege hat eine nette Funktion programmiert, das aus 3 numerischen Feldern für JJJJ, MM, TT ein Zeichenfeld im ISO-Format macht. Also z.B. JMT2DATE(2011, 4, 1) würde '2011-04-01' liefern.
Das funktioniert auch prima, nur die Laufzeit ist katastrophal schlecht.
with x as (select JMT2DATE(TSL10J, TSL10M, TSL10T) from SSLTST)
select count(*) from x
braucht für 100000 Sätze ca 1 Minute, während
with x as (select digits(TSL10J) concat '-' concat digits(TSL10M) concat '-' concat TSL10T from SSLTST)
select count(*) from x
deutlich unter 1 Sekunde benötigt!
(Das "with x as ..." habe ich nur eingebaut, um die Laufzeit prüfen zu können)
Haben Funktionen so einen Overhead, oder ist die vielleicht nur ungeschickt programmiert?
Vieleicht könnt Ihr mal einen Blick auf die Funktion werfen:
CREATE FUNCTION MHK/JMT2DATE(p_JJ dec(4, 0),
p_MM dec(2, 0),
p_TT dec(2, 0))
RETURNS CHAR(10)
LANGUAGE SQL
SPECIFIC JMT2DATE1
func1_lab:
BEGIN
DECLARE s_date CHAR(10);
DECLARE InvalidDate CONDITION FOR '22007';
DECLARE EXIT HANDLER FOR InvalidDate
BEGIN
RETURN '1900-01-01';
END;
IF p_JJ IS NULL OR p_jj = 0 THEN
RETURN '1900-01-01';
END IF;
IF p_JJ < 50 THEN
SET p_JJ = 2000 + p_JJ;
END IF;
IF p_JJ < 100 THEN
SET p_JJ = 1900 + p_JJ;
END IF;
SET s_date = trim(char(p_JJ)) concat '-'
concat trim(char(p_MM)) concat '-'
concat trim(char(p_TT)) ;
RETURN s_date;
END
drop specific function mhk/JMT2DATE2
CREATE FUNCTION MHK/JMT2DATE(p_JJ INTEGER,
p_MM INTEGER,
p_TT INTEGER )
RETURNS CHAR(10)
LANGUAGE SQL
SPECIFIC JMT2DATE2
func2_lab:
BEGIN
DECLARE s_date CHAR(10);
DECLARE InvalidDate CONDITION FOR '22007';
DECLARE EXIT HANDLER FOR InvalidDate
BEGIN
RETURN '1900-01-01';
END;
IF p_JJ IS NULL OR p_jj = 0 THEN
RETURN '1900-01-01';
END IF;
IF p_JJ < 50 THEN
SET p_JJ = 2000 + p_JJ;
END IF;
IF p_JJ < 100 THEN
SET p_JJ = 1900 + p_JJ;
END IF;
SET s_date = trim(char(p_JJ)) concat '-'
concat trim(char(p_MM)) concat '-'
concat trim(char(p_TT)) ;
RETURN s_date;
END
drop specific function mhk/JMT2DATE3
CREATE FUNCTION MHK/JMT2DATE(p_Date INTEGER)
RETURNS CHAR(10)
LANGUAGE SQL
SPECIFIC JMT2DATE3
func3_lab:
BEGIN
DECLARE s_date CHAR(10);
DECLARE InvalidDate CONDITION FOR '22007';
DECLARE EXIT HANDLER FOR InvalidDate
BEGIN
RETURN '1900-01-01';
END;
IF p_Date IS NULL OR p_Date = 0 THEN
RETURN '1900-01-01';
END IF;
SET s_date = substr(digits(p_Date), 1, 4) concat '-' concat
substr(digits(p_Date), 5, 2) concat '-' concat
substr(digits(p_Date), 7, 2);
RETURN s_date;
END
drop specific function mhk/JMT2DATE4
CREATE FUNCTION MHK/JMT2DATE(p_Date decimal(8, 0) )
RETURNS CHAR(10)
LANGUAGE SQL
SPECIFIC JMT2DATE4
func3_lab:
BEGIN
DECLARE s_date CHAR(10);
DECLARE InvalidDate CONDITION FOR '22007';
DECLARE EXIT HANDLER FOR InvalidDate
BEGIN
RETURN '1900-01-01';
END;
IF p_Date IS NULL OR p_Date = 0 THEN
RETURN '1900-01-01';
END IF;
SET s_date = substr(digits(p_Date), 1, 4) concat '-' concat
substr(digits(p_Date), 5, 2) concat '-' concat
substr(digits(p_Date), 7, 2);
RETURN s_date;
END
Fällt Euch dazu was ein?
Mit Funktion ist es schon besser lesbar, aber so arg die Laufzeit strapazieren darf es auch nicht.
Gruß,
Christian