This simple join query brings maxdb 7.5.0.14 to its knees where this same
*exact* query using the same data in PostgreSQL only takes 6 seconds to
fetch and 24 seconds to display. MaxDB (SQL Studio) however locks up and
never finishes. Below is some EXPLAIN output for queries I used to see what
was needed to improve performance. I have also included the defined schema
and indexes for each table.

SELECT C.*,P.* FROM COMPANY C INNER JOIN PERSON P ON P.COMPANY_ID =
C.COMPANY_ID ORDER BY C.COM_NAME ASC

P                       TABLE SCAN                              988
C       COMPANY_ID      JOIN VIA KEY COLUMN             787
                        RESULT IS COPIED, COSTVALUE IS  42303

EXPLAIN SELECT C.COMPANY_ID,P.PERSON_ID FROM "COMPANY" C INNER JOIN "PERSON"
P ON C."COMPANY_ID" = P."COMPANY_ID" ORDER BY C."COM_NAME" ASC

P       TABLE SCAN                                              988
C       COMPANY_ID      JOIN VIA KEY COLUMN             787
                        RESULT IS COPIED,COSTVALUE IS         2408

EXPLAIN SELECT C.*,P.PERSON_ID FROM "COMPANY" C INNER JOIN "PERSON" P ON
C."COMPANY_ID" = P."COMPANY_ID" ORDER BY C."COM_NAME" ASC

P       TABLE SCAN                                              988
C       COMPANY_ID      JOIN VIA KEY COLUMN             787
                        TABLE HASHED    
                        RESULT IS COPIED,COSTVALUE IS           33500

***** THE FOLLOWING IS INTERESTING *****

EXPLAIN SELECT C.COMPANY_ID,C.COM_NAME,P.PERSON_ID,P.FNAME,P.LNAME FROM
"COMPANY" C INNER JOIN "PERSON" P ON C."COMPANY_ID" = P."COMPANY_ID" ORDER
BY C."COM_NAME" ASC

P       TABLE SCAN                                                      988
C       COMPANY_ID      JOIN VIA KEY COLUMN                     787
                        RESULT IS COPIED,COSTVALUE IS         2973

EXPLAIN SELECT
C.COMPANY_ID,C.COM_NAME,C.NOTE,P.PERSON_ID,P.FNAME,P.LNAME,P.NOTE FROM
"COMPANY" C INNER JOIN "PERSON" P ON C."COMPANY_ID" = P."COMPANY_ID" ORDER
BY C."COM_NAME" ASC

P       TABLE SCAN                                              988
C       COMPANY_ID      JOIN VIA KEY COLUMN                     787
                        RESULT IS COPIED,COSTVALUE IS           20511

By including the note fields the performance is reduced dramatically. These
are not large fields by any stretch (5k bytes & 255 bytes)

Systems used in testing:
MaxDB 7.5.0.14 server - 
AMD Dual 2.0 GHz, 2GB RAM, 4 IDE DRIVES. 
All data segments (data,log,sys) are on seperate disks. 
OS = SuSE 8.1

PostgreSQL machine (workstation)
AMD 1.6GHz, 512MB RAM, 2 IDE DRIVES

(16406 records total)
CREATE TABLE "COMPANY"
(
        "COMPANY_ID"               Fixed (10,0),
        "COM_NAME"               Varchar (40) ASCII,
        "ADDRESS1"               Varchar (100) ASCII,
        "ADDRESS2"               Varchar (100) ASCII,
        "CITY"               Varchar (75) ASCII,
        "STATE"               Varchar (20) ASCII,
        "COUNTRY"               Varchar (20) ASCII,
        "ZIP"               Varchar (10) ASCII,
        "WEB"               Varchar (255) ASCII,
        "PHONE"               Varchar (20) ASCII,
        "FAX"               Varchar (20) ASCII,
        "ACCT_OWNER"               Varchar (20) ASCII,
        "ACCT_NUM"               Varchar (20) ASCII,
        "ANNUAL_REVENUE"               Fixed (18,0),
        "NUM_OF_EMPL"               Fixed (18,0),
        "SIC_CODE"               Varchar (20) ASCII,
        "NOTE"               Varchar (5000) ASCII,
        "CREATE_DATE"               Timestamp,
        "CREATE_USER"               Varchar (20) ASCII,
        "MODIFY_DATE"               Timestamp,
        "MODIFY_USER"               Varchar (20) ASCII,
        "SYNC_DATE"               Timestamp,
        "SYNC_USER"               Varchar (20) ASCII,
        "ACTIVE"               Varchar (1) ASCII,
        "FAX_LIST"               Varchar (1) ASCII,
        "TERRITORY_CODE"         Varchar (3) ASCII,
        PRIMARY KEY ("COMPANY_ID")
)

[COMPANY TABLE INDEXES]
CREATE  INDEX "IDX_COMPANY_COM_NAME" ON "COMPANY" ("COM_NAME"  ASC )
CREATE  INDEX "IDX_COMPANY_ADDRESS" ON "COMPANY" ("ZIP"  ASC,"STATE"
ASC,"CITY"  ASC )

(32532 records total)
CREATE TABLE "PERSON"
(
        "PERSON_ID"               Fixed (10,0),
        "COMPANY_ID"               Fixed (10,0),
        "DIVISION_ID"               Fixed (10,0),
        "FNAME"               Varchar (15) ASCII,
        "LNAME"               Varchar (20) ASCII,
        "TITLE"               Varchar (30) ASCII,
        "ADDRESS1"               Varchar (100) ASCII,
        "ADDRESS2"               Varchar (100) ASCII,
        "CITY"               Varchar (75) ASCII,
        "STATE"               Varchar (20) ASCII,
        "COUNTRY"               Varchar (20) ASCII,
        "ZIP"               Varchar (10) ASCII,
        "PHONE"               Varchar (20) ASCII,
        "EXT"               Varchar (10) ASCII,
        "CELLPHONE"               Varchar (20) ASCII,
        "PAGER"               Varchar (20) ASCII,
        "FAX"               Varchar (20) ASCII,
        "EMAIL"               Varchar (80) ASCII,
        "USERNAME"               Varchar (20) ASCII,
        "PASSWORD"               Varchar (20) ASCII,
        "NOTE"               Varchar (255) ASCII,
        "CREATE_DATE"               Timestamp,
        "CREATE_USER"               Varchar (20) ASCII,
        "MODIFY_DATE"               Timestamp,
        "MODIFY_USER"               Varchar (20) ASCII,
        "SYNC_DATE"               Timestamp,
        "SYNC_USER"               Varchar (20) ASCII,
        "ACTIVE"               Varchar (1) ASCII,
        "FAX_LIST"               Varchar (1) ASCII,
        PRIMARY KEY ("PERSON_ID"),
FOREIGN KEY "FK_PERSON_COMPANY" ("COMPANY_ID") REFERENCES "COMPANY"
("COMPANY_ID") ON DELETE  RESTRICT,
FOREIGN KEY "FK_PERSON_DIVISION" ("DIVISION_ID") REFERENCES "DIVISION"
("DIVISION_ID") ON DELETE  RESTRICT
)

[PERSON TABLE INDEXES]
CREATE  INDEX "IDX_PERSON_FK" ON "PERSON" ("COMPANY_ID"  ASC,"DIVISION_ID"
ASC )
CREATE  INDEX "IDX_PERSON_ADDRESS" ON "PERSON" ("ZIP"  ASC,"STATE"
ASC,"CITY"  ASC )
CREATE  INDEX "IDX_PERSON_NAME" ON "PERSON" ("LNAME"  ASC,"FNAME"  ASC ) 
CREATE  INDEX "IDX_PERSON_NAME2" ON "PERSON" ("FNAME"  ASC, "LNAME"  ASC ) 
CREATE  INDEX "IDX_PERSON_FNAME" ON "PERSON" ("FNAME"  ASC ) 
CREATE  INDEX "IDX_PERSON_LNAME" ON "PERSON" ("LNAME"  ASC )  

Reply via email to