Subject Is it possible to optimize this query
Author Niben M Singh
Hello All -

I have a SELECT statement that returns 24322 rows. When I get DISTINCT on that it gives only 28 rows.

SELECT is very fast but the SELECT DISTINCT (with ORDER BY) seems slow. All the PKs and FKs are indexed as usual.

It may be that I am not tuning the query or database correctly. I am wondering if this query can be optimized further to make it faster.

MLT_* tables contain multilingual texts. These tables have composite PKs as shown below.


The query is:

SELECT DISTINCT
vyv.table3_id,
mvyd.mlt_table4_str,
vcp.table5_num,
mvcpd.table5_str,
mvcd.mlt_table6_str,
mid.table7_str1,
mid.table7_str2
FROM
table1 pvcm
JOIN table2 vec ON (pvcm.table2_id = vec.table2_id)
JOIN table3 vyv ON (vec.table3_id = vyv.table3_id)
JOIN table4 vyd ON (vyv.table4_id = vyd.table4_id)
JOIN language l ON (l.language_id = :lang)
LEFT JOIN mlt_table4 mvyd ON (vyd.table4_id = mvyd.table4_id AND l.language_id = mvyd.language_id)
LEFT JOIN table5 vcp ON (vyv.table5_id = vcp.table5_id)
LEFT JOIN mlt_table6 mvcd ON (vyv.table6_id = mvcd.table6_id AND l.language_id = mvcd.language_id)
LEFT JOIN mlt_table5 mvcpd ON (vcp.table5_id = mvcpd.table5_id AND l.language_id = mvcpd.language_id)
LEFT JOIN mlt_table7 mid ON (vyd.table7_id = mid.table7_id AND mid.language_id = l.language_id)
WHERE
pvcm.pvcm_id = :param
ORDER BY
mvyd.mlt_table4_str DESC


Primary Keys
------------
table1 --> pvcm_id,table2_id
table2 --> table2_id
table3 --> table3_id
table4 --> table4_id
table5 --> table5_id
mlt_table4 --> table4_id, language_id
mlt_table6 --> table6_id, language_id
mlt_table5 --> table5_id, language_id
mlt_table7 --> table7_id, language_id


Query Plan:

PLAN SORT (
            SORT (
                    JOIN (
                            JOIN (
                                    JOIN (
                                            JOIN (
                                                    JOIN (
                                                            JOIN (
                                                                    L INDEX (PK_LANGUAGE),
                                                                    JOIN (
                                                                            VYD NATURAL,
                                                                            VYV INDEX (IX_table3_FK3),
                                                                            VEC INDEX (IX_table2_FK3),
                                                                            PVCM INDEX (PK_table1)
                                                                          )
                                                                 ),
                                                            MVYD INDEX (PK_MLT_table4)
                                                         ),
                                                    VCP INDEX (PK_table5)
                                                 ),
                                            MVCD INDEX (PK_MLT_table6)
                                         ),
                                    MVCPD INDEX (PK_MLT_table5)
                                 ),
                            MID INDEX (PK_MLT_table7)
                         )
                 )
            )

Prepare time = 0ms
Execute time = 1s 406ms
Avg fetch time = 50.21 ms
Current memory = 9,478,956
Max memory = 14,624,088
Memory buffers = 2,048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 721,880


Thanks in advance!





[Non-text portions of this message have been removed]