当前位置: 首页 > 面试题库 >

Oracle PL / SQL-NO_DATA_FOUND异常是否不利于存储过程的性能?

乌灿
2023-03-14
问题内容

我正在编写一个存储过程,该过程需要很多条件。有了C#.NET编码的常识,即异常会影响性能,所以我也始终避免在PL /
SQL中使用它们。我在此存储过程中的条件主要围绕记录是否存在而进行,我可以采用以下两种方法之一:

SELECT COUNT(*) INTO var WHERE condition;
IF var > 0 THEN
   SELECT NEEDED_FIELD INTO otherVar WHERE condition;
....

-或者-

SELECT NEEDED_FIELD INTO var WHERE condition;
EXCEPTION
WHEN NO_DATA_FOUND
....

第二种情况对我来说似乎更优雅一些,因为这样我就可以使用NEEDED_FIELD,而我必须在第一种情况下的条件之后的第一条语句中选择该值。更少的代码。但是,如果使用COUNT(*)将使存储过程运行得更快,那么我不介意多输入一些内容来提高处理速度。

有什么提示吗?我是否错过了另一种可能性?

编辑 我应该提到,这已经嵌套在一个FOR LOOP中。不知道这与使用游标是否有所不同,因为我认为我不能在FOR LOOP中将游标作为选择进行声明。


问题答案:

我不会使用显式游标来执行此操作。当可以使用隐式游标时,Steve F.不再建议人们使用显式游标。

的方法count(*)不安全。如果另一个会话删除符合条件的行,则在的行之后count(*),在的行之前select ... into,代码将引发将无法处理的异常。

原始帖子的第二个版本没有此问题,通常是首选。

就是说,使用该异常会产生少量开销,并且如果您100%确定数据不会更改,则可以使用count(*),但是我建议您使用它。

我在 32位Windows的 Oracle 10.2.0.1
上运行了这些基准测试。我只看过去的时间。还有其他测试工具可以提供更多详细信息(例如锁存器计数和使用的内存)。 __

SQL>create table t (NEEDED_FIELD number, COND number);

表已创建。

SQL>insert into t (NEEDED_FIELD, cond) values (1, 0);

已创建1行。

declare
  otherVar  number;
  cnt number;
begin
  for i in 1 .. 50000 loop
     select count(*) into cnt from t where cond = 1;

     if (cnt = 1) then
       select NEEDED_FIELD INTO otherVar from t where cond = 1;
     else
       otherVar := 0;
     end if;
   end loop;
end;
/

PL / SQL过程成功完成。

播出时间00:00:02.70

declare
  otherVar  number;
begin
  for i in 1 .. 50000 loop
     begin
       select NEEDED_FIELD INTO otherVar from t where cond = 1;
     exception
       when no_data_found then
         otherVar := 0;
     end;
   end loop;
end;
/

PL / SQL过程成功完成。

播放时间: 00:00:03.06



 类似资料:
  • 问题内容: 我有以下问题:从我的应用程序一次调用存储的proc时,有时(例如1000次调用中有1次),需要10到30秒才能完成。通常,存储过程在不到一秒钟的时间内运行。这是一个非常简单的proc,只需单击一次即可将几个表联系在一起。所有表名都设置有(NOLOCK)提示,因此它可能没有锁定。索引也就位,否则它会一直很慢。 问题是,无论它运行sproc多少次,我都无法在SSMS中复制此问题(因为它始终

  • 主要内容:示例Transact SQL 中的存储过程用于一次又一次地节省编写代码的时间。它通过将过程存储在数据库中并通过传递参数来获得所需的输出来实现这一点。 语法: 下面是存储过程创建的语法 - 参数可选:当我们创建一个过程时,一个或多个参数被传递到过程中。存储过程中有3种类型的参数: IN - 过程可以引用参数。该过程将覆盖参数的值。 OUT- 过程不能引用参数,但过程会覆盖参数值。 IN OUT- 参数被

  • SQL Server存储过程将一个或多个Transact-SQL语句分组到逻辑单元中,并作为对象存储在数据库服务器中。 当第一次调用存储过程时,SQL Server会创建执行计划并将其存储在计划缓存中。 在之后的存储过程执行中,SQL Server重用该程序,以便存储过程可以非常快速地执行并具有可靠的性能。 本系列教程将介绍存储过程,并演示如何开发灵活的存储过程以优化数据库访问。 第1节. SQL

  • 主要内容:PL/SQL子程序的部分,创建存储过程,执行独立程序,删除独立存储过程,PL/SQL子程序中的参数模式,传递参数的方法在本章中,我们将讨论PL/SQL中的存储过程。 子程序是执行特定任务的程序单元/模块。 这些子程序组合起来形成更大的程序。这种做法被称为“模块化设计”。 子程序可以被称为调用程序的另一个子程序或程序调用。 可以在以下几个地方中创建一个子程序 - 在模式(schema)级别中 一个程序包中 在PL/SQL块中 在模式(schema)级别中,子程序是一个独立的子程序。它是使

  • 问题内容: 最近在我的日常工作中被指示,关于存储过程的任何注释都必须不存在于存储过程中,而必须使用扩展属性。 过去我们使用过类似的方法。 这样,只要有人在SSMS中打开该过程,他们就会看到该注释,而在过程中还存在其他注释,以记录我们的过程。现在我不知道与此有关的任何性能/内存问题。但是,我们有些人坚持要这样做。 我无法找到任何文档来证明或否认此类注释存在性能和/或内存问题。 所以我的问题是,有人知

  • 本文向大家介绍sql 判断函数、存储过程是否存在的代码整理,包括了sql 判断函数、存储过程是否存在的代码整理的使用技巧和注意事项,需要的朋友参考一下 下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助。