关联查询语句怎么条件不同执行计划也不同呢?
1:Select d. *, p. *
From Device d, Boiler p
Where d.Remark = 0 And d.Device_Id = p.Boiler_Id And p.Ratingpower >= 1 And
p.Ratingpower <= 99999
2:Select d. *, p. *
From Device d, Boiler p
Where d.Remark = 0 And d.Device_Id = p.Boiler_Id And p.Ratingpower >= 1
3:Select d. *, p. *
From Device d, Boiler p
Where d.Remark = 0 And d.Device_Id = p.Boiler_Id And
p.Ratingpower <= 99999
这上面的语句,第一个语句执行计划和后面的不同,后面两个是一样的,
device 表约 33 万条数据, boiler 月10万条, 这两个表一对一关联的。
执行时间 1 和 ( 2 或 3 ) 相差很远 ,1 一秒不到, 2 或 3 需要 10 秒。
ratingPower 列需要建索引么? 我的表还有很多字段需要建索引,ratingPower 字段不常用,
每个表最多能建多少几个索引有限制还是只看查询中能用到多少个索引有限制 ?
问题点数:100、回复次数:10Top
1 楼bzszp(SongZip)回复于 2006-03-01 11:00:39 得分 40
执行计划里面应该有,是否使用了索引,通过执行计划就能看出有什么不同,判断是否需要创建索引。
创建索引 可以加快查询效率,但是对于该表的增加修改删除操作回有负面影响。Top
2 楼humanity(城市边缘的狼)回复于 2006-03-01 11:08:28 得分 0
我这个字段不是很常用,
另外: 索引有个数限制么? 如果有的话, 是表上创建的总个数有限制,还是 查询时能用的个数有限制?
我上面的语句的条件不同,但是是同一个字段啊,
一个是 ratingPower > 1 < 999,
另外的是
ratingPower >1
和ratingPower < 999
同时加上和只加一个怎么会有区别呢?我还是不明白为什么同一个字段上会因条件不同计划也不同?
Top
3 楼humanity(城市边缘的狼)回复于 2006-03-01 11:10:32 得分 0
补充,最后查询的结果是一样的。其实所有的记录的 ratingPower 其实都在 [1,999] 之间。Top
4 楼cenlmmx(学海无涯苦作舟)回复于 2006-03-01 13:00:26 得分 30
你的优化模式是什么?是不是一个是table full scan一个是index range scan.Top
5 楼bzszp(SongZip)回复于 2006-03-01 14:18:34 得分 0
执行计划贴出来看看Top
6 楼ZengMuAnSha(曾牧暗鲨)回复于 2006-03-01 17:30:06 得分 0
你的機器配置不錯啊!!
d.Remark = 0 是是否類型吧?
d.Device_Id = p.Boiler_Id 是關鍵字吧?
p.Ratingpower >= 1 And p.Ratingpower <= 99999 是數字類型吧?
語句優化好象是 inne jion on Device id Boiler_id
where p.Ratingpower <= 9999 and d.Remark = 0
Top
7 楼ZengMuAnSha(曾牧暗鲨)回复于 2006-03-01 17:32:29 得分 30
p.Ratingpower 看來不是有序類型的數字吧?
語句優化好象是 inne jion on Device id Boiler_id
where p.Ratingpower <= 9999 andp.Ratingpower>=1 d.Remark = 0
Oracle 比較笨 它要個變量綁定 你那三個語句不全部相同 所以執行計劃不能重用Top
8 楼humanity(城市边缘的狼)回复于 2006-03-02 08:54:31 得分 0
Remark 字段是删除标记很常用,所以建了索引。
以下是 PL/SQL Developer 给出的:
A:
SELECT STATEMENT, GOAL = RULE
NESTED LOOPS
TABLE ACCESS BY INDEX ROWID SCHEMAA DEVICE
INDEX RANGE SCAN SCHEMAA IN_DEVICE_REMARK
TABLE ACCESS BY INDEX ROWID SCHEMAA BOILER
INDEX UNIQUE SCAN SCHEMAA PK_BOILER
1.Select d. *, p. * From Device d, Boiler p
Where d.Remark = 0 And d.Device_Id = p.Boiler_Id And p.Ratingpower >= 1 And
p.Ratingpower <= 99999
执行计划显示:
列依次是 执行步骤描述, ObjectOwner, Object Name, Cost , cardinality , bytes.
GOAL =first_rows 和 GOAL=all_Rows 一样的:
SELECT STATEMENT, GOAL = FIRST_ROWS 209 141 1213446
NESTED LOOPS 209 141 1213446
TABLE ACCESS FULL SCHEMAA BOILER 68 141 1160289
TABLE ACCESS BY INDEX ROWID SCHEMAA DEVICE 1 1 377
INDEX UNIQUE SCAN SCHEMAA PK_DEVICE 3
2: 上面 2 ,3 语句的计划是一样的,
Select d. *, p. * From Device d, Boiler p
Where d.Remark = 0 And d.Device_Id = p.Boiler_Id And p.Ratingpower >= 1
GOAL=first_rows 和 GOAL=all_rows 一样的.
列依次是:
执行步骤描述, ObjectOwner, Object Name,Cost , cardinality , bytes.
SELECT STATEMENT, GOAL = FIRST_ROWS 1230.68689776287 2818 24251708
NESTED LOOPS 1230.68689776287 2818 24251708
TABLE ACCESS FULL SCHEMAA BOILER 68 2818 23189322
TABLE ACCESS BY INDEX ROWID SCHEMAA DEVICE 1230.68689776287 1 377
BITMAP CONVERSION TO ROWIDS
BITMAP AND
BITMAP CONVERSION FROM ROWIDS
INDEX RANGE SCAN SCHEMAA PK_DEVICE 3
BITMAP CONVERSION FROM ROWIDS
INDEX RANGE SCAN SCHEMAA IN_DEVICE_REMARK 9 3
Top
9 楼humanity(城市边缘的狼)回复于 2006-03-02 08:56:57 得分 0
如果有优化办法的话我在 SQL 语句中要怎么告诉 Oracle 使用我期望的优化方案呢?Top
10 楼humanity(城市边缘的狼)回复于 2006-03-02 09:00:28 得分 0
看到数字的所有字段数据库里也全是 Number 型的。
remark 建了索引, Device , Boiler 主键的值是相同的,一对一关联。Top




