麻烦各位大哥了! 现声明:我对ORALCE一窍不通,只停留在PL/SQL中写写Select语句,因为语句效率太低,疑似运行是会导致锁表,所以有人建议多用索引,貌似先在Explain Plan Window 中运行检查什么.......
我的问题来了:1、Select语句超时运行会导致锁表,用索引优化是做好的方式吗?或者说不用索引还有其他的优化方式吗?
2、怎么使用索引(没用过),是否先要检查现在的Orlace中现有的索引哪些可用?怎样看现有的索引?
3、怎样新建索引,建立要遵循什么原则
4、写Select 语句是怎样调用索引
5、Explain Plan Window的作用,怎么用?附件:下面是我用到一个查询语句、大家可以作为例子给个解答,不胜感激,谢谢啦!!
SELECT DRDL01,
MCDL01,
IMDSC1,
ILDOC,
ILTRDJ,
IOLOT1,
ILMCU,
IOLOT2,
ILPAID,
ILTRUM,
ILTRQT,
ILUNCS,
IORLOT
FROM (select * from PRODDTA.F4111
WHERE ILDCT = 'FG' and TRIM(F4111.ILFRTO) = 'F'
AND ILKCO NOT IN ('02500', '05100', '05200', '06000', '06100', '08000')
AND (1=1)) F4111
LEFT OUTER JOIN (SELECT *
FROM PRODDTA.F0006
INNER JOIN PRODCTL.F0005
ON TRIM(PRODCTL.F0005.DRKY) = TRIM(PRODDTA.F0006.MCRP01)
AND PRODCTL.F0005.DRSY = '00'
AND PRODCTL.F0005.DRRT = '01') A
ON trim(F4111.ILMCU) = trim(A.MCMCU)
LEFT OUTER JOIN PRODDTA.F4101 ON PRODDTA.F4101.IMITM = F4111.ILITM
LEFT OUTER JOIN PRODDTA.F4102 ON PRODDTA.F4102.IBITM = F4111.ILITM
AND trim(PRODDTA.F4102.IBMCU) = trim(F4111.ILMCU)
LEFT OUTER JOIN PRODDTA.F4108 ON PRODDTA.F4108.IOLITM =
F4111.ILLITM
AND trim(PRODDTA.F4108.IOLOTN) = trim(F4111.ILLOTN)
AND trim(PRODDTA.F4108.IOMCU) = trim(F4111.ILMCU)
我的问题来了:1、Select语句超时运行会导致锁表,用索引优化是做好的方式吗?或者说不用索引还有其他的优化方式吗?
2、怎么使用索引(没用过),是否先要检查现在的Orlace中现有的索引哪些可用?怎样看现有的索引?
3、怎样新建索引,建立要遵循什么原则
4、写Select 语句是怎样调用索引
5、Explain Plan Window的作用,怎么用?附件:下面是我用到一个查询语句、大家可以作为例子给个解答,不胜感激,谢谢啦!!
SELECT DRDL01,
MCDL01,
IMDSC1,
ILDOC,
ILTRDJ,
IOLOT1,
ILMCU,
IOLOT2,
ILPAID,
ILTRUM,
ILTRQT,
ILUNCS,
IORLOT
FROM (select * from PRODDTA.F4111
WHERE ILDCT = 'FG' and TRIM(F4111.ILFRTO) = 'F'
AND ILKCO NOT IN ('02500', '05100', '05200', '06000', '06100', '08000')
AND (1=1)) F4111
LEFT OUTER JOIN (SELECT *
FROM PRODDTA.F0006
INNER JOIN PRODCTL.F0005
ON TRIM(PRODCTL.F0005.DRKY) = TRIM(PRODDTA.F0006.MCRP01)
AND PRODCTL.F0005.DRSY = '00'
AND PRODCTL.F0005.DRRT = '01') A
ON trim(F4111.ILMCU) = trim(A.MCMCU)
LEFT OUTER JOIN PRODDTA.F4101 ON PRODDTA.F4101.IMITM = F4111.ILITM
LEFT OUTER JOIN PRODDTA.F4102 ON PRODDTA.F4102.IBITM = F4111.ILITM
AND trim(PRODDTA.F4102.IBMCU) = trim(F4111.ILMCU)
LEFT OUTER JOIN PRODDTA.F4108 ON PRODDTA.F4108.IOLITM =
F4111.ILLITM
AND trim(PRODDTA.F4108.IOLOTN) = trim(F4111.ILLOTN)
AND trim(PRODDTA.F4108.IOMCU) = trim(F4111.ILMCU)
-- 索引优化是很好的方式,也是很有效的方式,
-- 不用索引也有相应的优化方式,就是调整你的PL/SQL脚本,减少不必要的输入和关联2、怎么使用索引(没用过),是否先要检查现在的Orlace中现有的索引哪些可用?怎样看现有的索引?
-- 使用索引是系统会默认帮你选择,也可以通过 hint来显式地指定索引.
-- 在创建之前,最好先检查一下现有的索引,
-- select * from user_indexes 查询现有的索引
3、怎样新建索引,建立要遵循什么原则
-- 需要平衡query合DML的需要,常用于(子)查询的表应建立索引;
-- 把索引建到不同的表空间中;
-- 用统一的extent大小: 五个block的倍数或者tablespace指定的MINIMUM EXTENT的倍数;
-- 创建索引考虑用NOLOGGING参数,重建索引的时候也一样;
-- 创建索引时INITRANS值应该比相应的table的值高一些;
-- 对常用SQL语句的where条件中的列建立唯一索引或组合索引,组合条件查询中相应的组合索引更有效;
-- 对于组合索引,根据列的唯一值概率,安排索引顺序;
-- 如果一个列具有很低的数据基数,并且或者可具有空值,不应作为索引列;
-- 如果where语句中不得不对查询列采用函数查询,如upper函数,最好建立相应函数索引;
-- 对于低基数集的列,并包含OR等逻辑运算,考虑用Bitmap索引,对于从大量行的表中返回大量的行时也可以考虑Bitmap索引;
-- 避免在有大量并发DML运算的表中使用Bitmap索引;4、写Select 语句是怎样调用索引
-- oracle中查询时指定索引的方法
-- http://hi.baidu.com/toriycn/blog/item/1afe3e7faa0a300c28388a36.html5、Explain Plan Window的作用,怎么用?
-- 执行计划窗口,监视执行计划的.
select * from PRODDTA.F4111
WHERE ILDCT = 'FG' and TRIM(F4111.ILFRTO) = 'F'
AND ILKCO NOT IN ('02500', '05100', '05200', '06000', '06100', '08000')
AND (1=1)
以及
SELECT *
FROM PRODDTA.F0006
INNER JOIN PRODCTL.F0005
ON TRIM(PRODCTL.F0005.DRKY) = TRIM(PRODDTA.F0006.MCRP01)
AND PRODCTL.F0005.DRSY = '00'
AND PRODCTL.F0005.DRRT = '01'
你先把这两个查询分别单独执行一下,看看它们的速度。如果都很快,说明瓶颈不在他们这里。
然后再看几个LEFT OUTER JOIN右边的表数据量大不大,如果很大,可能会导致两个表join的时候很慢,你可以在相应的关联字段上建立索引,比如PRODDTA.F4101.IMITM或者PRODDTA.F4102.IBITM.默认oracle会找最合适的索引使用,但是你也可以在sql语句里面使用暗示的方法建议它用哪个索引.
没有一个规则能够解决所有问题,
所以,没有执行计划分析,恐怕找到病根困难,
提供执行计划,什么都知道了。
比如在SQL SEVER 中 Select * Into #TableName From Table
Select* From #TableName 那么我在Oracle中怎样在Select时建立临时表