优化SQL语句

优化SQL语句,sql,Sql,如果表B中由a和B之间匹配的3列分组的记录数小于7,我需要更新表a中的一列。我已经写了下面的查询,但它运行时间很长。请建议任何优化查询或对此进行调整 update /*+ parallel(A) */ A set A.col4=0 where exists (select 1 from B where A.col1=B.col1 and A.col2=B.col2 and A.col3=B.col3 group by

如果表B中由a和B之间匹配的3列分组的记录数小于7,我需要更新表a中的一列。我已经写了下面的查询,但它运行时间很长。请建议任何优化查询或对此进行调整

update /*+ parallel(A) */ A set A.col4=0
where exists
      (select 1 
       from B 
       where A.col1=B.col1 and A.col2=B.col2
          and A.col3=B.col3 
       group by col1,col2,col3
       having count(*) < 7)

我的第一个建议是在B上创建一个索引:Bcol1,col2,col3

下一次尝试是将其切换到联接:

试试这个

MERGE INTO A 
USING (
SELECT col1, col2, col3
      FROM B
      GROUP BY col1, col2, col3
      HAVING COUNT(*) > 7
) b ON (A.col1 = b.col1 AND A.col2=b.col2 AND A.col3= b.col3)
WHEN MATCHED THEN UPDATE
SET A.col4 = 0;
在SQL Fiddle上查看它:


让我知道它是否有效

你检查过这个项目的执行计划了吗?您在这些表上有索引吗?您在使用Oracle吗?到目前为止,这里没有帮助您的信息。在这一点上,我建议您总体上研究查询调优。没有有用的具体答案。是的,我正在使用oracle,我已经检查了解释计划,我发现成本非常高。为了添加一些细节,我在where子句中使用的列是主键组合,我的第二个表B将包含大量数据。这是一个事务表。下面是解释计划。查询计划行Rowsource Times UPDATE语句成本=831591 0 UPDATE DFU 0筛选器0表访问完整DFU 210K 0筛选器0哈希组按1 0索引范围扫描历史根据我的知识选择8 0语法错误。我们怎么能在Update语句中的set子句之后有from子句呢?之前我为SQL Server编写了一段代码。现在我已经为Oracle修改了它。让我知道它现在是否有效。谢谢迪潘杜。。我已经按照我的要求使用了这个合并逻辑并准备好了查询。。运行时间为12秒,A中的行总数为200k+,B中的行总数为200万+…欢迎,我认为在表B中的col1、col2和col3上建立索引可以使它变得更好。如果您想进一步提高查询性能,请尝试一下。我在连接条件中使用的3列是这两个表的主键的一部分。使用SELECT DISTINCT col1,col2,col3从SELECT col1,col2,col3中选择不同的col1,col2,col3,col3从B中通过col1,col2,col3,col4 cnt进行分区合并到A中,其中A.col1=B.col1和A.col2=B.col2和A.col3=B.col3匹配时,cnt<7B,然后更新集A.col5=0;我是否仍然需要显式添加提示以使查询使用索引?我期待着,查询本身将走向bast方式
MERGE INTO A 
USING (
SELECT col1, col2, col3
      FROM B
      GROUP BY col1, col2, col3
      HAVING COUNT(*) > 7
) b ON (A.col1 = b.col1 AND A.col2=b.col2 AND A.col3= b.col3)
WHEN MATCHED THEN UPDATE
SET A.col4 = 0;