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.


Code:
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

Code:
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:

Code:
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