LightDB rownum使用示例及性能测试

如下所示:

lightdb@oradb=# explain analyze select * from (select a.*,rownum rn from (select * from v,v1 where v.id=v1.id and not exists (select 1 from t where id<>v.id) and v1.id <> '31' order by v1.id) a where rownum<100000+1000) where rn>100000;                                                                       QUERY PLAN                                                                       
--------------------------------------------------------------------------------------------------------------------------------------------------------
 Subquery Scan on lt_tmp_alias_0x1842908  (cost=36160.35..36160.38 rows=1 width=16) (actual time=897.915..897.925 rows=0 loops=1)
   Filter: (lt_tmp_alias_0x1842908.rn > 100000)
   ->  Count StopKey  (cost=36160.35..36160.37 rows=1 width=16) (actual time=897.912..897.920 rows=0 loops=1)
         ->  Subquery Scan on a  (cost=36160.35..36160.37 rows=1 width=16) (actual time=897.910..897.918 rows=0 loops=1)
               ->  Sort  (cost=36160.35..36160.36 rows=1 width=8) (actual time=897.909..897.917 rows=0 loops=1)
                     Sort Key: t_1.id
                     Sort Method: quicksort  Memory: 33kB
                     ->  Hash Join  (cost=27209.80..36160.34 rows=1 width=8) (actual time=897.892..897.899 rows=0 loops=1)
                           Hash Cond: (t_2.id = t_1.id)
                           ->  Seq Scan on t t_2  (cost=0.00..7763.40 rows=316569 width=4) (actual time=0.046..0.047 rows=1 loops=1)
                                 Filter: ((id)::numeric <> '31'::numeric)
                           ->  Hash  (cost=27209.79..27209.79 rows=1 width=4) (actual time=897.823..897.828 rows=0 loops=1)
                                 Buckets: 1024  Batches: 1  Memory Usage: 8kB
                                 ->  Nested Loop Anti Join  (cost=0.00..27209.79 rows=1 width=4) (actual time=897.821..897.823 rows=0 loops=1)
                                       Join Filter: (t.id <> t_1.id)
                                       Rows Removed by Join Filter: 64
                                       ->  Seq Scan on t t_1  (cost=0.00..6172.60 rows=318160 width=4) (actual time=0.016..124.377 rows=320064 loops=1)
                                       ->  Materialize  (cost=0.00..9006.40 rows=318160 width=4) (actual time=0.000..0.000 rows=1 loops=320064)
                                             ->  Seq Scan on t  (cost=0.00..6172.60 rows=318160 width=4) (actual time=0.016..0.017 rows=2 loops=1)
 Planning Time: 2.249 ms
 Execution Time: 898.344 ms
(21 rows)

再看原生limit offset的执行计划:

lightdb@oradb=# explain analyze select * from v,v1 where v.id=v1.id and not exists (select 1 from t where id<>v.id) and v1.id <> '31' order by v1.id limit 1000 offset 100000;
                                                                 QUERY PLAN                                                                 
--------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=36160.36..36160.36 rows=1 width=8) (actual time=967.018..967.027 rows=0 loops=1)
   ->  Sort  (cost=36160.35..36160.36 rows=1 width=8) (actual time=966.998..967.006 rows=0 loops=1)
         Sort Key: t_1.id
         Sort Method: quicksort  Memory: 33kB
         ->  Hash Join  (cost=27209.80..36160.34 rows=1 width=8) (actual time=966.978..966.986 rows=0 loops=1)
               Hash Cond: (t_2.id = t_1.id)
               ->  Seq Scan on t t_2  (cost=0.00..7763.40 rows=316569 width=4) (actual time=0.049..0.050 rows=1 loops=1)
                     Filter: ((id)::numeric <> '31'::numeric)
               ->  Hash  (cost=27209.79..27209.79 rows=1 width=4) (actual time=966.881..966.886 rows=0 loops=1)
                     Buckets: 1024  Batches: 1  Memory Usage: 8kB
                     ->  Nested Loop Anti Join  (cost=0.00..27209.79 rows=1 width=4) (actual time=966.879..966.880 rows=0 loops=1)
                           Join Filter: (t.id <> t_1.id)
                           Rows Removed by Join Filter: 64
                           ->  Seq Scan on t t_1  (cost=0.00..6172.60 rows=318160 width=4) (actual time=0.018..133.848 rows=320064 loops=1)
                           ->  Materialize  (cost=0.00..9006.40 rows=318160 width=4) (actual time=0.000..0.000 rows=1 loops=320064)
                                 ->  Seq Scan on t  (cost=0.00..6172.60 rows=318160 width=4) (actual time=0.016..0.017 rows=2 loops=1)
 Planning Time: 2.011 ms
 Execution Time: 967.468 ms
(18 rows)

从上可知,lightdb的rownum实现和pg原生的limit offset差异不大。并没有可感知的对性能造成影响。

posted @ 2024-09-29 15:42  zhjh256  阅读(3)  评论(0编辑  收藏  举报