All, There are some kinds of queries that have data access methods linked to each other. Windowed functions are the obvious example, but it happens even for regular aggregate functions. For example, COUNT(DISTINCT) needs not only read the underlying stream but also sort it in order to eliminate duplicates. So we have both retrieval and sorting inside the aggregation node and sorting is based on the retrieval:
select count(distinct rdb$relation_id) from rdb$relations group by rdb$relation_name Select Expression -> Aggregate -> Table "RDB$RELATIONS" Access By ID -> Index "RDB$INDEX_0" Scan /* -> Sort (unique) -> Table "RDB$RELATIONS" Access By ID -> Index "RDB$INDEX_0" Scan */ However, I'd like to skip the repeating part and replace it with a reference to the earier introduced part, because technically there's only one retrieval, not two. The possible options are: (A) Select Expression -> Aggregate -> Table "RDB$RELATIONS" Access By ID -> Index "RDB$INDEX_0" Scan -> Sort (unique) where no input for sorting means the prior stream (B) Select Expression -> Aggregate -> Table "RDB$RELATIONS" Access By ID -> Index "RDB$INDEX_0" Scan -> Sort (unique) -> ^^^ which means to look above for the input stream. But the indentation makes it hard to understand what exactly we refer to. And theoretically there maybe references to farther parts of the plan, not only the neighbours. (C) Select Expression -> Aggregate -> Table "RDB$RELATIONS" Access By ID -> Index "RDB$INDEX_0" Scan -> Sort (unique) -> $base$ some keyword is used to refer to the input stream of the aggregation (D) Select Expression -> Aggregate -> 1: Table "RDB$RELATIONS" Access By ID -> Index "RDB$INDEX_0" Scan -> 2: Sort (unique) -> $(1) all non-trivial methods have their children enumerated so they can be referenced by numbers. But for complex queries there will be multiple (1)s and (2)s making it harder to match the proper one. (E) Select Expression -> 1: Aggregate -> 2: Table "RDB$RELATIONS" Access By ID -> 3: Index "RDB$INDEX_0" Scan -> 4: Sort (unique) -> $(2) or Select Expression 1: -> Aggregate 2: -> Table "RDB$RELATIONS" Access By ID 3: -> Index "RDB$INDEX_0" Scan 4: -> Sort (unique) 5: -> $(2) all methods are globally enumerated. The output is a bit noisy, but personally I favor (E)#2 so far. Comments anyone? Other suggestions? Dmitry ------------------------------------------------------------------------------ Get 100% visibility into Java/.NET code with AppDynamics Lite! It's a free troubleshooting tool designed for production. Get down to code-level detail for bottlenecks, with <2% overhead. Download for free and get started troubleshooting in minutes. http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk Firebird-Devel mailing list, web interface at https://lists.sourceforge.net/lists/listinfo/firebird-devel