调整SQL更新查询

调整SQL更新查询,sql,oracle11g,Sql,Oracle11g,我正在使用这个更新查询,它大约需要8小时来执行,我希望它需要更少的时间,我如何才能做到这一点?我的问题是: BEGIN LOOP UPDATE ENCORE_LIVE.INSTRUMENT_CLASSIFICATION SET CODE = NULL WHERE TYPE_ID = 15 AND CODE is not NULL and rownum < 50000; exit when SQL%row

我正在使用这个更新查询,它大约需要8小时来执行,我希望它需要更少的时间,我如何才能做到这一点?我的问题是:

BEGIN
      LOOP
         UPDATE  ENCORE_LIVE.INSTRUMENT_CLASSIFICATION SET CODE = NULL WHERE TYPE_ID =
         15 AND CODE is not NULL
         and rownum < 50000;

         exit when SQL%rowcount < 49999;
         commit;
      END LOOP;
      commit;
END;
开始
环
更新ENCORE\u LIVE.INSTRUMENT\u分类集代码=NULL,其中类型\u ID=
15和代码不为空
rownum<50000;
当SQL%rowcount<49999时退出;
犯罪
端环;
犯罪
结束;

那么您正在批量更新一个包含50000条记录的表,对吗

您应该验证在
仪器分类
表中是否有列
类型ID
代码
,并最终创建索引

也检查一下

您的更新查询是基本查询,无法进行任何优化。要创建索引,可以使用:

CREATE INDEX instrumentClasification_TypeCode_idx
     ON ENCORE_LIVE.INSTRUMENT_CLASSIFICATION
        (TYPE_ID, CODE)

还应考虑在一批中运行更新查询,而不将其批处理。p> 标记您正在使用的dbms。该代码是特定于产品的。它只更新50000条记录,而我有22468909条记录用于上述条件。你知道不进行这些批处理需要多长时间吗?为什么你不只是运行单个更新语句?如果这是由于撤消空间不足造成的,并且这是一条定期运行的语句(与一次性、临时更新相反),那么我强烈建议您要求DBA增加撤消空间以容纳此语句。如果需要成批执行,为什么不使用批量收集和FORALL。我对索引了解不多,既然是数据库新手,你能不能给我提供一个查询,这样更新的时间就会少一些。@SuyashGupta:Vojtěch为你推荐了一个索引,为什么不试试呢?在测试数据库上运行,并根据需要进行调整。请记住,堆栈溢出不是免费劳动力的交换所-当您收到一个答案时,您需要执行执行工作。我已经按照上述代码创建了索引,现在您可以提供我的查询作为我先前查询的替代吗?结果是-是更快还是更慢,还是相同?除了@Boneist comment之外,SQL中没有什么可以改进的。我应该现在运行相同的查询吗,我的意思是我已经创建了一个索引名->工具分类\u TypeCode\u idx现在如何使用它?