select TABLE1.FIELD1,
TABLE1.FIELD2,
TABLE1.FIELD3,
TABLE1.FIELD4,
TABLE1.FIELD5,
TABLE2.FIELD6,
TABLE2.FIELD7
from TABLE1,
TABLE2
where TABLE1.FIELD8 = 'value'
and TABLE2.FIELD6 = TABLE1.FIELD6;
我正在从 2 个不同的表中搜索一些数据。
(Oracle 数据库 - 为两个表索引的 wherefields)
执行上述查询需要 500 毫秒。
当我单独搜索表以查找相同的字段时
它们每个都在不到 20 毫秒内完成。
我可以在 TABLE1 中搜索我需要的数据 (+FIELD6)
然后使用 FIELD6 在 TABLE2 中搜索其余部分。
我的问题是。为什么我加入表格时速度会慢很多。
难道我做错了什么?
编辑:添加 oracle 的解释计划
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6318 | 586K| 620 |
| 1 | HASH JOIN | | 6318 | 586K| 620 |
| 2 | TABLE ACCESS BY INDEX ROWID| TABLE1 | 6318 | 450K| 2 |
| 3 | INDEX RANGE SCAN | INDEX_TABLE1_FIELD8 | 2527 | | 1 |
| 4 | TABLE ACCESS FULL | TABLE2 | 430K| 9242K| 508 |
----------------------------------------------------------------------------------------
Note: cpu costing is off, 'PLAN_TABLE' is old version
最佳答案
我看不出您的查询有什么问题,其他答案中给出的(好的)建议将帮助您详细了解正在发生的事情。
但是,在概念上,您必须牢记每个表中数据的顺序,以及数据是分组还是分散。说“查找只需要20ms”很好,但是匹配两个数据集需要多长时间?
如果已知两个数据集的顺序相同,则 RDBMS 可以相对快速地对齐它们。但是 RDBMS 只能从索引中知道这一点。
如果您在 Table1 上的索引是 Field8 然后是 Field6,则所有“值”将被集中在一起,然后按 Field6 排序。但是,如果您有一个 Field6 和 Field8 的索引,那么您感兴趣的记录将被排序但通过索引展开。最后,如果您在这些字段上没有索引,则所有内容都将随机排列并展开。
根据这些类型的因素,RDBMS 可以通过多种方式完成您的查询。为了获得最佳性能,需要了解 RDBMS 需要做什么,然后为其提供索引以使其尽可能简单。
关于SQL 语句异常缓慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4991852/