首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL查询优化器

SQL查询优化器
EN

Stack Overflow用户
提问于 2015-02-02 15:34:22
回答 1查看 69关注 0票数 0

我什么都听不懂。我有大量数据和表的Oracle 11g db。我想加入一些表并输出它的结果。好吧,我刚写到:

代码语言:javascript
运行
复制
SELECT *
FROM Table1
LEFT JOIN Table2 ON Table2.Table1_Id = Table1.Table1_Id
WHERE Table2.Column1=1
  • 很简单,但太慢了。好的,Table2和Table3连接。该表在列中包含一些标志,可以告诉我们,它与Table1一般连接。我写了下一段代码: 选择*从Table1左加入Table2 ON Table2.Table1_Id = Table1.Table1_Id左加入Table3 ON Table3.Table3_Id = Table2_Table3_Id其中的表3.‘%

与第一次查询相比,该查询具有成本低、速度快等优点。为什么,我不明白?我在我的查询中使用了3个表,它工作得更快,然后用两个表进行查询(行数相同,数据相同)。

EN

回答 1

Stack Overflow用户

发布于 2015-02-02 16:15:06

首先是一些基本知识。这是您的第一个查询:

代码语言:javascript
运行
复制
SELECT *
FROM Table1 t1 LEFT JOIN
     Table2 t2 
     ON t2.Table1_Id = t1.Table1_Id
WHERE t2.Column1 = 1;

LEFT JOIN是不必要的,因为WHERE子句无论如何都会将它转换为INNER JOIN。如果没有匹配,那么t2.Column1NULL,它将被过滤掉。

我可以想象至少有一种方式你可以看到这个性能问题。基本上,如果Table2Table1_Id上没有索引,但是它有一个Table3_Id索引。

在这种情况下,第一个查询计划需要扫描Table2 (可能在Column1上使用索引),然后执行数据库魔术--可能是表上的哈希连接。

第二个查询将使用可用的索引连接Table2Table3。这将(大概)比Table2小得多。数据库魔术可以避免对一个非常大的表进行全表扫描。

这是一种可能的情况。真正的方法是查看查询的执行计划,看看有什么不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28281205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档