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

在平时的工作中,有时候需要准备一些脚本,比如能够简单验证一下表是否可访问,或者验证表中有无数据等。
今天在测试环境进行了简单的模拟,发现还是有很大的差别。
简单来说,要实现如上的需求有两种方式,一种是通过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

时间: 2024-11-28 18:59:35

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

Excel表格中汇总多个数据表中的数据的方法

  Excel表格中汇总多个数据表中的数据的方法           1.打开需要处理的工作簿,在这个工作簿中,"11月采购表"和"12月采购表"工作表包含需要合并的数据,如图1所示."合计"工作表用于放置进行合并计算后的数据,其结构如图2所示. 图1 需要合并的两张工作表 图2 "合计"工作表的结构 2.在"合计"工作表中单击选择放置合并计算结果的单元格区域中的第一个单元格,然后在功能区"数据&

jsp-java 中JSP 实现把excel表中数据导入到mysql数据库中的表中的具体实现方法

问题描述 java 中JSP 实现把excel表中数据导入到mysql数据库中的表中的具体实现方法 java 中JSP 实现把excel表中数据导入到mysql数据库中的表中的具体实现方法 解决方案 参考:http://blog.csdn.net/casilin/article/details/5750773 解决方案二: 楼主幸苦了!!谢谢分享!!! 解决方案三: jsp导excel到mysql数据库 http://wenku.it168.com/d_000468232.shtml

SQL同时更新两张表中关联数据方法

文章标题比较难理解,先让我举个例子,解释一下要实现的操作. 有两张表,t_statistics.t_add,如下 t_statistics数据 t_add数据 现在需要将 t_statistics 表 addtotal 字段的值减去 t_add 表 total 字段的值,条件是两者有相同的 id,所以正确的操作之后,t_add 记录无变化,t_statistics 记录如下 测试的数据库为Oracle(Oracle Database 10g Enterprise Edition Release

从Java的jar文件中读取数据的方法

  这篇文章主要介绍了从Java的jar文件中读取数据的方法,实例分析了java档案文件的相关操作技巧,需要的朋友可以参考下 本文实例讲述了从Java的jar文件中读取数据的方法.分享给大家供大家参考.具体如下: Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR 文件格式支持压缩.身份验证和版本,以及许多其它特性. 从 JAR 文件中得到它所包含

sqlite-如何将导入到数据库表中的数据保存在程序中,而不用每次换调试机时还得重新导入数据

问题描述 如何将导入到数据库表中的数据保存在程序中,而不用每次换调试机时还得重新导入数据 如题:我有一张excel的表,我将其存为.csv文件,然后通过dos命令下的sqlite3命令导入到了数据库表中,问题是如果不换机子,导入到该数据库表中的数据永久有效.如果我换机子调试的话,该数据库表中的数据就不存在了,会报错,请问有没有解决办法?谢谢! 解决方案 最好存入远程数据库每次启动同步下来数据就可以了,sqlite是系统自带的数据库具体的就是http://blog.csdn.net/tianyit

在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题

原文:在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题 SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="D:\KK.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$] 问题:消息 15281,级别 16,状态 1,第 1 行 SQL Server 阻止了对组件 'Ad Hoc Dis

mysql-请问,excel表中的数据如何倒入MySQL数据库?谢谢!

问题描述 请问,excel表中的数据如何倒入MySQL数据库?谢谢! 求详细步骤1111111111111111111111111111谢谢!谢谢! 解决方案 方法很多:1.phpmyadmin导入,格式选择csv,导入即可.注意文件格式2.使用phpexcel插件将excel数据读入成数组,然后用php插入mysql

hbase-Hive中在整合HBase的表中插入数据时报错

问题描述 Hive中在整合HBase的表中插入数据时报错 伪分布式模式下整合Hadoop 2.2.0(自己基于Ubuntu 64位系统编译的)+HBase 0.98+Hive 0.14,其他功能操作都正常,但是在Hive中往基于HBase存储的表中插入数据时报错,网上找了很多方法,但都没用,具体错误如下: java.lang.IllegalArgumentException: Can not create a Path from an empty string at org.apache.had

excel文件-C#读取剪切板(Clipboard)中的数据的方法

问题描述 C#读取剪切板(Clipboard)中的数据的方法 小弟在这里求教各位大神一个问题,如何将excel文件数据表复制到VS的剪贴板中,再利用C#读取剪切板(Clipboard)中的数据的方法 解决方案 Clipboard.GetDataObject google 用法 解决方案二: http://www.cnblogs.com/_zjl/archive/2011/06/01/2066498.html 这个博客写的蛮清楚地 楼主可以参考一下 其实核心也就是调用GetDataObject 方