1.如何从大表中快速查询数据
如何从几十亿的表中高效地查询几百条数据?
(1)如果是Oracle数据库的话,首先我们可以将表改成分区表,配合建立分区索引,效率是非常的快的,如果将普通表改成分区表,用Oracle的在线重定义包 dbms_redefinition就可以实现;
(2)如果这个表一般不插入数据的话,只供查询的话,我们还可以将表压缩,改成收缩表压缩后插入效率很低,不过查询效率很高;
(3)如果是其他的数据库的话,如sybase的话,只能定义一些索引了,并且索引要放在不同的segment里面,防止查询的时候I/O争用的情况出现,降低查询效果
总的来说,1亿条数据不多,还是比较好处理的,我这边的表多大几十亿都照样查询,还有要提醒的是,一个表的数据,我们不能让它一直增加,要对表做一下数据迁移的策略,
比如定时将表的数据迁到其他的历史表里面去。
2.如何快速删除数据
如:从一个数据量有1亿的表中删除3000万条记录,怎样比较快。
(1)建一个新表,把不需要删除的数据select出来放进去,然后把原表删除truncate,然后重命名,重建索引
用delete的话半天都跑不完的;
(2)建立分区,将需要删除的数据存在特定分区里,删除该分区就可以了。alter table 表名 drop partition 分区名
3.oracle快速删除一个字段,但是表里有千万条数据。
如果仅仅是不需要这个字段,可以执行:
alter table tablename set unused column column_name
然后再在空闲的时候执行:
alter table tablename drop unused columns;
4.如何定位重要(消耗资源多)的SQL
使用CPU多的用户session
SELECT a.SID, spid, status, SUBSTR (a.program, 1, 40) prog, a.terminal,a.SQL_TEXT, osuser, VALUE / 60 / 100 VALUE
FROM v
s
e
s
s
i
o
n
a
,
v
session a, v
sessiona,vprocess b, v$sesstat c
WHERE c.statistic# = 12 AND c.SID = a.SID AND a.paddr = b.addr
ORDER BY VALUE DESC;