摘要:昨天有个同事找我看了一段SQL,说是很慢,我首先看了看执行计划,发现COST很大,但是同时我也发现分区读取的有很大的问题。表示这样的: create table test1( day_id number)partition by range(day_id)( partition part_0 values less than(20130228), partition part_1 values less than(20130301), partition part_2 values less than(20130302), partition part_3 value... 阅读全文
posted @ 2013-04-08 13:52 wingsless 阅读(12160) 评论(0) 推荐(0) 编辑
摘要:最近整理了一下系统内所有表的空间占用情况,发现其中一些表其实只有及万行,却占用了非常大的空间,那么显而易见,这个表的“碎片”实在是太多了。 最开始接触oracle的时候我认为删除数据就是delete,但是后来的学习中,发现事情并不是我想象的那么简单,delete之后,系统也只是将这部分数据块置为可写状态,而实际上还是将这部分空间交由表来占用。而我发现我们系统中为了提高插入的效率,大量的使用了append方式,这样就更加积重难返了。 可以设计下面的实验: 有两个表test1和test2。 create table test1 as select * from dba_objects;... 阅读全文
posted @ 2013-04-05 14:13 wingsless 阅读(1491) 评论(5) 推荐(2) 编辑
摘要:今天有同事告诉我,有个SQL执行了好久好久执行不出来,我说好就是多久?她说一天左右了。真是令人咋舌的SQL。于是我要来了SQL看了看执行计划,确实让人咋舌。 下图中就是执行计划的截图: 25G的COST和75T的Bytes确实是无法承受之重。这个SQL是这样子的: select部分做了很多sum运算,还有distinct等运算,总之很麻烦,group by部分就是上面的维度。其中最大的表是TABLE3和TABLE4,这两个表所需要查询的数据量都在3G以上,各自差不多3000万数据。 最开始我以为是因为数据量大的原因导致的这个执行计划不可实现,但是在我将TABLE3和TA... 阅读全文
posted @ 2013-03-28 20:30 wingsless 阅读(1319) 评论(4) 推荐(1) 编辑
摘要:今天同事问我,为什么trim了以后记录中还是有空格?我说怎么可能,oracle还没那么差劲。后来我看了记录,确实在记录的左边有一个空格,但是我相信不是空格,应该是一个特殊字符。 于是我挑了一条记录写了如下的脚本: DECLARE I NUMBER; A VARCHAR2(10);BEGIN FOR I IN 1 .. LENGTH(' 123467') LOOP SELECT ASCII(SUBSTR(' 123467', I, 1)) INTO A FROM DUAL; DBMS_OUTPUT.PUT_LINE(A); END LOOP;END; ... 阅读全文
posted @ 2013-03-22 17:16 wingsless 阅读(966) 评论(0) 推荐(0) 编辑
摘要:最近负责起了DBA的部分工作,于是有一天在对表空间的清理中发现了一张表,这个表有27G那么大,是一个分区表,按天分区。我查看了过程,每天删除35天以前的数据,但是用的方法是delete,那么我就可以很明确的推断出,这个表占用了大量本应该释放的空间。 我第一个使用的方法是move: alter table table_name move partition part_1; 这样做很快,但是今天我在看一本书的时候,上面记载这种方法会更改rowid,会让原来的索引失效。不过和我的有一点小出入: 这个表上没有索引,所以我这样做了也无所谓,但是系统中存在着很多这样的表,我需要试... 阅读全文
posted @ 2013-03-13 13:55 wingsless 阅读(1327) 评论(0) 推荐(0) 编辑
摘要:很久以前写了一个关于分区表的博文(http://www.cnblogs.com/wingsless/archive/2012/08/06/2625809.html),后来在实际的工作中发现,我们的存储过程中存在很多这样子的写法:CREATE OR REPLACE PROCEDURE P_TEST_PAR(V_DAY IN VARCHAR2) AS V_SQL VARCHAR2(1000);BEGIN V_SQL := 'INSERT INTO TEST_PAR SELECT * FROM TEST_PAR T WHERE T.DAY_ID =' || V_DAY; EXECUT 阅读全文
posted @ 2013-03-09 15:39 wingsless 阅读(1725) 评论(0) 推荐(0) 编辑
摘要:前一篇随笔被我写的乱七八糟的,于是新开一块。 从库建好了的准备工作开始写吧。 1 创建表空间:SQL> CREATE TABLESPACE WINGS DATAFILE 'D:\app\user\oradata\oracl\WINGS_F01.DBF' SIZE 50M AUTOEXTEND ON NEXT 50M MAXSIZE 1024M; 上面是一次只要一个数据文件的,下面的是一个以上文件的:SQL> CREATE TABLESPACE WINGS_TEMP DATAFILE 'D:\app\user\oradata\oracl\WINGS_TF01. 阅读全文
posted @ 2013-03-09 11:49 wingsless 阅读(731) 评论(0) 推荐(0) 编辑
摘要:今天收到一个同事的问题,有一段SQL跑了很久很久,根本没有结果,根据同事的反映,这个SQL一个月比一个月要慢。这是不被允许的事情,我们要做的就是对这个SQL进行一次优化。下面就是这次优化的记录。 首先说SQL:select t.month_id, t1.area_id, t1.local_id, count(distinct case when t.type_id = '02' and t.valid_flag = 1 and t3.trade_id = '1008601' then ... 阅读全文
posted @ 2013-01-07 21:37 wingsless 阅读(4401) 评论(18) 推荐(6) 编辑
摘要:诸位毕业同学: 你们现在要离开母校了,我没有什么礼物送给你们,只好送你们一句话罢。这一句话是:“不要抛弃学问”。以前的功课也许一大部分是为了这张毕业文凭,不得已而做的。从今以后,你们可以依自己的心愿去自由研究了。趁现在年富力强的时候,努力做一种专门学问。少年是一去不复返的,等到精力衰减时,要做学问也来不及了。即为吃饭计,学问也绝不会辜负人的。吃饭而不求学问,3年5年之后,你们都要被后来少年淘汰的。到那时再想通过做学问来补救,恐怕已太晚了。有人说:“出去做事之后,生活问题急需解决,哪有功夫去读书?即使要做学问,既没有图书馆,又没有实验室,哪能做学问?”我要对你们说:凡是要等到有了图书馆才能读书的 阅读全文
posted @ 2012-12-07 12:59 wingsless 阅读(251) 评论(0) 推荐(1) 编辑
摘要:今天收到一个同事的求助,说有一个SQL跑了一个多小时没有结果。我看了看,这个SQL是这样的(隐藏了敏感信息): SELECT 电话号码, 列2, 列3, MAX(STARTTIME), FLAG FROM 表1 T1 WHERE FLAG = '0' AND 电话号码 NOT IN (SELECT 电话号码 FROM 表2 T2) GROUP BY 电话号码, 列2, 列3, FLAG; 我首先查看了两个表的数据量,表1有将近300万条,表2有不到10万条记录。并不是很大的数据。于是我关注到了not in,这个语句是几乎所有的优化指南上都明确说了要避免的语句。于是我就把这句改了 阅读全文
posted @ 2012-11-22 22:49 wingsless 阅读(2770) 评论(18) 推荐(8) 编辑
摘要:我一直不知道到底有没有函数可以实现标题的功能,所以我写了个适合我们业务的。如果大家有更好的,请告诉我。下面是源码: CREATE OR REPLACE FUNCTION REPLACE_POSITION(STR_IN VARCHAR2, POSITION INTEGER, NEW_CHAR VARCHAR2)/* 用于替换字符串中指定位置的字符的函数 */ RETURN VARCHAR2 IS RESULT... 阅读全文
posted @ 2012-11-20 17:34 wingsless 阅读(584) 评论(0) 推荐(0) 编辑
摘要:在linux下面安装oracle是一件让人恼火的事情,不像windows下面那样简单,但是windows在服务器领域实在是不争气,一个好的DBA同时也是一个linux高手。我今天就折腾了一下oracle,下面把安装过程记录下来,以供我以后参考。 1 修改内核参数: /etc/sysctl.conf 在这个文件后面添加如下内容:kernel.shmall = 268435456kernel.shmall = 2097152kernel.shmmax = 2147483648kernel.shmmni = 4096kernel.sem = 250 32000 100 128fs.file-max 阅读全文
posted @ 2012-11-12 22:23 wingsless 阅读(292) 评论(0) 推荐(0) 编辑
摘要:在这样一个清晨写下这样一个题目,是因为最近有越来越多的人问起我这个问题,我想还是试着把我的想法写下来。1.快速有多快? 很多人都喜欢寻找捷径,所以经常问起快速,但是我经常反复告诉大家的是,没有捷径,或者说没有轻而易举的捷径可循。 当然快速两个字也是有意义的,这是这个快速的社会对于年轻人的要求,在《深入解析Oracle》一书的序言中,我写过这样一段话:随着技术以及时代的不断进步,社会留给DBA的成长时间越来越短,一个DBA从入门到成长为资深的时间不会超过2年。。。。张爱玲说过,成名要趁早。做技术的也是如此,成长越早越好,越快越好。理解快速两个字的涵义,推荐仔细阅读我的《深入解析Oracle》一书 阅读全文
posted @ 2012-11-12 09:50 wingsless 阅读(1879) 评论(0) 推荐(1) 编辑
摘要:熬过了月初的匆忙之后终于有一个喘息的机会了。最近又开始接手过去的存储过程的改造工作,我在改造中发现了一些问题,我们的同事写insert语句的时候总是喜欢加上append这个hints。这个习惯的养成应该都是我们那个模板造成的,大家在写的时候也就不去思考为什么要加这个hints了,也不知道加这个hints有什么坏处有什么好处。hints的作用就是叫oracle按照我们规定的方式执行SQL,比如说我们可以指定扫描某个索引,可以指定进行全表扫描。这个append就是告诉Oracle,跳过扫描freelist这个步骤,直接在队尾插入数据。 我们都知道,表中的数据其实是存在在数据块中的,数据块中有一部. 阅读全文
posted @ 2012-11-11 00:28 wingsless 阅读(2158) 评论(4) 推荐(0) 编辑
摘要:我曾经迷茫于一个问题,为什么有的时候明明有索引,却无法提升效率。后来我在很多书上和论坛上看到,索引分为3种,默认的是B树索引,这个类型的索引在对付重复很多很多的列的时候并没有任何优势,比如性别列这个只有两个值(不排除会有第三值)的列。而这种重复度很高的列在我平时的生产系统中非常多,比如运营商的行政区列,西安市只有市区,户县,周至,蓝田等几个行政区,这种重复在百万级甚至千万级的表中属高重复的。那么这种情况就要交给位图索引来对付了。 下面是我在自己机器上做的一个实验: 1 首先建立三张表,table1来自于dba_objects中object_type为table和index的,然后用如下的语句. 阅读全文
posted @ 2012-10-25 20:40 wingsless 阅读(2100) 评论(6) 推荐(0) 编辑