【发布时间】:2020-01-22 16:15:59
【问题描述】:
我需要使用索引来优化这个查询。我试图索引一些列,但它没有帮助。有没有人有想法?
我需要优化的查询:
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';
我尝试创建以下索引: '''在 wine(vid) 上创建索引 wine_vid_idx; 在 wine(cid) 上创建索引 wine_cid_idx; 在 wine(grade) 上创建索引 wine_grade_idx;```
我对原始查询的执行计划是:
----------------------------------------------------------------------------------------------
| 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 |
【问题讨论】:
-
数据库性能取决于许多不同的因素,仅仅查看查询并“调整它”是不可能的。当然,乐于助人的人会尝试猜测(并且已经有两个人这样做了),但他们只是在猜测。你需要尝试一下,看看什么对你有用。我敦促您阅读this response on optimizing Oracle queries。它将解释我们在提供知情建议之前需要的详细信息范围。它还可以让您有信心自己调整查询。
-
如果可能,您应该考虑将
CHAR列类型更改为VARCHAR或VARCHAR2,以避免在查询固定宽度的列时可能遇到的各种意外。此外,根据表中的数据量,全表扫描有时可能比索引访问更快。添加索引也会使 DML 稍微变慢,因为索引需要保持最新。您是否遇到了要解决的性能问题?
标签: sql oracle query-performance