各位童鞋大家好。很高兴又和大家见面了,因为个人原因该博客断了很长时间,深感抱歉。今天继续,继续前一讲的select解说。
在实际当中,select 还有很多场景,例如这样一个实际工作的场景。某一天,运行的系统突然变的很慢很慢。这个时候第一反应应该就是去查询服务器情况了,cpu,内存,磁盘。发现指标都正常,这就有些纳闷了。如果继续查询系统日志,可能就会发现问题所在了。对,就是表空间用完了。以oracle为例子,下面一条sql语句就是查询表空间的情况的:
SELECT a.tablespace_name "数据库表空间名",
total "数据库表空间总大小",
free "数据库表空间剩余大小",
(total - free) "数据库表占用空间大小",
ROUND((total - free) / total * 100, 2) || '%' "数据库表空间已使用空间百分比"
FROM (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 total
FROM dba_data_files
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) / 1024 / 1024 free
FROM dba_free_space
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
ORDER BY (total - free) DESC;
这个时候查出的结果就会发现有一个表空间使用百分比已经高达97%了。说明表空间容量被用完,需要对其进行扩容。上述sql语句涉及到2个视图,dba_data_files,dba_free_space。这2个视图童鞋们有兴趣可以深入探究一下,本文重点讲述sql语句,所以暂不深入此处。可能在很多大厂一般程序员很少涉及到这条sql,但是在很多小厂就必须会使用它了。咱们接下来分析下这条sql,这条sql还是相对简单的。
首先视图可以和表一样进行任何查询操作。首先该条sql对dba_free_space,dba_data_files进行了分组统计操作,并在统计时候用到了sun()函数和除法运算。操作完成后分别设为临时表a,b。然后根据表a,b的tablespace_name 字段是否相对进行关联查询,最后并对(total - free)进行降序排列。当然这条语句的where条件部分可用inner join进行连接查询,效果一样。
表空间扩容sql就比较简单了。根据实际磁盘情况和数据库使用情况使用alter语句进行扩容。sql如下:
alter tablespace tablespace_name
add datafile 'D:\APP\ORCL\DATAFILE\XXX.DBF' size xxxm
好了,这篇就暂时到这吧。下篇见,继续咱们基础的sql之旅吧!