Oracle查询数据表数据很少却很慢

Oracle-数据库性能变慢问题分析 应用运维报障说最近两天业务数据入库和表查询都变得很慢,需要排查一下数据库的性能问题 阅读详情

Oracle查询数据表数据很少却很慢(查询空表很很耗时)

有一个表的数据我要去看一下到底数据是什么样子的,所以我就
select * from tableName 这个表。但是执行了90多秒后,没有任何数据。我就一直很纳闷,为什么空表执行这么慢呢?然后百度了一些资料开始百度的资料说是因为delete这个表造成的碎屑空间,还是没有明白,不同的百度,后来知道了,原来是因为水位线的原因,那么下面截取一段在别人博客里面看到的资料。
Oracle表段中的高水位线HWMhttp://www.cnblogs.com/linjiqin/archive/2012/01/15/2323030.html

在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。
下面我们来谈一下Oracle中Select语句的特性。Select语句会对表中的数据进行一次扫描,但是究竟扫描多少数据存储块呢,这个并不是说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一下,如果刚才是一张刚刚建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于delete语句不影响高水位线,所以高水位线依然在一千万条数据这里。这个时候再一次用select语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。所以有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这个时候其实奥秘就是这里的高水位线了。
那有没有办法让高水位线下降呢,其实有一种比较简单的方法,那就是采用TRUNCATE语句进行删除数据。采用TRUNCATE语句删除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。所以如果需要把表清空,在有可能利用TRUNCATE语句来删除数据的时候就利用TRUNCATE语句来删除表,特别是那种数据量有可能很大的临时存储表。
在手动段空间管理(Manual Segment Space Management)中,段中只有一个HWM,但是在Oracle9iRelease1才添加的自动段空间管理(Automatic Segment Space Management)中,又有了一个低HWM的概念出来。为什么有了HWM还又有一个低HWM呢,这个是因为自动段空间管理的特性造成的。在手段段空间管理中,当数据插入以后,如果是插入到新的数据块中,数据块就会被自动格式化等待数据访问。而在自动段空间管理中,数据插入到新的数据块以后,数据块并没有被格式化,而是在第一次在第一次访问这个数据块的时候才格式化这个块。所以我们又需要一条水位线,用来标示已经被格式化的块。这条水位线就叫做低HWM。一般来说,低HWM肯定是低于等于HWM的。
(2)如何知道一个表的HWM?
a) 首先对表进行分析:
ANALYZE TABLE <tablename> ESTIMATE/COMPUTE STATISTICS;
b) SELECT blocks, empty_blocks, num_rows
FROM user_tables
WHERE table_name = <tablename>;
说明:
BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。
EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块。
让我们以一个有28672行的BIG_EMP1表为例进行说明:
1) SQL> SELECT segment_name, segment_type, blocks
FROM dba_segments
WHERE segment_name='BIG_EMP1';
SEGMENT_NAME SEGMENT_TYPE BLOCKS
----------------- -------------- ---------
BIG_EMP1 TABLE 1024
1 row selected.
2) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS;
Statement processed.
3) SQL> SELECT table_name,num_rows,blocks,empty_blocks
FROM user_tables
WHERE table_name='BIG_EMP1';
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- -------- ------- -------------
BIG_EMP1 28672 700 323
1 row selected.
注意:
BLOCKS + EMPTY_BLOCKS (700+323=1023)比DBA_SEGMENTS.BLOCKS少1个数据库块,这是因为有一个数据库块被保留用作segment header。DBA_SEGMENTS.BLOCKS 表示分配给这个表的所有的数据库块的数目。USER_TABLES.BLOCKS表示已经使用过的数据库块的数目。
4) SQL> SELECT COUNT (DISTINCT
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||
DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"
FROM big_emp1;
Used
----------
700
1 row selected.
5) SQL> delete from big_emp1;
28672 rows processed.
6) SQL> commit;
Statement processed.
7) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS;
Statement processed.
8) SQL> SELECT table_name,num_rows,blocks,empty_blocks
FROM user_tables
WHERE table_name='BIG_EMP1';
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS
--------- -------- ------- ----------
BIG_EMP1 0 700 323
1 row selected.
9) SQL> SELECT COUNT (DISTINCT
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||
DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"
FROM big_emp1;
Used
----------
0 ----这表名没有任何数据库块容纳数据,即表中无数据
1 row selected.
10) SQL> TRUNCATE TABLE big_emp1;
Statement processed.
11) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS;
Statement processed.
12) SQL> SELECT table_name,num_rows,blocks,empty_blocks
2> FROM user_tables
3> WHERE table_name='BIG_EMP1';
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- -------- -------- ------------
BIG_EMP1 0 0 511
1 row selected.
13) SQL> SELECT segment_name,segment_type,blocks
FROM dba_segments
WHERE segment_name='BIG_EMP1';
SEGMENT_NAME SEGMENT_TYPE BLOCKS
------------ ------------- ------
BIG_EMP1 TABLE 512
1 row selected.
注意:
TRUNCATE命令回收了由delete命令产生的空闲空间,注意该表分配的空间由原先的1024块降为512块。
为了保留由delete命令产生的空闲空间,可以使用TRUNCATETABLE big_emp1 REUSE STORAGE.
用此命令后,该表还会是原先的1024块。
(3)修正ORACLE表的高水位线
在ORACLE中,执行对表的删除操作不会降低该表的高水位线。而全表扫描将始终读取一个段(extent)中所有低于高水位线标记的块。如果在执行删除操作后不降低高水位线标记,则将导致查询语句的性能低下。下面的方法都可以降低高水位线标记。
1.执行表重建指令 alter table table_name move;
(在线转移表空间ALTER TABLE 。。。 MOVETABLESPACE 。。。ALTER TABLE 。。。MOVE 后面不跟参数也行,不跟参数表还是在原来的表空间,move后记住重建索引。如果以后还要继续向这个表增加数据,没有必要move,只是释放出来的空间,只能这个表用,其他的表或者segment无法使用该空间)
2.执行alter table table_name shrink space; 注意,此命令为Oracle 10g新增功能,再执行该指令之前必须允许行移动alter tabletable_name enable row movement;
3.复制要保留的数据到临时表t,drop原表,然后rename临时表t为原表
4.emp/imp
5.alter table table_name deallocate unused
6.尽量truncate吧

 

oracle 11g 表查询慢优化过程 今天维护数据库时发现有条sql查询很慢,用set autot 发现是走upload_date字段索引的,当细致查下来发现其实并没有走索引。通过10046事件,发现走的是全表扫描: 从下面看出wait主要放映在 direct path read 该等待事件是ORACLE 11G的新特性。 Oracle Database 11g中有一个新特性,全表扫描可以通过直接路径读的方式来执行(Direct ... 阅读详情

相关推荐

Oracle 响应时间缓慢问题解决 MySQL

此外,合理配置数据库服务器的参数,如DB_CACHE_SIZE、PGA_AGGREGATE_TARGET等,也可以提高数据库的性能。确保你的查询语句使用了正确的索引,并且避免使用笛卡尔积等低效的操作。确保你的表上有适当的索引,并且索引是最有效的。在这个示例中,原始查询语句中的日期比较可能导致全表扫描,而优化后的查询语句使用了TO_DATE函数将字符串转换为日期类型,可以更有效地使用索引。在这个示例中,我们增加了数据库缓存和PGA聚合目标的大小,以提高数据库服务器的性能。在这个示例中,原始查询语句中的。

SmufHtml的博客 329

很色,非常色,十分色,格外色,异常色,特别色,相当色,太色了!

■■★●◆lightpink(浅粉红)■■★●◆pink(粉红)■■★●◆crimson(腥红)■■★●◆lavenderblush(苍白的紫罗兰红)■■★●◆palevioletred(脸红的淡紫红)■■★●◆hotpink(热情的粉红)■■★●◆mediumvioletred(适中的紫罗兰红)■■★●◆orchid(兰花紫)■■★●◆thistle(苍紫)■■★●◆plum(轻紫)■■★●◆v

coldwindflyrain的专栏 243万+

基于ESP32的摩托车蓝牙对讲系统开发实践

蓝牙音频传输技术在现代通信中扮演着重要角色,其核心原理是通过无线射频实现数字音频信号的双向传输。在工程实践中,蓝牙HFP协议常用于语音通信场景,而ESP32等嵌入式平台因其低成本和高集成度成为DIY项目的理想选择。本项目通过ESP32-WROOM-32D开发板结合PCM5102 DAC和INMP441数字麦克风等模块,构建了一套摩托车骑行专用的蓝牙对讲系统。该系统特别针对高速移动环境下的风噪抑制和连接稳定性进行了优化,采用数字信号处理技术实现实时降噪,并通过I2S接口确保音频质量。这种方案不仅成本控制在30

weixin_33239721的博客 414

世界很操蛋,但没有你想象的那么坏

从小我们就变要求一模一样。服装一样,发型一样,就连人生的梦想也一模一样。考个像样的学校,找个像样的工作,租个像样的房子,过个像样的人生。曾经有着自己的梦想心跳很执着,曾经有着自己喜欢的东西就算没有人明白也没关系。终于有一天,你听最流行的音乐,看最卖座的电影,去最热门的电影,读最畅销的图书,什么时候起,是谁把我变成现在的我。      老妈说,总有一天你的棱角会被世界磨平,你会拔掉身上的

∧︵∧全世界的屋顶 ∧︵∧ 4907

给新考上北大软件与微电子学院的同学——利用北大资源

利用北大资源 首先,恭喜大家考入北京大学!希望软院成为各位人生旅途中快乐的一站! 说明:限于本人搜集能力有限,本文只列出本人常利用的资源(上课老师会告知的资源也不在此列),本文所述的资源只是北大可利用资源的一个子集。 一、 图书馆资源:北京大学图书馆的资源数量,我就不多废话了,这里主要说一样怎样利用这些资源。 a) 传统资源分布及查找:这种资源主要包括纸质书箱、杂志、光盘等内...

Felomeng的技术博客 1万+

利用李雅普诺夫函数开发航天器姿态控制系统

本文基于李雅普诺夫函数控制方法,采用修正罗德里格斯参数(MRP)描述航天器姿态,设计了姿态控制律。通过构造能量型李雅普诺夫函数,推导出保证系统稳定的控制闭环方程,实现了航天器从初始状态到目标状态的稳定转换。针对MRP参数可能出现的奇异性问题,采用影子集进行规避。仿真实验包含两种模式:非追踪模式(目标状态为0)和追踪模式(目标为三角函数轨迹)。结果表明,该控制方法能够有效实现姿态稳定和轨迹跟踪,在短暂调整后即可精确跟随目标轨迹。控制律设计考虑了不同参考系间的转换,通过DCM矩阵处理目标角速度的坐标变换问题。

weixin_50227659的博客 1223

Oracle查询数据表数据很少却很慢(查询空表很很耗时)

Oracle表数据很少,但是select时候却执行很长时间; Oracle表数据很少,但是select时候却执行很长时间; Oracle表数据很少,但是select时候却执行很长时间;

conanju_pc的博客 3万+

手把手教你用MATLAB/Simulink模拟微电网潮流方向(附代码下载)

本文提供了一份详细的MATLAB/Simulink微电网潮流仿真实战指南。通过手把手教学,指导读者从零搭建包含光伏、储能和负荷的微电网模型,并模拟并网、孤岛等多种运行场景下的潮流方向变化。文章核心在于利用Simulink实现微电网的动态潮流分析与可视化,帮助工程师深入理解分布式能源系统中的功率平衡与控制策略。

weixin_28314575的博客 107

Oracle - 如何提高SQL的查询效率(where条件优化)

在Oracle数据库中编写查询语句的时候,经常碰到的一个问题就是SQL优化,那么今天就总结一下Where之后,如何进行条件的优化 优化规则: 一、选择合适的基础表 Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上...

崔向阳@李晓的博客 7993

Codex 100个真实案例 - 用AI自动生成API测试用例(接口测试全覆盖)

API 测试是保障后端质量的关键环节,但手写测试用例既枯燥又容易遗漏。本案例将展示如何用 Codex 从 Swagger/OpenAPI 规范文档自动生成 pytest 测试用例——包括正常流程测试、边界值测试、异常参数测试、性能压力测试,还能自动生成 Mock 数据和精美的 HTML 测试报告。全程自然语言驱动,让 API 测试覆盖率从 0 飙到 90%+!

yueyeguzhuo的专栏 271

MATLAB代码转到FPGA代码

添加完文件之后,需要设置输入的数据类型,设置完之后点击Workflow Advisor。MATLAB文件包含一个功能实现文件和测试文件。对应FPGA中的功能文件和测试文件。然后,将功能文件和测试文件添加到相应位置。然后选择APP中的HDL Coder代码。首先需要编写好MATLAB文件。点击链接,就可以查看你看到的代码。可以自己生成代码的语言类型。

小柚子的博客 3062

数据量很大,分页查询很慢,怎么优化?

作者:悠悠i,来源:http://uee.me/aVSnD当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需...

Java技术栈,分享最主流的Java技术 1万+

【STK】手把手教你利用STK进行光电红外仿真03-STK/EOIR模块属性之二 导弹等目标的EOIR设置

上一节介绍了如何设置传感器的通用属性和空间、光学、光谱、辐射四种专项属性。这一节介绍如果对导弹等目标的EOIR属性进行修改。

weixin_44184852的博客 2204

【Oracle】Oracle大数据量delete清空后查询很慢

【问题】原有一千万条数据表,delete 后仅保留了一天的数据,32条记录select竟然耗时34秒。 【分析】 1、根据以往经验的估计delete时没有恢复oracle的高水位线。 2、以下为参考资料 在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当

乙醚的专栏 4134

FM收音机调试-RDA5807M

收音机调试 IC型号:RDA5807M

mangofu的博客 6169

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

oracle入门很简单:八、oracle数据表

1.创建oracle数据表 创建oracle数据表的语法如下: create table命令用于创建一个oracle数据表;括号内列出了数据表应当包含的列及列的数据类型;tablespace则指定该表的表空间。 创建数据表students。 在该创建语句中,依次定义了student_id、student_name、student_age、status及version等列;t

一步一步勇敢往前走 2万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Oracle百万级以上数据表SQL查询优化

本文系统介绍了Oracle百万级数据表SQL查询优化的全流程方法。首先强调执行计划和统计信息的重要性,然后详细解析索引设计策略(B树、复合、位图索引)和SQL优化技巧(避免全表扫描、子查询优化、EXISTS用法)。针对超大数据量,提出分区表和并行查询方案,并介绍物化视图、SQL提示等高级技术。同时涵盖硬件参数调优、AWR报告分析等监控工具的使用,最后指出过度索引和忽视统计信息更新等常见误区。全文为DBA和开发人员提供了针对大型Oracle表查询性能优化的系统解决方案。

weixin_52726252的博客 1083

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Oracle数据表大量数据删除后查询变慢问题

近期发现一张数据表经常了转移备份操作,并在删除掉大量数据后,发现反而比表中有百万条数据的时候查询速度还慢 最后查找原因是因为对应存放大数据量的表的表空间还是很大了,一般没有特殊设定的情况下表空间大小为64KB,所以尽管表里面更少的数据但是查询的速度还是非常地慢。这个时候可以用以下代码查看对应表所占表空间的大小 select sum(bytes)/(1024*1024) from user_segm...

xiongfei0131的专栏 2743

oracle数据库大数据表通过分区优化查询速度

数据库分区查询通过分区裁剪(Partition Pruning)显著提升查询效率,其核心原理是仅扫描相关分区而非全表。合理选择分区键(如时间字段)并确保查询条件包含分区键,可减少I/O和CPU负载,支持并行处理。通过执行计划可验证分区是否生效(如PARTITION RANGE SINGLE标识)。优化建议包括精确匹配分区边界、创建本地索引以及批量操作时指定分区名。同时需注意避免分区键函数转换、控制分区数量以平衡性能与管理开销。分区表设计尤其适合时间序列数据管理,能有效提升范围查询、高并发访问和大规模数据操作

m0_59061013的博客 1576

查询Oracle当前用户下,所有数据表的总条数

查询Oracle当前用户下,所有数据表的总条数

君故的博客 7763

Oracle中对两个数据表交集的查询(intersect和in)

  Oracle关系型数据库管理系统是世界上流行的关系数据库,它是一个极其强大、灵活和复杂的系统,据说,在使用oracle时应有这样的思想,那就是在SQL中几乎可以实现任何一种想法。  下面向大家介绍使用SQL查两个Oracle数据表查询的相同数据的方法,笔者感到这两种方法执行效率高、使用方便。  第一种方法:利用操作符intersect  intersect操作符用来合并两个查询,返回两个查询中

A Little Bit More...... 2488

oracle大数据表 如何建立索引

大数据表,按某字段T(Varchar型的时间字段)分区,一个月一个分区。有常用业务字段A和B(其它字段并不重要),字段A值的重复率不高,B的重复率稍高。建有索引1:A,组合索引2:T,B。对该表的常用查询有两种:通过条件T、A查询,通过条件T、B查询。原来应用一直正常,近期由于其它分区表查询索引选择策略不优化的问题,对所有大数据表的分区表进行数据分析(1%抽样,对数据和索引进行分析),促使O

我一路走来--- 1万+

oracle查询多张表交集,Oracle中对两个数据表交集的查询-专栏,ORACLE

oracle关系型管理系统是世界上流行的关系,它是一个极其强悍、灵活和复杂的系统,据说,在使用oracle时应有这样的观念,那就是在sql中近乎可以推动任何一种想法。下面向你们介绍使用sql查两个oracle数据表查询的同样数据的方式,笔者感到这两种方式执行强度高、使用便于。第一种方法:利用操作符intersectintersect操作符用来合并两个查询,返回两个查询中都存在的记录,即返回两个查询...

weixin_42187923的博客 989

Oracle新建的用户看不到表,Oracle 创建用户及数据表的方法

Oracle 创建用户及数据表的方法更新时间:2009年09月25日 23:13:29 作者:刚开始学习oracle的朋友可以看下,这个是基础了。一、概念1. 数据库 (Database)什么是数据库?数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。这种数据集合具有如下特点:尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序,对数据的增、删、改...

weixin_30868873的博客 3482

oracle两表交集查询,Oracle对两个数据表交集的查询

正在看的ORACLE教程是:Oracle对两个数据表交集的查询。Oracle关系型数据库管理系统是世界上流行的关系数据库,它是一个极其强大、灵活和复杂的系统,据说,在使用oracle时应有这样的思想,那就是在SQL中几乎可以实现任何一种想法。下面向大家介绍使用SQL查两个Oracle数据表查询的相同数据的方法,笔者感到这两种方法执行效率高、使用方便。第一种方法:利用操作符intersectinte...

weixin_27282525的博客 1091

Oracle数据表的相关操作

一、Oracle数据表的相关操作 创建表所需的必要内容: 表名 表里面的属性名称和数量 每一个属性的数据类型和形式 每一个属性的约束 表名和属性的名称的原则: 字母开头 尽量不要使用汉字 通俗易懂 Oracle中的数据类型: 数字类型-Number 字符类型-char(不可改数量的字符)、varchar2(可变数量的字符) 日期类型-Date Oracle中的约束: 非空约束:notnull。要求某一个属性的取值不能为空; 默认约束:default。要求某一个属...

m0_59315964的博客 652
上一篇: 接口测试用例覆盖方法
下一篇: 一个insert插入语句很慢的优化
sysmedia
博客等级 码龄24年 70粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值