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/

10-10 16:48