我需要通过使用索引来优化这个查询。我尝试对一些列进行索引,但并没有帮助。是否有人有想法?
我需要优化的查询:
Select vintage, wine_no, wname, pctalc, grade, price, wine.vid, vname, wine.cid, cname
from vineyard, class, wine
where wine.vid = vineyard.vid
and wine.cid = class.cid
and wine.cid = 'SHIRAZ' and grade = 'A';
我试图创建以下索引: '''create index wine_vid_idx on wine(vid); create index wine_cid_idx on wine(cid); create index wine_grade_idx on wine(grade);```
原始查询的执行计划是:
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 42 | 9114 | 10 (0)| 00:00:01 |
|* 1 | HASH JOIN | | 42 | 9114 | 10 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 42 | 6930 | 2 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| CLASS | 1 | 50 | 1 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | SYS_C0027457 | 1 | | 1 (0)| 00:00:01 |
|* 5 | TABLE ACCESS CLUSTER | WINE | 42 | 4830 | 1 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------
| 6 | TABLE ACCESS FULL | VINEYARD | 160 | 8320 | 8 (0)| 00:00:01 |
CHAR
列类型更改为VARCHAR
或VARCHAR2
,以避免在针对固定宽度列进行查询时可能遇到的各种意外情况。此外,根据表中的数据量,全表扫描有时比索引访问更快。添加索引也会使DML稍微变慢,因为需要保持索引最新状态。您是否遇到了正在尝试解决的性能问题? - Mick Mnemonic