上一次发现访问X$KSLEI时, 用这个Hint很有效, 后来在更多的机器上测试, 发现有的数据库上这个Hint并不工作, 如下所示:
SQL> SELECT /*+ USE_CONCAT */ * FROM X$KSLEI WHERE INDX IN (1,2);
----------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
----------------------------------------------------
| 0 | SELECT STATEMENT | | 20 | 1680 |
|* 1 | FIXED TABLE FULL| X$KSLEI | 20 | 1680 |
----------------------------------------------------
最后只好化简为繁, 改成用UNION ALL来实现, 这下Oracle没得选择了.
SQL> SELECT * FROM X$KSLEI WHERE INDX = 1 UNION ALL
2 SELECT * FROM X$KSLEI WHERE INDX = 2
3 /
----------------------------------------------------
| Id | Operation | Name |
----------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | UNION-ALL | |
|* 2 | FIXED TABLE FIXED INDEX| X$KSLEI (ind:2) |
|* 3 | FIXED TABLE FIXED INDEX| X$KSLEI (ind:2) |
----------------------------------------------------
很多人动不动就想用Direct SGA Access的方法来写数据库监控程序, 其实好好调一下SQL, 可以不用那么复杂.