关于验证表中有无数据的方法比较

简介: 在平时的工作中,有时候需要准备一些脚本,比如能够简单验证一下表是否可访问,或者验证表中有无数据等。 今天在测试环境进行了简单的模拟,发现还是有很大的差别。 简单来说,要实现如上的需求有两种方式,一种是通过count来判断,另外一种是通过rowid来判断。
在平时的工作中,有时候需要准备一些脚本,比如能够简单验证一下表是否可访问,或者验证表中有无数据等。
今天在测试环境进行了简单的模拟,发现还是有很大的差别。
简单来说,要实现如上的需求有两种方式,一种是通过count来判断,另外一种是通过rowid来判断。
举个例子。
先来看一个大表,但是某个分区没有数据的情况。

select count(1)  from  APP_TMP.INVOICE partition(A8_B8)  where rownum Execution Plan
----------------------------------------------------------
Plan hash value: 1238501171
----------------------------------------------------------------------------------------------------
| Id  | Operation                | Name            | Rows  | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |                 |     1 |     1   (0)| 00:00:01 |       |       |
|   1 |   SORT AGGREGATE          |                 |     1 |            |          |       |       |
|*  2 |   COUNT STOPKEY          |                 |       |            |          |       |       |
|   3 |    PARTITION RANGE SINGLE|                 |     1 |     1   (0)| 00:00:01 |    39 |    39 |
|   4 |     INDEX FULL SCAN      | INVOICE_1IX     |     1 |     1   (0)| 00:00:01 |    39 |    39 |
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(ROWNUM Statistics
----------------------------------------------------------
       1736  recursive calls
          0  db block gets
       7308  consistent gets
          0  physical reads
          0  redo size
        525  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
         18  sorts (memory)
          0  sorts (disk)
          1  rows processed


SQL> select rowid from  APP_TMP.INVOICE partition(A8_B8)  where rownum   2  /
no rows selected


Execution Plan
----------------------------------------------------------
Plan hash value: 1950573833
-----------------------------------------------------------------------------------------------------------
| Id  | Operation               | Name            | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |                 |     1 |    12 |     1   (0)| 00:00:01 |       |       |
|*  1 |   COUNT STOPKEY          |                 |       |       |            |          |       |       |
|   2 |   PARTITION RANGE SINGLE|                 |     1 |    12 |     1   (0)| 00:00:01 |    39 |    39 |
|   3 |    INDEX FULL SCAN      | INVOICE_1IX     |     1 |    12 |     1   (0)| 00:00:01 |    39 |    39 |
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(ROWNUM Statistics
----------------------------------------------------------
          5  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
        333  bytes sent via SQL*Net to client
        509  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed
大体来说,查询时间都基本一致,可能使用Rowid的方式效率要略微好一些,这两种方式采用的执行计划也是不同的。注意如上标黄的部分。

再来测试一个大表中分区数据最多的。
SQL> alter session force parallel query parallel 16;
Session altered.
Elapsed: 00:00:00.00
SQL> select count(1) from AGREEMENT_PARAM partition(AMAXVALUE);
  78085245
Elapsed: 00:00:04.89
数据有7千多万,算比较多的了。

然后再次尝试count,和rowid方式

SQL> select count(1) from AGREEMENT_PARAM partition(AMAXVALUE) where rownum
Execution Plan
----------------------------------------------------------
Plan hash value: 2234036749
-----------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name                   | Rows  | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |                        |     1 | 41914   (1)| 00:08:23 |       |       |
|   1 |  SORT AGGREGATE          |                        |     1 |            |          |       |       |
|*  2 |   COUNT STOPKEY          |                        |       |            |          |       |       |
|   3 |    PARTITION RANGE SINGLE|                        |    78M| 41914   (1)| 00:08:23 |    11 |    11 |
|   4 |     INDEX FULL SCAN      | AGREEMENT_PARAM_PK     |    78M| 41914   (1)| 00:08:23 |    11 |    11 |
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(ROWNUM Statistics
----------------------------------------------------------
        162  recursive calls
          0  db block gets
        234  consistent gets
          0  physical reads
          0  redo size
        525  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          8  sorts (memory)
          0  sorts (disk)
          1  rows processed


SQL>  select rowid from AGREEMENT_PARAM partition(AMAXVALUE) where rownum
Elapsed: 00:00:00.01
Execution Plan
----------------------------------------------------------
Plan hash value: 4116254344
------------------------------------------------------------------------------------------------------------------
| Id  | Operation               | Name                   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |                        |     1 |    12 |     1   (0)| 00:00:01 |       |       |
|*  1 |  COUNT STOPKEY          |                        |       |       |            |          |       |       |
|   2 |   PARTITION RANGE SINGLE|                        |     1 |    12 |     1   (0)| 00:00:01 |    11 |    11 |
|   3 |    INDEX FULL SCAN      | AGREEMENT_PARAM_PK     |     1 |    12 |     1   (0)| 00:00:01 |    11 |    11 |
------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(ROWNUM
Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
        537  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

可以看到,rowid的优势就出来了,查询速度要快的多。时间上提高了很多倍。逻辑读也少了很了很多。
所以大家在平时准备类似的脚本的时候,可以优先考虑rowid,毕竟这是oracle底层支持比较好的方案。

最后有的朋友,可能疑惑为什么不适用rowid=0这种方式呢。可能效果还要好些。
测试结果如下。我就不等待它执行完成了,执行了40秒还是没有反应。
  1* select count(1) from AGREEMENT_PARAM partition(AMAXVALUE) where rownum=0
                     *
ERROR at line 1:
ORA-01013: user requested cancel of current operation
Elapsed: 00:00:39.94

目录
相关文章
|
算法 Java Apache
运筹优化工具库介绍(二)
运筹优化工具库介绍
1831 0
|
关系型数据库 MySQL 数据安全/隐私保护
允许远程链接mysql,开放3306端口
允许远程链接mysql,开放3306端口
允许远程链接mysql,开放3306端口
|
8月前
|
机器学习/深度学习 监控 Linux
ollama+openwebui本地部署deepseek 7b
Ollama是一个开源平台,用于本地部署和管理大型语言模型(LLMs),简化了模型的训练、部署与监控过程,并支持多种机器学习框架。用户可以通过简单的命令行操作完成模型的安装与运行,如下载指定模型并启动交互式会话。对于环境配置,Ollama提供了灵活的环境变量设置,以适应不同的服务器需求。结合Open WebUI,一个自托管且功能丰富的Web界面,用户可以更便捷地管理和使用这些大模型,即使在完全离线的环境中也能顺利操作。此外,通过配置特定环境变量,解决了国内访问限制的问题,例如使用镜像站来替代无法直接访问的服务。
|
12月前
|
机器学习/深度学习 数据采集 数据挖掘
11种经典时间序列预测方法:理论、Python实现与应用
本文将总结11种经典的时间序列预测方法,并提供它们在Python中的实现示例。
2165 2
11种经典时间序列预测方法:理论、Python实现与应用
|
8月前
|
并行计算
vllm部署模型要点
vllm部署模型要点
|
JavaScript
在Vue中获取DOM元素的实际宽高
【10月更文挑战第2天】
1163 76
【Matlab 2019b】Matlab在figure中如何把横坐标或者纵坐标单位转换为10的几次方
本文提供了在Matlab中如何改变图形坐标轴单位的方法,举例说明了如何将横轴刻度标签设置为特定的年份,并调整刻度取值以匹配自变量的变化。
1965 1
|
SQL Java 数据库连接
MyBatis精髓揭秘:Mapper代理实现的黑盒探索
MyBatis精髓揭秘:Mapper代理实现的黑盒探索
224 1
循环滑动的工具条
循环滑动的工具条
74 0
|
存储 安全 关系型数据库
4个MySQL优化工具AWR,帮你准确定位数据库瓶颈!
4个MySQL优化工具AWR,帮你准确定位数据库瓶颈!
680 0