Subject | Re: How to specify manual plan for this kind of query? |
---|---|
Author | Dmitry Yemanov |
Post date | 2019-05-30T17:30:31Z |
30.05.2019 9:35, liviuslivius wrote:
work for nested and/or complex statements.
need to optimize. Or better use +0 hints, if possible.
HASH (CTE T T NATURAL, CTE K NATURAL))
Dmitry
>Manual planning is the remainder of old times linear queries. It doesn't
> i need to modify plan generated by Firebird and specify manual plan.
> I use Firebird 3.
> example on employee.fdb (sample from taken
> from README.common_table_expressions.txt)
> --------------------------------------------------------
> WITH RECURSIVE
> DEPT_YEAR_BUDGET AS
> (
> SELECT B.FISCAL_YEAR, B.DEPT_NO, SUM(B.PROJECTED_BUDGET) AS BUDGET
> FROM PROJ_DEPT_BUDGET B
> GROUP BY B.FISCAL_YEAR, B.DEPT_NO
> ),
> DEPT_TREE AS
> (
> SELECT D1.DEPT_NO, D1.HEAD_DEPT, D1.DEPARTMENT, CAST('' AS
> VARCHAR(255)) AS INDENT
> FROM DEPARTMENT D1
> WHERE HEAD_DEPT IS NULL
> UNION ALL
> SELECT D2.DEPT_NO, D2.HEAD_DEPT, D2.DEPARTMENT, H.INDENT || ' '
> FROM DEPARTMENT D2 JOIN DEPT_TREE H
> ON D2.HEAD_DEPT = H.DEPT_NO
> )
> SELECT D3.DEPT_NO,
> D3.INDENT || D3.DEPARTMENT AS DEPARTMENT,
> B_1993.BUDGET AS B_1993
> FROM DEPT_TREE D3
> LEFT JOIN DEPT_YEAR_BUDGET B_1993
> ON D3.DEPT_NO = B_1993.DEPT_NO AND B_1993.FISCAL_YEAR = 1993
> --------------------------------------------------------
> it generate plan
> PLAN JOIN (DEPT_TREE D1 INDEX (RDB$FOREIGN6), DEPT_TREE D2 INDEX
> (RDB$FOREIGN6), SORT (B_1993 B INDEX (RDB$FOREIGN18, RDB$PRIMARY17)))
> but if i put this plan witgout any modification to the query
> it say:
> --------------------------------------------------
> Dynamic SQL Error
> SQL error code = -104
> Invalid command
> there is no alias or table named D1 at this scope level.
> --------------------------------------------------
work for nested and/or complex statements.
> How to put manual plan for this query?You may try putting a sub-plan into particular select expression you
need to optimize. Or better use +0 hints, if possible.
> In my real situation query plan looks likeReally? I'd suppose the changed part should be:
> PLAN (SORT (JOIN (CTE T T NATURAL, CTE K INDEX (IXA_NAMES_K__NAME))),
> JOIN (CTE T T NATURAL, CTE K INDEX (IXA_NAMES_K__ID)))
> and i need to change it to
> PLAN (SORT (JOIN (CTE T T NATURAL, CTE K INDEX (IXA_NAMES_K__NAME))),
> HASH (CTE T T NATURAL, CTE K INDEX (IXA_NAMES_K__ID)))
HASH (CTE T T NATURAL, CTE K NATURAL))
Dmitry