达梦SQL优化

1、基本概念

执行计划:
        执行计划是SQL语句的执行方式,由查询优化器为语句设计的执行方式,交给执行器去执行。在SQL命令行使用EXPLAIN可以打印出语句的执行计划。
操作符:
        操作符是SQL执行的基本单元,所有的SQL语句最终都是转换成一连串的操作符最后在服务器上执行,得到需要的结果,
        操作符也是读懂执行计划的基础,这里列举一下经常出现的操作符:CSCN SSCN SSEK CSEK BLKUP
        这些操作符是SQL查询数据的原始来源,SQL里面出现的基表,都会出现在这些操作符的描述中,通过这些操作符来确定对应的表在执行计划中在何时以什么样的方式进入。

  1.         CSCN :基础全表扫描,从头到尾,全部扫描
  2.         SSCN :二级索引扫描, 从头到尾,全部扫描
  3.         SSEK :二级索引范围扫描,通过键值精准定位到范围或者单值
  4.         CSEK :聚簇索引范围扫描,通过键值精准定位到范围或者单值
  5.         BLKUP :根据二级索引的ROWID 回原表中取出全部数据(b + a)

更多的操作符解释,可以参见DM7系统管理员手册附录4《执行计划操作符》

2、搭建实验环境

创建表T1并录入数据,相关SQL语句如下:

SQL> CREATE TABLE T1(C1 INT,C2 INT);
SQL> insert into t1 select level,level from dual connect by level < 10000;

3、检验执行计划

--SEL1

SQL> explain select * from t1 where c1 = 5;


有上图结果可知:创建了一个普通表,没有任何索引,过滤,从T1中取出数据只能走全表扫描CSCN。
在此基础上创建一条索引:
SQL> create index i_test1 on t1(c1);
再看下面这个语句的计划
--SEL2

SQL> explain select c1 from t1;


--SEL3

SQL> explain select c2 from t1;


        由以上结果可知:这个时候T1存在两个入口,CSCN T1基表,或者SSCN 二级索引I_TEST1,SEL2中,只要求获取C1,二级索引上存在C1,且数据长度比基础表要少(多出一个C2),索引选择SSCN。
        对于SEL3,依然没有更好的入口,还是选择CSCN全表。
        一般来说,我们认为CSCN和SSCN的耗时是差不多的,SSCN和CSCN的区别在于,SSCN 扫描出来的数据是按索引列排序的,这一点在一些情况下可以利用。
看SSEK的情况:
--SEL4

SQL> explain select * from t1 where c1 = 5;


  查询条件C1 = 多少,存在C1索引,需要注意的是操作符后面的描述scan_range[5,5],表示精准定位到5,多数情况下这样是比较有效率的。
  另外一点,SSEK 上面出现了BLKUP操作符,由于I_TEST1上没有C2的数据,而查询需要SELECT *,索引需要BLKUP回原表查找整行数据。
  所以我们可以想到如果只查询C1,那么BLKUP操作符应该不存在,验证一下:
--SEL5

SQL> explain select c1 from t1 where c1 = 5;


        聚簇索引是比较特殊的索引(对应操作符CSEK),在DM7上,同一张表的聚簇索引只允许存在一个,默认建表时(不建堆表的情况下),基表就是一个ROWID聚簇索引,可以预见到对ROWID的精准定位应该会走CSEK。
–SEL6

SQL> explain select c1 from t1 where rowid = 6;


如果我们创建了一个自定义聚簇索引:
SQL> create cluster index i_index2 on t1(c2);
那么ROWID这个聚簇索引就不存在了,取而代指的是按C2为顺序的聚簇索引
--SEL7

SQL> explain select c1 from t1 where rowid = 6;


这里查询中需要C1以及ROWID,而普通二级索引I_TEST1上正好都有,且比聚簇索引的长度要短,所以选择SSCN I_TEST1。
--SEL8

SQL> explain select c1 from t1 where c2 = 6;


可以看到,对ROWID的精准定位不再走精准定位的CSEK,而是全索引扫描I_TEST1对C2的精准过滤走的CSEK,且不存在BLKUP。

更多有关达梦数据的信息请移步:https://eco.dameng.com

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在数据库中,可以通过查询系统视图和系统表来查看表的物理占用情况。 首先,我们可以使用以下系统视图来获取表的基本信息: - DM_USER_RELATED_COLUMNS:该视图可以列出数据库中所有表的列信息,包括列名、数据类型、是否为空等信息。 - DM_USER_TABLES:该视图可以列出数据库中所有表的基本信息,包括表名、所属schema、创建时间等信息。 然后,我们可以使用以下系统表来获取表的物理占用情况: - DMTAB:该表存储了数据库中所有已创建的表的信息,包括表名、表所占用的数据文件等。 - DMTABPART:如果表是分区表,该表存储了表各个分区所占用的空间信息,包括分区名、数据文件等。 利用上述系统视图和系统表,我们可以执行如下SQL语句来查看表的物理占用情况: ```sql -- 查询表的基本信息 SELECT table_name, column_name, data_type, nullable FROM DM_USER_RELATED_COLUMNS WHERE table_name = 'your_table_name'; -- 查询表的物理占用情况 SELECT t.table_name, t.tablespace_name, t.num_rows, t.blocks, p.partition_name, p.num_rows, p.blocks FROM DMTAB t LEFT JOIN DMTABPART p ON t.object_id = p.object_id WHERE t.table_name = 'your_table_name'; ``` 以上SQL语句会返回表的基本信息,如列名、数据类型等,以及表的物理占用情况,如数据文件、分区信息、行数、占用块数等。通过查看这些信息,可以了解到表的物理占用情况。 ### 回答2: 数据库是一种典型的高可靠、高性能、高安全的关系型数据库管理系统,它提供了各种功能和工具来帮助用户管理和优化数据库。 要查看数据库中表的物理情况,可以使用一些系统表和视图来获得相关的信息。 首先,通过以下语句可以查看数据库中的所有表: ``` select t.table_name from dm_all_tables t where t.table_schema = 'your_schema'; ``` 其中,'your_schema'是数据库中表所属的模式名称,可以根据需要进行更改。 查询后,可以得到数据库中所有表的名称。 接下来,可以根据表的名称使用以下语句查看表占用的物理空间大小: ``` select t.table_name, sum(t.data_length) as data_size, sum(t.index_length) as index_size from dm_all_tables t where t.table_schema = 'your_schema' and t.table_name = 'your_table' group by t.table_name; ``` 继续修改'your_schema'和'your_table'为实际的模式和表名称,执行后可以得到该表的数据和索引所占用的物理空间大小。 通过以上的操作,我们可以查看到数据库中表的占用物理情况。根据这些信息,我们可以评估和优化数据库的存储空间使用情况,以便更好地管理和维护数据库。 ### 回答3: 要查看SQL表的物理占用情况,可以执行以下步骤: 1. 登录到数据库服务器上的数据库实例。 2. 使用管理员权限连接到数据库。 3. 使用`DU`命令查看表的物理占用情况。例如,输入`DU TABLE 表名;`来查看特定表的物理占用情况。如果想查看所有表的情况,可以输入`DU SCHEMA 模式名;`来查看该模式下所有表的占用情况,或输入`DU;`来查看数据库中所有表的占用情况。 4. 执行命令后,系统会返回表的名称、所属模式、记录数、占用空间等信息。 5. 根据返回的结果,可以评估表的物理占用情况。记录数用于判断表中数据的数量,而占用空间则表示该表所占用的物理存储空间。 通过以上步骤,我们可以使用SQL来查看表占用的物理情况。这些信息对于管理和优化数据库是非常有帮助的,可以帮助我们识别占用空间较大的表,进一步进行性能优化或者空间管理操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值