Subject | Problem with sub-optimal query plan |
---|---|
Author | Fulvio Senore |
Post date | 2015-02-03T12:17:29Z |
I have a database containing(simplifyinga little) a CUSTOMERS table
andan INVOICES table.
INVOICES contains a foreign key to CUSTOMERS, as you can expect.
I want to retrieve rows showing INVOICES data and some CUSTOMERS data so
I use an inner join, and I want to see newer invoices first so I add an
ORDER BY clause. I only need a few rowssince I will show only the latest
invoices in a grid.
The query is something like
SELECT INVOICES.*, CUSTOMERS.NAME
FROM INVOICES INNER JOIN CUSTOMERS ON INVOICES.CUSTOMER_ID =
CUSTOMERS.CUSTOMER_ID
ORDER BY INVOICES.YEAR DESC, INVOICES.NUMBER DESC
I have created a descending index on INVOICES.YEAR, INVOICES.NUMBER
The problem is that if the tables are large the query is rather slow.
Looking at the plan I see:
PLAN SORT (JOIN (CUSTOMERS NATURAL, INVOICES INDEX (FK_INVOICES_CUSTOMERS)))
so the database loads all rows and then it sorts them.Of course it is slow.
If I test a query like
SELECT * FROM INVOICES
ORDER BY INVOICES.YEAR DESC, INVOICES.NUMBER DESC
the plan is
PLAN (INVOICESORDER IDX_INVOICES_DESC)
and the query is much faster since it uses the index and it only reads a
few rows.
So it looks like if there is an inner join the optimizer does not use
the descending index on INVOICES to speed up things.
Is there a way to force the optimizer to use the descending index
instead of sorting all the resulting rows?
I am using Firebird 2.1 on Windows.
Thanks in advance.
Fulvio Senore
andan INVOICES table.
INVOICES contains a foreign key to CUSTOMERS, as you can expect.
I want to retrieve rows showing INVOICES data and some CUSTOMERS data so
I use an inner join, and I want to see newer invoices first so I add an
ORDER BY clause. I only need a few rowssince I will show only the latest
invoices in a grid.
The query is something like
SELECT INVOICES.*, CUSTOMERS.NAME
FROM INVOICES INNER JOIN CUSTOMERS ON INVOICES.CUSTOMER_ID =
CUSTOMERS.CUSTOMER_ID
ORDER BY INVOICES.YEAR DESC, INVOICES.NUMBER DESC
I have created a descending index on INVOICES.YEAR, INVOICES.NUMBER
The problem is that if the tables are large the query is rather slow.
Looking at the plan I see:
PLAN SORT (JOIN (CUSTOMERS NATURAL, INVOICES INDEX (FK_INVOICES_CUSTOMERS)))
so the database loads all rows and then it sorts them.Of course it is slow.
If I test a query like
SELECT * FROM INVOICES
ORDER BY INVOICES.YEAR DESC, INVOICES.NUMBER DESC
the plan is
PLAN (INVOICESORDER IDX_INVOICES_DESC)
and the query is much faster since it uses the index and it only reads a
few rows.
So it looks like if there is an inner join the optimizer does not use
the descending index on INVOICES to speed up things.
Is there a way to force the optimizer to use the descending index
instead of sorting all the resulting rows?
I am using Firebird 2.1 on Windows.
Thanks in advance.
Fulvio Senore