Oracle:SQL优化

Oracle:SQL优化,sql,oracle,Sql,Oracle,我有两张桌子,表A和表B TableA是一个具有数千/数百万条记录的大型数据集,具有唯一键(ID)和3个备用键(名称、学校、日期)。 表B是一个较小的数据集,有数千条记录,没有唯一的键 TableA --------- ID NAME SCHOOL DATE RECORD STATUS 有没有办法优化这个查询?提前感谢。如果所需信息都在表A中,您为什么要加入这些表 我能想到的唯一可能的原因是,如果您想排除A中没有对应B行的行,但是如果您的模式设置正确,您可能会有一个外键约束来强制执行 如果情况并

我有两张桌子,表A和表B

TableA是一个具有数千/数百万条记录的大型数据集,具有唯一键(ID)和3个备用键(名称、学校、日期)。 表B是一个较小的数据集,有数千条记录,没有唯一的键

TableA --------- ID NAME SCHOOL DATE RECORD STATUS
有没有办法优化这个查询?提前感谢。

如果所需信息都在表A中,您为什么要加入这些表

我能想到的唯一可能的原因是,如果您想排除A中没有对应B行的行,但是如果您的模式设置正确,您可能会有一个外键约束来强制执行

如果情况并非如此,则完全取消连接:

SELECT a.ID AS ID_key,
       a.school,
       a.name
FROM   TableA
WHERE  status = 'Active' 
如果有加入的有效原因(从您的评论来看,情况似乎是这样),请确保两个表中都有
name
school
的索引,并且您的runstats(或Oracle称之为查询优化数据的任何内容)是最新的


还要对该查询运行查询分析(
explain
),以找出问题所在。一旦将其作为基线,就可以开始修改(比如添加索引)以查看查询是否有所改进。记住#1优化咒语:衡量,不要猜测

如果没有问题(特权等),请在TableB.name和TableB.school列上添加索引。

是否定义了索引

您可以尝试以下方法:

 SELECT a.ID AS ID_key, a.school, a.name
   FROM TableA a
 WHERE (a.name, a.school ) in (select b.name, b.school from tableB b)
  AND a.status = 'Active' 

TableB是一个输入表或需要从中搜索的信息TableA@paxdiablo:你的意思是在
(姓名,学校)
上为加入创建一个复合索引吗?@ypercube,可能吧。这也将取决于其他查询。如果表B仅用于白名单选择,那么综合索引会更好。“你仍然需要测量才能确定。”所有人,谢谢你的回答^_^
SELECT a.ID AS ID_key,
       a.school,
       a.name
FROM   TableA
WHERE  status = 'Active' 
 SELECT a.ID AS ID_key, a.school, a.name
   FROM TableA a
 WHERE (a.name, a.school ) in (select b.name, b.school from tableB b)
  AND a.status = 'Active'