提高count查询速度

显然昨天做的分区并未提升count(1)的查询速度,怎样都避免不了全表扫描,后来开始在网上搜索,发现的确有很多方法,所以准备挨个尝试
首先正常查询一次
10:19:30 SQL> select count(1) from trans_tmp;

  COUNT(1)
----------
   8997943

已用时间:  00: 03: 23.76

执行计划
----------------------------------------------------------
Plan hash value: 55114451

-------------------------------------------------------------------------------------
| Id  | Operation             | Name                | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                     |     1 |  6382   (5)| 00:01:17 |
|   1 |  SORT AGGREGATE       |                     |     1 |            |          |
|   2 |   INDEX FAST FULL SCAN| TRANS_TMP_ID |    11M|  6382   (5)| 00:01:17 |
-------------------------------------------------------------------------------------


统计信息
----------------------------------------------------------
        231  recursive calls
          0  db block gets
      28019  consistent gets
      22734  physical reads
          0  redo size
        411  bytes sent via SQL*Net to client
        400  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
          1  rows processed

3分多钟,6382 cost
1.尝试bitmap索引,还是以id列做索引
首先删掉之前的btree索引
drop index trans_tmp_id;
唉,这就执行了好久,然后建立bitmap索引
create bitmap index bitmap_idx_id on trans_tmp(id) online;
因为应用还在跑着,所以采用online的方式,漫长等待后,进行查询

10:43:52 SQL> select count(1) from trans_tmp;

  COUNT(1)
----------
   8997943

已用时间:  00: 03: 57.18

执行计划
----------------------------------------------------------
Plan hash value: 3875526975

---------------------------------------------------------------------------------------
| Id  | Operation                     | Name          | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |               |     1 | 29563   (1)| 00:05:55 |
|   1 |  SORT AGGREGATE               |               |     1 |            |          |
|   2 |   BITMAP CONVERSION COUNT     |               |    11M| 29563   (1)| 00:05:55 |
|   3 |    BITMAP INDEX FAST FULL SCAN| BITMAP_IDX_ID |       |            |          |
---------------------------------------------------------------------------------------


统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
      40454  consistent gets
      32655  physical reads
          0  redo size
        411  bytes sent via SQL*Net to client
        400  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

近4分钟,而且cost 29563,怎么更高了呢?继续在这上尝试

2.更改bitmap索引并行
10:52:37 SQL> alter index bitmap_idx_id parallel 4;

索引已更改。

10:54:40 SQL> select count(1) from trans_tmp;

已用时间:  00: 03: 40.23

执行计划
----------------------------------------------------------
Plan hash value: 408296253

------------------------------------------------------------------------------------------------------------------------

| Id  | Operation                         | Name          | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |

------------------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                  |               |     1 | 29563   (1)| 00:05:55 |        |   |               |

|   1 |  SORT AGGREGATE                   |               |     1 |            |          |        |   |               |

|   2 |   PX COORDINATOR                  |               |       |            |          |        |   |               |

|   3 |    PX SEND QC (RANDOM)            | :TQ10000      |     1 |            |          |  Q1,00 | P->S | QC (RAND)  |

|   4 |     SORT AGGREGATE                |               |     1 |            |          |  Q1,00 | PCWP |            |

|   5 |      PX BLOCK ITERATOR            |               |    11M| 29563   (1)| 00:05:55 |  Q1,00 | PCWC |            |

|   6 |       BITMAP CONVERSION COUNT     |               |    11M| 29563   (1)| 00:05:55 |  Q1,00 | PCWP |            |

|   7 |        BITMAP INDEX FAST FULL SCAN| BITMAP_IDX_ID |       |            |          |  Q1,00 | PCWP |            |

------------------------------------------------------------------------------------------------------------------------



统计信息
----------------------------------------------------------
        939  recursive calls
          3  db block gets
      33540  consistent gets
      32656  physical reads
        628  redo size
        411  bytes sent via SQL*Net to client
        400  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
         14  sorts (memory)
          0  sorts (disk)
          1  rows processed

时间只减少了10几秒,cost 29563 一点没变;既然并行了索引,那么也并行表吧
10:58:32 SQL> alter table trans_tmp parallel 4;

表已更改。

11:01:08 SQL> select count(1) from trans_tmp;
已用时间:  00: 00: 01.03

执行计划
----------------------------------------------------------
Plan hash value: 408296253

------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name          | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |               |     1 |  8212   (1)| 00:01:39 |        |   |               |
|   1 |  SORT AGGREGATE                   |               |     1 |            |          |        |   |               |
|   2 |   PX COORDINATOR                  |               |       |            |          |        |   |               |
|   3 |    PX SEND QC (RANDOM)            | :TQ10000      |     1 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE                |               |     1 |            |          |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR            |               |    11M|  8212   (1)| 00:01:39 |  Q1,00 | PCWC |            |
|   6 |       BITMAP CONVERSION COUNT     |               |    11M|  8212   (1)| 00:01:39 |  Q1,00 | PCWP |            |
|   7 |        BITMAP INDEX FAST FULL SCAN| BITMAP_IDX_ID |       |            |          |  Q1,00 | PCWP |            |
------------------------------------------------------------------------------------------------------------------------

去掉了查询部分,只看执行计划,这回cost 8212,下来不少
3.禁用索引,并行扫描全表

11:03:15 SQL> select /*+full(trans_tmp)parallel(trans_tmp 2)*/ count(1) from trans_tmp;
已用时间:  00: 00: 00.17

执行计划
----------------------------------------------------------
Plan hash value: 1765477136

----------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                  |     1 | 93757   (1)| 00:18:46 |        |      |         |
|   1 |  SORT AGGREGATE        |                  |     1 |            |          |        |      |         |
|   2 |   PX COORDINATOR       |                  |       |            |          |        |      |         |
|   3 |    PX SEND QC (RANDOM) | :TQ10000         |     1 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |                  |     1 |            |          |  Q1,00 | PCWP |         |
|   5 |      PX BLOCK ITERATOR |                  |    11M| 93757   (1)| 00:18:46 |  Q1,00 | PCWC |         |
|   6 |       TABLE ACCESS FULL| TRANS_TMP |    11M| 93757   (1)| 00:18:46 |  Q1,00 | PCWP |         |
----------------------------------------------------------------------------------------------------------------
cost 93757 看来很高,不过之前已经把并行度改成了4,那么直接查询试试看

11:06:45 SQL> select  /*+full(trans_tmp)*/ count(1) from trans_tmp;
已用时间:  00: 00: 00.96

执行计划
----------------------------------------------------------
Plan hash value: 1765477136

----------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                  |     1 | 46879   (1)| 00:09:23 |        |      |         |
|   1 |  SORT AGGREGATE        |                  |     1 |            |          |        |      |         |
|   2 |   PX COORDINATOR       |                  |       |            |          |        |      |         |
|   3 |    PX SEND QC (RANDOM) | :TQ10000         |     1 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |                  |     1 |            |          |  Q1,00 | PCWP |         |
|   5 |      PX BLOCK ITERATOR |                  |    11M| 46879   (1)| 00:09:23 |  Q1,00 | PCWC |         |
|   6 |       TABLE ACCESS FULL| TRANS_TMP |    11M| 46879   (1)| 00:09:23 |  Q1,00 | PCWP |         |
----------------------------------------------------------------------------------------------------------------
cost 46897 降了一半左右,既然bitmap索引效果不大,删掉,然后重建btree索引继续尝试并行
4.btree索引并行
11:03:34 SQL> drop index bitmap_idx_id;

索引已删除。
11:07:11 SQL> create index trans_tmp_id on trans_tmp(id) online;

索引已创建。

11:13:51 SQL> alter index trans_tmp_id parallel 4;

索引已更改。

已用时间:  00: 00: 00.32

11:27:44 SQL> select count(1) from trans_tmp;
已用时间:  00: 00: 00.42

执行计划
----------------------------------------------------------
Plan hash value: 1765477136

----------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                  |     1 | 46879   (1)| 00:09:23 |        |      |         |
|   1 |  SORT AGGREGATE        |                  |     1 |            |          |        |      |         |
|   2 |   PX COORDINATOR       |                  |       |            |          |        |      |         |
|   3 |    PX SEND QC (RANDOM) | :TQ10000         |     1 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |                  |     1 |            |          |  Q1,00 | PCWP |         |
|   5 |      PX BLOCK ITERATOR |                  |    11M| 46879   (1)| 00:09:23 |  Q1,00 | PCWC |         |
|   6 |       TABLE ACCESS FULL| TRANS_TMP |    11M| 46879   (1)| 00:09:23 |  Q1,00 | PCWP |         |
----------------------------------------------------------------------------------------------------------------
全表扫描了?gather stat了一下还是全表,那么就强制走索引吧

11:32:03 SQL> select /*+rule*/ count(1) from trans_tmp;
已用时间:  00: 00: 00.18

执行计划
----------------------------------------------------------
Plan hash value: 1765477136

----------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                  |     1 | 46879   (1)| 00:09:23 |        |      |         |
|   1 |  SORT AGGREGATE        |                  |     1 |            |          |        |      |         |
|   2 |   PX COORDINATOR       |                  |       |            |          |        |      |         |
|   3 |    PX SEND QC (RANDOM) | :TQ10000         |     1 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |                  |     1 |            |          |  Q1,00 | PCWP |         |
|   5 |      PX BLOCK ITERATOR |                  |    11M| 46879   (1)| 00:09:23 |  Q1,00 | PCWC |         |
|   6 |       TABLE ACCESS FULL| TRANS_TMP |    11M| 46879   (1)| 00:09:23 |  Q1,00 | PCWP |         |
----------------------------------------------------------------------------------------------------------------
呃,竟然一样,好吧,我准备继续折腾
11:35:43 SQL> set autotrace on
11:35:58 SQL> select count(1) from trans_tmp;

  COUNT(1)
----------
   8997943

已用时间:  00: 02: 35.10

执行计划
----------------------------------------------------------
Plan hash value: 1765477136

----------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                  |     1 | 46879   (1)| 00:09:23 |        |      |         |
|   1 |  SORT AGGREGATE        |                  |     1 |            |          |        |      |         |
|   2 |   PX COORDINATOR       |                  |       |            |          |        |      |         |
|   3 |    PX SEND QC (RANDOM) | :TQ10000         |     1 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |                  |     1 |            |          |  Q1,00 | PCWP |         |
|   5 |      PX BLOCK ITERATOR |                  |    11M| 46879   (1)| 00:09:23 |  Q1,00 | PCWC |         |
|   6 |       TABLE ACCESS FULL| TRANS_TMP |    11M| 46879   (1)| 00:09:23 |  Q1,00 | PCWP |         |
----------------------------------------------------------------------------------------------------------------


统计信息
----------------------------------------------------------
        273  recursive calls
          0  db block gets
     769352  consistent gets
     768853  physical reads
          0  redo size
        411  bytes sent via SQL*Net to client
        400  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
          1  rows processed
并行扫描全表用时2分35,至少是比最开始快了一些

最后再次尝试一下bitmap

11:38:44 SQL> drop index trans_id;

索引已删除。

已用时间:  00: 00: 01.31
11:41:31 SQL> create bitmap index bitmap_id_idx on trans_tmp(id) online;
11:59:20 SQL> set autotrace trace exp
11:59:36 SQL> select count(1) from trans_tmp;
已用时间:  00: 00: 00.15

执行计划
----------------------------------------------------------
Plan hash value: 4075861796

---------------------------------------------------------------------------------------
| Id  | Operation                     | Name          | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |               |     1 | 29563   (1)| 00:05:55 |
|   1 |  SORT AGGREGATE               |               |     1 |            |          |
|   2 |   BITMAP CONVERSION COUNT     |               |    11M| 29563   (1)| 00:05:55 |
|   3 |    BITMAP INDEX FAST FULL SCAN| BITMAP_ID_IDX |       |            |          |
---------------------------------------------------------------------------------------

11:59:41 SQL> alter index bitmap_id_idx parallel 4;

索引已更改。

已用时间:  00: 00: 00.23
11:59:55 SQL> select count(1) from trans_tmp;
已用时间:  00: 00: 00.23

执行计划
----------------------------------------------------------
Plan hash value: 3303238536

------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name          | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |               |     1 |  8212   (1)| 00:01:39 |        |   |               |
|   1 |  SORT AGGREGATE                   |               |     1 |            |          |        |   |               |
|   2 |   PX COORDINATOR                  |               |       |            |          |        |   |               |
|   3 |    PX SEND QC (RANDOM)            | :TQ10000      |     1 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE                |               |     1 |            |          |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR            |               |    11M|  8212   (1)| 00:01:39 |  Q1,00 | PCWC |            |
|   6 |       BITMAP CONVERSION COUNT     |               |    11M|  8212   (1)| 00:01:39 |  Q1,00 | PCWP |            |
|   7 |        BITMAP INDEX FAST FULL SCAN| BITMAP_ID_IDX |       |            |          |  Q1,00 | PCWP |            |
------------------------------------------------------------------------------------------------------------------------

11:59:58 SQL> set autot on
12:00:12 SQL> select count(1) from trans_tmp;

  COUNT(1)
----------
   8997943

已用时间:  00: 03: 39.95

执行计划
----------------------------------------------------------
Plan hash value: 3303238536

------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name          | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |               |     1 |  8212   (1)| 00:01:39 |        |   |               |
|   1 |  SORT AGGREGATE                   |               |     1 |            |          |        |   |               |
|   2 |   PX COORDINATOR                  |               |       |            |          |        |   |               |
|   3 |    PX SEND QC (RANDOM)            | :TQ10000      |     1 |            |          |  Q1,00 | P->S | QC (RAND)  |
|   4 |     SORT AGGREGATE                |               |     1 |            |          |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR            |               |    11M|  8212   (1)| 00:01:39 |  Q1,00 | PCWC |            |
|   6 |       BITMAP CONVERSION COUNT     |               |    11M|  8212   (1)| 00:01:39 |  Q1,00 | PCWP |            |
|   7 |        BITMAP INDEX FAST FULL SCAN| BITMAP_ID_IDX |       |            |          |  Q1,00 | PCWP |            |
------------------------------------------------------------------------------------------------------------------------


统计信息
----------------------------------------------------------
        229  recursive calls
          0  db block gets
      34045  consistent gets
      32656  physical reads
          0  redo size
        411  bytes sent via SQL*Net to client
        400  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
          1  rows processed
虽然cost很低,但是执行时间却很长,看来还是只能并行全表扫描了

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25680865/viewspace-714224/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25680865/viewspace-714224/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
CockroachDB 是一个分布式数据库系统,它采用了多副本分布式事务协议,以实现高可用性和数据强一致性。在 CockroachDB 中,查询优化是一个非常重要的问题,特别是在面对大量数据时。下面是一些 CockroachDB 中 count 查询优化的建议: 1. 使用索引:使用索引可以让 count 查询更快。当使用 count(*) 进行全表扫描时,CockroachDB 需要扫描整个表,导致查询速度变慢。但是,如果使用索引,则可以只扫描索引,而不是整个表。 2. 避免使用 DISTINCT:DISTINCT 会增加 count 查询的复杂度。如果可以避免使用 DISTINCT,则可以提高查询速度。 3. 使用 WHERE 子句:使用 WHERE 子句可以使查询更快。WHERE 子句可以限制查询的数据集,减少扫描的数据量。 4. 使用 COUNT(column):如果只需要计算某个列的值,可以使用 COUNT(column) 代替 COUNT(*)。这样做可以减少扫描的数据量,从而提高查询速度。 5. 避免使用 OFFSET 和 LIMIT:使用 OFFSET 和 LIMIT 可以分页查询结果,但是对于大量数据来说,这样做可能会导致查询变慢。因此,尽可能避免使用 OFFSET 和 LIMIT。 6. 增加节点数量:如果集群中的节点数量越多,查询的并行度就越高,查询速度也就越快。因此,可以通过增加节点数量来提高查询速度。 总之,对于 count 查询的优化,需要综合考虑多个因素,如索引、WHERE 子句、DISTINCT、OFFSET 和 LIMIT 等。同时,增加节点数量也是提高查询速度的有效方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值