[EMAIL PROTECTED] wrote:
 
> I am really struggling to get some complicated queries to run quicker
> (please see note below too).
> 
> I have a million records in the Metrics table, just one in the Kiosks
> table, and one in the Forms table.
> 
> I then run three queries as follows to generate a report:
> 
> //get the locations for this report
> SELECT DISTINCT Kiosks.Name, UPPER(Kiosks.Name)
> FROM Kiosks INNER JOIN Metrics ON Kiosks.ID=Metrics.Kiosk_Id
> WHERE ExecTime IS NOT NULL AND Copies IS NOT NULL
> ORDER BY UPPER(Kiosks.Name)
> 
> With just one record in the Kiosks table (normally there 
> would be more) I then execute:
> 
> //get data for this/these locations
> SELECT Forms.Title AS Form, SUM(CASE WHEN 
> Kiosks.Name='bodie-macon 2' THEN
> Metrics.Copies ELSE 0 END) AS "bodie-macon 2", 
> SUM(Metrics.Copies) AS Total
> FROM Metrics INNER JOIN Kiosks ON Metrics.Kiosk_Id = 
> Kiosks.Id INNER JOIN
> Forms ON Metrics.Form_Id = Forms.Id
> WHERE ExecTime IS NOT NULL AND Copies IS NOT NULL
> GROUP BY Forms.Title
> ORDER BY UPPER(Forms.Title)
> 
> I then get the totals using:
> 
> SELECT 'Total', SUM(CASE WHEN Kiosks.Name='bodie-macon 2' THEN
> Metrics.Copies ELSE 0 END) AS "bodie-macon 2", 
> SUM(Metrics.Copies) as Total
> FROM Kiosks INNER JOIN Metrics ON Kiosks.ID=Metrics.Kiosk_Id
> WHERE ExecTime IS NOT NULL AND Copies IS NOT NULL
> 
> When I do this, the tempory space used is approximately half 
> a GIG!  And it
> takes about 20 minutes to finish!
> 
> On another highly-controversion-db-at-the-moment it takes 
> about 40 seconds!
> 
> So, what am I doing wrong?  I have indexes where I can put 
> them, I believe,
> and apart from adding extra columns TITLEUPPER and NAMEUPPER 
> I can't see
> how to improve things.  Even with these columns, my tests weren't much
> better.  Surely this is not the performance I can expect?
> 
> PLEASE HELP!!!
> 
> Details of tables, indexes, explain on above statements, and 
> db init file
> are below.  Please let me know if you need any other info.
> 
> Many thanks,
> 
> David
> 
> Explain for 1st query:
> --------------------------------------------------------------
> ------------------------------------------------------
> KIOSK  METRICS      TABLE SCAN                                   42317
> KIOSK  KIOSKS   ID  JOIN VIA KEY COLUMN                              1
> KIOSK                    RESULT IS COPIED   , COSTVALUE IS       86490
> --------------------------------------------------------------
> ------------------------------------------------------
> 
> 
> Explain for 2nd query:
> --------------------------------------------------------------
> ------------------------------------------------------
> KIOSK     METRICS                                     TABLE 
> SCAN                                    42317
> KIOSK     KIOSKS            ID                        JOIN 
> VIA KEY COLUMN                               1
> KIOSK     FORMS             FORMS_FORMS_ID_AVAILABLE  JOIN 
> VIA RANGE OF MULTIPLE INDEXED COL.           1
>                             ID                             
> (USED INDEX COLUMN)
> INTERNAL  TEMPORARY RESULT                            TABLE 
> SCAN                                      500
> INTERNAL  TEMPORARY RESULT                            TABLE 
> SCAN                                      500
> KIOSK                                                      
> RESULT IS COPIED   , COSTVALUE IS        29427
> --------------------------------------------------------------
> ------------------------------------------------------
> 
> Explain for 3rd query:
> --------------------------------------------------------------
> ------------------------------------------------------
> KIOSK     METRICS               TABLE SCAN                    
>                10527
> KIOSK     KIOSKS            ID  JOIN VIA KEY COLUMN           
>                    1
> INTERNAL  TEMPORARY RESULT      TABLE SCAN                    
>                  500
> KIOSK                                RESULT IS COPIED   , 
> COSTVALUE IS       32471
> --------------------------------------------------------------
> ------------------------------------------------------
> 
> Database init file
> --------------------------------------------------------------
> ------------------------------------------------------
> param_startsession
> param_init
> param_put RESTART_SHUTDOWN AUTO
> param_put MAXUSERTASKS 50
> param_put MAXDATADEVSPACES 256
> param_put SESSION_TIMEOUT 0
> param_checkall
> param_commitsession
> param_addvolume 1 LOG LOG_001 F 2050
> param_addvolume 1 DATA DAT_001 F 8192
> db_admin
> util_connect
> util_execute INIT CONFIG
> util_execute set log auto overwrite on
> util_activate kiosk,kiosk
> util_release
> load_systab -ud kiosk
> --------------------------------------------------------------
> ------------------------------------------------------
> 
> Table def's:
> CREATE TABLE accounts (Id INTEGER NOT NULL, name VARCHAR(80), 
> password VARCHAR(80),PRIMARY KEY (Id))
> //
> CREATE SEQUENCE ACCOUNTS_IDSEQ START WITH 1 INCREMENT BY 1 
> NOMAXVALUE CACHE 10
> //
> INSERT INTO accounts VALUES (ACCOUNTS_IDSEQ.NEXTVAL, 'admin','admin')
> //
> CREATE TABLE categories (Id INTEGER NOT NULL, Name 
> VARCHAR(80),   PRIMARY KEY (Id))
> //
> CREATE SEQUENCE CATEGORIES_IDSEQ START WITH 1 INCREMENT BY 1 
> NOMAXVALUE CACHE 10
> //
> CREATE TABLE categorykiosk (Category_Id INTEGER, Kiosk_Id INTEGER)
> //
> CREATE INDEX categorykiosk_Category_Id ON categorykiosk 
> (Category_Id, Kiosk_Id)
> //
> CREATE INDEX categorykiosk_Kiosk_Id ON categorykiosk 
> (Kiosk_Id, Category_Id)
> //
> CREATE TABLE defaultsettings (Num_Days VARCHAR(10), 
> Resolution VARCHAR(50), Orientation VARCHAR(50),  Color_Model 
> VARCHAR(50),Collate
> VARCHAR(50),Duplex VARCHAR(50),Finishing 
> VARCHAR(50),Paper_Size VARCHAR(50), Paper_Source 
> VARCHAR(50),Max_Copies INTEGER,Economode
> VARCHAR(50),Macon_Title VARCHAR(15),PrintScript_Id 
> VARCHAR(10),AutoFillScript_Id VARCHAR(10),Prints VARCHAR(10))
> //
> INSERT INTO defaultsettings 
> VALUES('7','300','Portrait','CMYK','On','Off','None','Printer 
> Default','Printer Default',10,'Off', 'Forms', '1', '2',
> 'neither')
> //
> CREATE TABLE formcategory (Form_Id INTEGER, Category_Id INTEGER)
> //
> CREATE INDEX formcategory_Form_Id ON formcategory (Form_Id, 
> Category_Id)
> //
> CREATE INDEX formcategory_Category_Id ON formcategory 
> (Category_Id, Form_Id)
> //
> CREATE TABLE forms (Id INTEGER NOT NULL, Title VARCHAR(83), 
> Number VARCHAR(40) NOT NULL, Revision_Date TIMESTAMP, 
> Revision_Number INTEGER,
> Submission_Date TIMESTAMP, Summary VARCHAR(128) DEFAULT NULL, 
> Keywords VARCHAR(128) NOT NULL, Pages INTEGER, Orientation 
> VARCHAR(50), Resolution
> VARCHAR(50), Color_Model VARCHAR(50),Economode VARCHAR(50), 
> Duplex VARCHAR(50), Paper_Size VARCHAR(50), Paper_Source 
> VARCHAR(50), Max_Copies INTEGER,
> Collate VARCHAR(50), Finishing VARCHAR(50),CycloneFormSetName 
> VARCHAR(80), IsFormset BOOLEAN, PrintScript_Id INTEGER NOT 
> NULL, AutoFillScript_Id
> INTEGER,Available BOOLEAN,ExpirationDateTime TIMESTAMP 
> DEFAULT NULL,PRIMARY KEY (Id))
> //
> CREATE INDEX forms_Title ON forms (Title)
> //
> CREATE INDEX forms_Keywords ON forms (Keywords)
> //
> CREATE INDEX forms_Number ON forms (Number)
> //
> CREATE INDEX forms_Available ON forms (Available)
> //
> CREATE INDEX forms_Revision_Date ON forms (Revision_Date)
> //
> CREATE INDEX forms_forms_id_available ON forms (Id, Available)
> //
> CREATE SEQUENCE FORMS_IDSEQ START WITH 1 INCREMENT BY 1 
> NOMAXVALUE CACHE 10
> //
> CREATE TABLE kiosks (Id INTEGER NOT NULL, Name VARCHAR(83), 
> Address VARCHAR(80), Primary_Printer VARCHAR(80), 
> Backup_Printer VARCHAR(80), Printer
> VARCHAR(50),Kiosk_Type VARCHAR(50),Macon_Title 
> VARCHAR(15),Available BOOLEAN,PRIMARY KEY (Id))
> //
> CREATE INDEX kiosks_Available ON kiosks (Available)
> //
> CREATE SEQUENCE KIOSKS_IDSEQ START WITH 1 INCREMENT BY 1 
> NOMAXVALUE CACHE 10
> //
> CREATE TABLE metrics (Kiosk_Id INTEGER, Form_Id INTEGER, 
> Copies INTEGER, Pages INTEGER, Script_Id INTEGER,  AutoFilled 
> BOOLEAN, ExecTime TIMESTAMP)
> //
> CREATE INDEX metrics_kioskId_formId_exectime ON metrics 
> (Kiosk_Id, Form_Id, ExecTime)
> //
> CREATE TABLE Scripts (Id INTEGER NOT NULL, Name VARCHAR(80) 
> ,Description VARCHAR(80) ,CycloneScriptName VARCHAR(80) 
> ,ReqsFormSet BOOLEAN, Prints
> BOOLEAN,HasPrompts BOOLEAN,HasLocalVars 
> BOOLEAN,ExpirationDateTime TIMESTAMP,Deleted BOOLEAN,System 
> BOOLEAN,PRIMARY KEY (Id))
> //
> CREATE INDEX Scripts_Id_ReqsFormSet ON Scripts (Id, ReqsFormSet)
> //
> CREATE INDEX Scripts_Id_HasPrompting ON Scripts (Id, HasPrompts)
> //
> CREATE INDEX Scripts_Id_HasLocalVars ON Scripts (Id, HasLocalVars)
> //
> CREATE SEQUENCE SCRIPTS_IDSEQ START WITH 1 INCREMENT BY 1 
> NOMAXVALUE CACHE 10
> //
> INSERT INTO Scripts VALUES (SCRIPTS_IDSEQ.NEXTVAL, 'Print', 
> 'Default Print Script', 'kioskprint',FALSE, TRUE, FALSE, 
> FALSE,null,FALSE,TRUE)
> //
> INSERT INTO Scripts VALUES (SCRIPTS_IDSEQ.NEXTVAL, 
> 'PrintPostScript', 'PostScript Print Script',
> 'kioskprintps',FALSE,TRUE,FALSE,FALSE,null,FALSE,TRUE)
> //
> CREATE TABLE Licenses (Id INTEGER NOT NULL, LicenseKey 
> VARCHAR(35) NOT NULL ,DateAdded TIMESTAMP,Number  
> INTEGER,RunningTotal INTEGER,PRIMARY KEY
> (Id))
> //
> CREATE INDEX Licenses_Id_RunningTotal ON Licenses (Id, RunningTotal)
> //
> CREATE SEQUENCE LICENSES_IDSEQ START WITH 1 INCREMENT BY 1 
> NOMAXVALUE CACHE 10
> //
> INSERT INTO Licenses VALUES 
> (LICENSES_IDSEQ.NEXTVAL,'INITIAL-LICENSE',now,1108746273,1108746273)
> //
> CREATE TABLE info (version VARCHAR(10),   serial_number VARCHAR(7))
> //
> INSERT INTO info VALUES('3.1.1',null)
> 
> 
> 
> ---------------------- Forwarded by David Hay/Lex/Lexmark on 
> 09/06/2003
> 06:53 PM ---------------------------
> 
> 
> David Hay
> 08/06/2003 09:51 PM
> 
> To:    [EMAIL PROTECTED]
> cc:
> 
> Subject:    Query taking LOADS of extra room  (Document link: 
> David Hay)
> 
> Hi,
> 
> I am still trying to simulate "autogrow" with a thread that checks the
> database size and adds volumes if required.
> 
> I have a complicated query that creates a "cross-tab" result (aka MS
> Access) for our reporting, but when we get up into millions 
> of records, it
> seems to take large amounts of space to execute.
> 
> Here's the query:
> 
> SELECT Forms.Title AS Form, SUM(CASE WHEN Kiosks.Name='loc1' 
> THEN Metrics.Copies
> ELSE 0 END) AS "loc1", SUM(CASE WHEN Kiosks.Name='loc2' THEN 
> Metrics.Copies
> ELSE 0 END) AS "loc2", SUM(CASE WHEN Kiosks.Name='loc3' THEN 
> Metrics.Copies
> ELSE 0 END) AS "loc3", SUM(CASE WHEN Kiosks.Name='loc4' THEN 
> Metrics.Copies ELSE 0 END)
> AS "loc4", SUM(CASE WHEN Kiosks.Name='loc5' THEN 
> Metrics.Copies ELSE 0 END) AS "loc5",
> SUM(Metrics.Copies) AS Total FROM Metrics INNER JOIN Kiosks 
> ON Metrics.Kiosk_Id = Kiosks.Id
> INNER JOIN Forms ON Metrics.Form_Id = Forms.Id WHERE ExecTime 
> IS NOT NULL AND Copies
> IS NOT NULL GROUP BY Forms.Title ORDER BY UPPER(Forms.Title)
> 
> The more locations we have, the more sum(case...) clauses we have.
> 
> Does anyone know any way around this?!  Is there a way to 
> optimize the query?  (I realise that adding an UpperTitle 
> field would help).
> 
> Also, is it still possible/necessary to set the MAXDATAPAGES 
> parameter?  I get an error whenever I try to.


Try to update the statistics of the involved tables for more information see 
http://www.sapdb.org/htmhelp/3b/86f067458411d3a98200a0c9449261/frameset.htm

HTH.

Kind regards,
Holger
SAP Labs Berlin
_______________________________________________
sapdb.general mailing list
[EMAIL PROTECTED]
http://listserv.sap.com/mailman/listinfo/sapdb.general

Reply via email to