How to avoid redundant Sort operations? (pgsql 7.1.2)
От | Aris Tsois |
---|---|
Тема | How to avoid redundant Sort operations? (pgsql 7.1.2) |
Дата | |
Msg-id | 20020122174631.T8049-100000@city.dbnet.ece.ntua.gr обсуждение исходный текст |
Ответы |
Re: How to avoid redundant Sort operations? (pgsql 7.1.2)
|
Список | pgsql-hackers |
Using the EXPLAIN command I have notice that PostgreSQL performs redundant Sort operations in several cases. (postgresql-7.1.2 on Linux) The 3 examples use the following schema: create table t (a int, b int); create view v as select * from t order by a; The first case containing a redundant sort operation: explain select * from v order by a; NOTICE: QUERY PLAN: Sort (cost=0.02..0.02 rows=1 width=8) -> Subquery Scan v (cost=0.01..0.01 rows=1 width=8) -> Sort (cost=0.01..0.01rows=1 width=8) -> Seq Scan on t (cost=0.00..0.00 rows=1 width=8) Although the view v is already sorted on a the plan re-sorts it. The next similar case is: explain select * from (select * from t order by a) as k order by a; NOTICE: QUERY PLAN: Sort (cost=0.02..0.02 rows=1 width=8) -> Subquery Scan k (cost=0.01..0.01 rows=1 width=8) -> Sort (cost=0.01..0.01rows=1 width=8) -> Seq Scan on t (cost=0.00..0.00 rows=1 width=8) Also the merge-join operation sorts the input even when it is already sorted as you can see in the followin statement: (I forced the use of merge-sort with: set ENABLE_HASHJOIN=0 set ENABLE_INDEXSCAN=0; set ENABLE_NESTLOOP =0; but I got the same behaviour on a more complex schema when the planner choosed the merge-join) explain select * from t NATURAL JOIN v; NOTICE: QUERY PLAN: Merge Join (cost=0.03..0.06 rows=1 width=16) -> Sort (cost=0.01..0.01 rows=1 width=8) -> Seq Scan on t (cost=0.00..0.00rows=1 width=8) -> Sort (cost=0.02..0.02 rows=1 width=8) -> Subquery Scan v (cost=0.01..0.01 rows=1width=8) -> Sort (cost=0.01..0.01 rows=1 width=8) -> Seq Scan on t (cost=0.00..0.00rows=1 width=8) The same happens with: explain select * from v NATURAL JOIN (select * from t order by a) AS k; NOTICE: QUERY PLAN: Merge Join (cost=0.04..0.07 rows=1 width=16) -> Sort (cost=0.02..0.02 rows=1 width=8) -> Subquery Scan v (cost=0.01..0.01rows=1 width=8) -> Sort (cost=0.01..0.01 rows=1 width=8) -> Seq Scan ont (cost=0.00..0.00 rows=1 width=8) -> Sort (cost=0.02..0.02 rows=1 width=8) -> Subquery Scan k (cost=0.01..0.01rows=1 width=8) -> Sort (cost=0.01..0.01 rows=1 width=8) -> Seq Scan ont (cost=0.00..0.00 rows=1 width=8) Question: --------- Is there any way to avoid those redundant sort operations? (I could even attempt to hack the source code if you can tell me where to start looking) There is line in the release notes of 7.0: "Prevent descending sort if result is already sorted(Hiroshi)" but I have tested the same examples with descending order and I get the same results. Thank you for your time. Regards, Aris.
В списке pgsql-hackers по дате отправления: