分类: Oracle DB |
1) 建立Index & Alter Index(慎重)
虽然加索引要慎重,可是根据用户的查询条件,可以想办法使原来不走索引的View去走索引。如果非要建索引,记得你要有DBA权限。
2) 使用with clause
--样例
CREATE OR REPLACE VIEW
ZZ_TEST_VIEW
AS
SELECT h.*
--样例()
CREATE OR REPLACE
VIEW ZZ_TEST_VIEW
AS
WITH ou
AS (SELECT * FROM
apps.hr_operating_units)
SELECT l.*
SELECT l.*
3) 动态SQL+绑定变量
--样例
EXECUTE IMMEDIATE 'SELECT NVL( SUM( NVL( fulfilled_quantity, 0 )), 0 )
FROMapps.oe_order_lines_all
WHERENVL( line_set_id, 0 ) = :p_line_set_id
ANDline_number = :p_line_number
ANDheader_id = :p_header_id '
INTOv_shipped_quantity
USINGp_line_set_id, p_line_number, p_header_id;
FROM
WHERE
AND
AND
INTO
USING
--游标变量绑定样例
(1)把游标声明成 Reference Cursor 类型,即所谓的“游标变量”,声明的时候是不需要指定 SELECT
语句的。
(2)在 Open 的时候,才指定 SELECT 语句,这时候就可以套用动态 SQL 了。
OPEN cur_test
(2)在 Open 的时候,才指定 SELECT 语句,这时候就可以套用动态 SQL 了。
OPEN cur_test
4) 使用分区表
若的确因为数据量太大而达到瓶颈,可以依时间进行分区,不过这招只能在建立表的时候使用,要有DBA权限,同时分区表不能因时间而自动增加分区。
--样例
(1)创建分区表
CREATE TABLE zz_test
( id NUMBER,
)
PARTITION BY RANGE ( mdate )
(
);
(2)将已存在的普通表转换成分区表(DBA权限)
<1>原表 T1 (未分区);中间表 T1_TEMP(分区);Package
DBMS_REDEFINITION
<2>创建好中间表后,执行如下PL/SQL
BEGIN
END;
<3>删除中间表
(3)使用分区表
SELECT *
FROM zz_test PARTITION(p1);
SELECT *
FROM zz_test WHERE mdate >
TO_DATE('2004-01-01', 'yyyy-mm-dd');
(4)不同分区间移动数据
ALTER TABLE zz_test
ENABLE ROW
MOVEMENT;
5) 使用提示Hints,强制改变执行计划路径
说明:这种方法通常不一定奏效,因为Oracle CBO执行计划生成的是不无道理的。
只有特定情况下,才会强制HINT。
以下举几种强制索引的方式:
<方式一>
FULL hint 告诉ORACLE使用全表扫描的方式访问指定表.
例如:
SELECT *
FROM EMP
WHERE EMPNO = 7893;
FULL hint 告诉ORACLE使用全表扫描的方式访问指定表.
例如:
<方式二>
如果一个大表没有被设定为缓存(CACHED)表而你希望它的数据在查询结束是仍然停留在SGA中,你就可以使用CACHE hint
来告诉优化器把数据保留在SGA中. 通常CACHE hint 和 FULL hint 一起使用.
例如:
SELECT *
FROM WORK;
例如:
SELECT *
FROM WORK;
<方式三>
例如:
又例如:
<方式其他>
6) 加上时间的限制条件
--样例
mmt.transaction_date BETWEEN gps.start_date AND( TRUNC( gps.end_date ) +
0.99999 )