当执行某条sql语句,或者执行某个过程/包的时候性能出现问题,我们可以通过sql_trace来跟踪它们的执行情况,在跟踪文件中输出了,整个会话,或者整个数据库的执行情况。
首先,我们需要开启sql_trace(有session级,也有database级别的,数据库级别的显然会非常耗费资源,一般情况也没有必要开启):
--设置当前会话,开启sql_trace alter session set sql_trace=TRUE; --设置trace文件标识,方便查找 ALTER SESSION SET tracefile_identifier='lubinsu'; --通过下面的语句来查询当前sql_trace文件的路径 SELECT d.value || '/' || lower(rtrim(i.instance, chr(0))) || '_ora_' || p.spid || '.trc' AS "trace_file_name" FROM (SELECT p.spid FROM v$mystat m, v$session s, v$process p WHERE m.statistic# = 1 AND s.sid = m.sid AND p.addr = s.paddr) p, (SELECT t.instance FROM v$thread t, v$parameter v WHERE v.name = 'thread' AND (v.value = 0 OR t.thread# = to_number(v.value))) i, (SELECT VALUE FROM v$parameter WHERE NAME = 'user_dump_dest') d;
到指定目录下可以很方便地找到我们设置了标识的trace文件:
现在我随意执行一条语句试试:
--执行一条语句:
SELECT * FROM scott.emp a WHERE a.empno = 7900;
--关闭sql_trace
ALTER SESSION SET SQL_TRACE = FALSE;
--到oracle目录下查看下生成的文件里到底有哪些东西:
显然这文件的可读性是很差的,现在我们用tkprof来分析跟踪文件:
tkprof orclsid_ora_31518_lubinsu.trc
记得之前在HP 的时候,遇到一个ROW LEVEL SECURITY 的性能问题,当时也在CSDN发了一个博客,不过因为涉及用户信息泄密,所以把博客删除了。最近一个网友也遇到RLS性能问题
我现在遇到一个比较郁闷的问题
……petma 19:59:23
是这样的,我们的系统,将用户分为了几类,每一类的权限策略是不一样的,然后数据查询的时候,我们先要调安全的方法,得到一个权限策略的SQL,然后再将这个SQL做为参数,传到真正的数据查询中
……petma 19:59:31
可是,加了这个SQL后,就非常慢
落落 19:59:53
ROW LEVEL SECURITY?
……petma 20:00:05
是的
落落 20:00:47
哈哈哈 我之前遇到过
落落 20:00:52
你在外企?
落落 20:01:03
这个好办
落落 20:01:11
你把 RLS 的 限制条件发一下给我看看
落落 20:01:20
是不是限制条件是一个子查询?
……petma 20:01:24
是
……petma 20:01:37
SELECT *
FROM (SELECT A.*, ROWNUM RN
FROM (
select b.* from os_form_base b,ttwo_wo_info t
where
t.form_id=b.form_id
and site_code in (
select resCode from (select * from(select dept_code as resCode,dept_name as resName from sec_dept) WHERE 1!=1 OR ((1=1 and resCode in('0001030102','0001030105','000103010501','00010301050101','000103010502','00010301050201','000103010503','00010301050301','000103010504','00010301050401','000103010505','00010301050501','000103010506','00010301050601','000103010507','00010301050701','000103010508','00010301050801','000103010509','00010301050901','000103010510','00010301051001','000103010511','00010301051101','000103010512','00010301051201','000103010514','0001030109','000103010901','00010301090101','000103010902','00010301090201','000103010903','00010301090301','000103010904','00010301090401','000103010905','00010301090501','000103010906','00010301090601','000103010907','00010301090701','000103010908','000103010909','000103010910','000103010911','00010301091101','00010301091102','00010301091103','00010301091104','000103011906','00010301190601','000103011907','00010301190701') ) or (1!=1)) and resCode like '00010301%'))
order by t.form_id desc
) A
WHERE ROWNUM <= 15
) WHERE RN > 0
……petma 20:01:56
这段用于权限控制
……petma 20:02:49
我也用PL/SQL F5看了下,把权限控制里的1!=1这种去掉后,里面的耗费减少了,但是查询时间没变化
落落 20:03:03
SQL优化不要去看cost
落落 20:03:10
也不要用PL/SQL 去看执行计划
……petma 20:03:12
哦
落落 20:03:23
你 在限制条件里面 加一个 HINT
落落 20:03:31
/*+ no_unnest */
落落 20:03:33
试一试
……petma 20:03:45
这个我不会加,呆会去百度,加了这个之后呢
落落 20:03:57
加了再试一试
落落 20:04:02
不行再找我
……petma 20:04:07
OK,QQQ
落落 20:04:12
直接就在 SELECT 后面加上即可
落落 20:04:34
限制条件 里面的 SELECT 后面加
落落 20:04:46
而不是在 最开始的 SELECT 那里 加 小心点哈
……petma 20:05:44
where site_code in (select res_code 这里面加哈)
落落 20:07:50
where site_code in (select /*+ no_unnest */ res_code 这里面加哈)
落落 20:07:52
嗯
……petma 20:09:10
为什么一下子就非常快了
……petma 20:13:28
膜拜
落落 20:15:05
呵呵 来参加培训吧
1、下载mongodb的windows版本,有32位和64位版本(当然也有linux版本的),根据系统情况下载即可。下载地址:http://www.mongodb.org/downloads,这里我下载的是mongodb-win32-i386-2.4.0-rc1。
2、解压缩至任意硬盘分区目录:如,D:/DB/MongoDB,并在任意地方创建数据库文件的存放位置,比如D:/DB/MongoDB/db(启动mongodb服务之前需要必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。默认文件夹路径为c:/data/db.使用系统默认文件夹路径时,启动服务无需加--dbpath 参数说明,但文件夹还要手工创建)。
3、打开cmd命令行,进入D:/DB/MongoDB/bin目录,输入如下的命令启动mongodb服务,如图所示:
4、进入MongoDB进行简单的操作
(1)、启动mongo db,如图:
(2)、执行插入和查询,如图:
5、创建MongoDBwindows 服务,让系统自动启动服务。
(1)、创建服务
在MongoDB安装目录下创建logs目录,然后在CMD命令行输入如下命令:
D:\DB\MongoDB\bin>mongod --logpath D:\DB\MongoDB\logs\MongoDB.log --logappend
--dbpath D:\DB\MongoDB\db --directoryperdb --serviceName MongoDB --install
(2)、启动/停止服务
net start MongoDBnet stop MongoDB
(3)、删除服务
D:\DB\MongoDB\bin\mongod.exe --remove