首页 数据库 mysql教程 由数据库的HWM想起的对ArcSDE数据库的性能优化

由数据库的HWM想起的对ArcSDE数据库的性能优化

Jun 07, 2016 pm 03:48 PM
oracle 优化 性能 数据库

在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也

在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。HWM通常增长的幅度为一次5个数据块.

 

Select语句会对表中的数据进行一次扫描,但是究竟扫描多少数据存储块呢,这个并不是说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一下,如果刚才是一张刚刚建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于delete语句不影响高水位线,所以高水位线依然在一千万条数据这里。这个时候再一次用select语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。所以有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这个时候其实奥秘就是这里的高水位线了。

 

    那有没有办法让高水位线下降呢,其实有一种比较简单的方法,那就是采用TRUNCATE语句进行删除数据。采用TRUNCATE语句删除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。所以如果需要把表清空,在有可能利用TRUNCATE语句来删除数据的时候就利用TRUNCATE语句来删除表,特别是那种数据量有可能很大的临时存储表。


---------------------感谢http://blog.csdn.net/tianlesoftware的相关总结

那么由数据库Oracle的高水位线来延伸到我们的ArcSDE数据库,我们在进行编辑,不管是版本编辑或者是非版本编辑,都有可能进行删除操作,更新也是删除再新增的过程,那么如果用户的编辑操作删除占的比重比较大时,就面临着上面所说的问题,更不要说有可能有用户出现将整个要素类的要素全部删除的情况,那么HWM的情况就需要我们注意了。

我们来做个实验,我在数据库中导入一个要素类,然后将要素全表删除掉,我们看看有什么情况发生。

导入之后我们查看图层记录

SQL> select count(*) from zd;

  COUNT(*)
----------
      4555
登录后复制
我们查看一下这个图层(表)所有分配的Block
SQL> select segment_name,segment_type,blocks from user_segments where segment_name='ZD';

SEGMENT_NAME                                                                      SEGMENT_TYPE        BLOCKS
--------------------------------------------------------------------------------- ------------------ ----------
ZD                                                                                TABLE                  256
登录后复制
然后我们进行ArcGIS的分析操作
SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table_name='ZD';

TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ---------- ------------
ZD                                   4555        244            0
登录后复制
经过分析之后,我们可以看到图层的行数已经要素所占的Blocks,但是empty_blocks为空,我们可以使用Oracle的分析功能来实现。(注意,ArcGIS的分析功能其实是调用了 dbms_stats的存储过程,和Oracle本身分析有区别)
SQL> analyze table ZD compute statistics;

表已分析。

SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table_name='ZD';

TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ---------- ------------
ZD                                   4555        244           12
登录后复制
然后我们将整个要素类的数据进行非版本编辑的删除
SQL> select count(*) from zd;

  COUNT(*)
----------
         0

SQL> select segment_name,segment_type,blocks from user_segments where segment_name='ZD';

SEGMENT_NAME                                                                      SEGMENT_TYPE        BLOCKS
--------------------------------------------------------------------------------- ------------------ ----------
ZD                                                                                TABLE                  256

SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table_name='ZD';

TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ---------- ------------
ZD                                   4555        244           12
登录后复制
由上面可以看到,虽然我们的表里面的记录已经为空了,但是所占用的Blocks仍然存在,那么由上面的概念表述所说,我们在进行查询的时候不是看表里面的记录多少,而是针对某个表所占的blocks进行搜索,如果上面的情况,那么无疑我们消耗了大量的无效的系统资源。


我们可以使用Trucate表的方法来处理

SQL> truncate table zd;

表被截断。

SQL> select segment_name,segment_type,blocks from user_segments where segment_name='ZD';

SEGMENT_NAME                                                                      SEGMENT_TYPE        BLOCKS
--------------------------------------------------------------------------------- ------------------ ----------
ZD                                                                                TABLE                    8

SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table_name='ZD';

TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ---------- ------------
ZD                                   4555        244           12
登录后复制
虽然所占用的blocks变成默认的8KB了,但是我们的统计信息没有改变,我们需要重新统计一下
SQL> exec dbms_stats.gather_table_stats('TEST','ZD');

PL/SQL 过程已成功完成。

SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table_name='ZD';

TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ---------- ------------
ZD                                      0          0           12

SQL> analyze table ZD compute statistics;

表已分析。

SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table_name='ZD';

TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ---------- ------------
ZD                                      0          0            8
登录后复制
从上面的实验我们可以将HWM的知识体会的比较深。


但是在现实的业务中并不是将某些表全部删除,而是进行部分的删除,那么我们可以使用另外一种方法来处理。

在上面的例子的基础上,我删除了若干条记录,然后进行统计分析

SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table_name='ZD';

TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ---------- ------------
ZD                                    571        244           12
登录后复制
我们可以看到,在没有经过任何处理情况下,只有行数变化了,所占用的blocks和emptry_blocks都是和原来一样,那么我们进行
SQL> alter table zd move;

表已更改。
登录后复制
然后在进行重新统计
SQL> exec dbms_stats.gather_table_stats('TEST','ZD');
BEGIN dbms_stats.gather_table_stats('TEST','ZD'); END;

*
第 1 行出现错误:
ORA-20000: index "TEST"."R132_SDE_ROWID_UK"  or partition of such index is in unusable state
ORA-06512: 在 "SYS.DBMS_STATS", line 20337
ORA-06512: 在 "SYS.DBMS_STATS", line 20360
ORA-06512: 在 line 1
登录后复制
提示ZD表中的R132_SDE_ROWID_UK索引对象有问题,需要注意一下,当我们进行了上面的move操作之后,我们必须对索引(这个索引是属性索引)进行重建
SQL> alter index R132_SDE_ROWID_UK rebuild online;

索引已更改。

SQL> exec dbms_stats.gather_table_stats('TEST','ZD');

PL/SQL 过程已成功完成。

SQL> analyze table ZD compute statistics;

表已分析。

SQL> select table_name,num_rows,blocks,empty_blocks from user_tables where table_name='ZD';

TABLE_NAME                       NUM_ROWS     BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ---------- ------------
ZD                                    571         24            0
登录后复制
这样的话,才能看到实际的结果。

那么如果是版本编辑,找到相关的A表、D表,操作应该是类似的。


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

说明:针对上面实验,我们可以针对某个我们常编辑的图层,而且定位到这个图层的效率很低,我们可以看看是不是跟HWM有关系,其实上面讲的如果没有听明白,没有关系,最简单的方法,将你的效率低的图层,导出来到FGDB里面,然后数据库删除掉该图层,再导进去,其实变相的就没有这种负担了.前提你不再大量编辑了。


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

oracle如何查表空间大小 oracle如何查表空间大小 Apr 11, 2025 pm 08:15 PM

要查询 Oracle 表空间大小,请遵循以下步骤:确定表空间名称,方法是运行查询:SELECT tablespace_name FROM dba_tablespaces;查询表空间大小,方法是运行查询:SELECT sum(bytes) AS total_size, sum(bytes_free) AS available_space, sum(bytes) - sum(bytes_free) AS used_space FROM dba_data_files WHERE tablespace_

oracle数据库如何导入 oracle数据库如何导入 Apr 11, 2025 pm 08:06 PM

数据导入方法:1. 使用 SQLLoader 实用程序:准备数据文件、创建控制文件、运行 SQLLoader;2. 使用 IMP/EXP 工具:导出数据、导入数据。提示:1. 大数据集推荐 SQL*Loader;2. 目标表应存在,列定义匹配;3. 导入后需验证数据完整性。

如何在oracle中创建表 如何在oracle中创建表 Apr 11, 2025 pm 08:00 PM

创建 Oracle 表涉及以下步骤:使用 CREATE TABLE 语法指定表名、列名、数据类型、约束和默认值。表名应简洁、描述性,且不超过 30 个字符。列名应描述性,数据类型指定列中存储的数据类型。NOT NULL 约束确保列中不允许使用空值,DEFAULT 子句可指定列的默认值。PRIMARY KEY 约束标识表的唯一记录。FOREIGN KEY 约束指定表中的列引用另一个表中的主键。请参见示例表 students 的创建,其中包含主键、唯一约束和默认值。

Oracle安装失败如何卸载 Oracle安装失败如何卸载 Apr 11, 2025 pm 08:24 PM

Oracle 安装失败的卸载方法:关闭 Oracle 服务,删除 Oracle 程序文件和注册表项,卸载 Oracle 环境变量,重新启动计算机。若卸载失败,可使用 Oracle 通用卸载工具手动卸载。

oracle中乱码怎么解决 oracle中乱码怎么解决 Apr 11, 2025 pm 10:09 PM

Oracle 乱码问题可以通过以下步骤解决:检查数据库字符集以确保与数据相匹配。设置客户端字符集以与数据库相匹配。转换数据或修改列字符集以匹配数据库字符集。使用 Unicode 字符集,并避免多字节字符集。检查数据库和客户端的语言设置是否正确。

为什么要使用mysql?利益和优势 为什么要使用mysql?利益和优势 Apr 12, 2025 am 12:17 AM

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

oracle视图如何加密 oracle视图如何加密 Apr 11, 2025 pm 08:30 PM

Oracle 视图加密允许您加密视图中的数据,从而增强敏感信息安全性。步骤包括:1) 创建主加密密钥 (MEk);2) 创建加密视图,指定要加密的视图和 MEk;3) 授权用户访问加密视图。加密视图工作原理:当用户查询加密视图时,Oracle 使用 MEk 解密数据,确保只有授权用户可以访问可读数据。

oracle打不开怎么办 oracle打不开怎么办 Apr 11, 2025 pm 10:06 PM

Oracle 打不开的解决办法包括:1. 启动数据库服务;2. 启动监听器;3. 检查端口冲突;4. 正确设置环境变量;5. 确保防火墙或防病毒软件未阻止连接;6. 检查服务器是否已关闭;7. 使用 RMAN 恢复损坏的文件;8. 检查 TNS 服务名称是否正确;9. 检查网络连接;10. 重新安装 Oracle 软件。

See all articles