Return-Path: <ml-errors@fatcity.com>
Received: from ensim.rackshack.net (root@localhost)
 by orafaq.net (8.11.6/8.11.6) with ESMTP id hAB6awo26574
 for <oracle-l@orafaq.net>; Tue, 11 Nov 2003 00:36:58 -0600
X-ClientAddr: 66.27.56.210
Received: from ns3.fatcity.com (rrcs-west-66-27-56-210.biz.rr.com [66.27.56.210])
 by ensim.rackshack.net (8.11.6/8.11.6) with ESMTP id hAB6auc26569
 for <oracle-l@orafaq.net>; Tue, 11 Nov 2003 00:36:56 -0600
Received: from ns3.fatcity.com (localhost.localdomain [127.0.0.1])
 by ns3.fatcity.com (8.12.8/8.12.8) with ESMTP id hAB3gUbP022662
 for <oracle-l@orafaq.net>; Mon, 10 Nov 2003 19:43:18 -0800
Received: (from root@localhost)
 by ns3.fatcity.com (8.12.8/8.12.5/Submit) id hAB3US6d020578
 for oracle-l@orafaq.net; Mon, 10 Nov 2003 19:30:28 -0800
Received: by fatcity.com (05-Jun-2003/v1.0g-b73/bab) via fatcity.com id 005D63E7; Mon, 10 Nov 2003 19:29:26 -0800
Message-ID: <F001.005D63E7.20031110192926@fatcity.com>
Date: Mon, 10 Nov 2003 19:29:26 -0800
To: Multiple recipients of list ORACLE-L <ORACLE-L@fatcity.com>
X-Comment: Oracle RDBMS Community Forum
X-Sender: "Khedr, Waleed" <Waleed.Khedr@FMR.COM>
Sender: ml-errors@fatcity.com
Reply-To: ORACLE-L@fatcity.com
Errors-To: ML-ERRORS@fatcity.com
From: "Khedr, Waleed" <Waleed.Khedr@FMR.COM>
Subject: RE: Interesting PL/SQL Puzzle
Organization: Fat City Network Services, San Diego, California
X-ListServer: v1.0g, build 73; ListGuru (c) 1996-2003 Bruce A. Bergman
Precedence: bulk
Mime-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

The question was not if it's a good or bad code. The question was why?
This is not the actual code that runs, just something that explains the
issue :)

So let's make it more interesting:

Let's keep the proc size unchanged while moving the end-if closer to the
main if clause, and changing if false --> if true.
Also let's make it return without trying all the code below.

It does not speed up, still nine times slower!!

Here is the proc:

CREATE OR REPLACE PROCEDURE IA.test_plsql2 (var1 in out varchar2, var2 in
out varchar2, out1 in out varchar2, out2 in out varchar2) as
pat1 varchar2(1000) := '%tttttttttttttttttt%';
pat2 varchar2(1000) := 'lllllllllllllllllllllll';
pat3 varchar2(1000) := '%dfddddddddddddddddddiii%';
pat4 varchar2(1000) := 'yyyyyyyyyyyyyyyyyyyyyyyyy';
begin
if true then
 var1 := 'aaa';
 return;
end if;
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
--
if var1 like pat3
then
   if var2 like pat1
   then
      out1 := pat2;
   else
      out1 := pat4;
   end if;
end if;
--
end;
/ 


-----Original Message-----
Sent: Monday, November 10, 2003 5:34 PM
To: Multiple recipients of list ORACLE-L


Hi!

NAME        SHARABLE_MEM
----------- ------------
TEST_PLSQL1       185607
TEST_PLSQL5         9123

A lot of junk, right? :)

PL/SQL engine works with interpretive code, it does not have any
optimizations -- here I do simplify, so do not consider this statement
as an absolute truth -- like, e.g. most of the C compilers have. It
has its own rules that are not clear, usually. dbms_profiler won't help
here (It could mislead, however. For a good example see recent post
of Raj), IMHO. As I told:

"I would suggest to consider some simple things:

. standard Oracle and your application's package(s) dependencies
. proper datatypes usage
"

These two things are simple but important.

So, I would sugget to change it to (sorry for dirty coding):

CREATE OR REPLACE PACKAGE test
IS
   PROCEDURE test_plsql2 (
     var1 in out varchar2
   , var2 in out varchar2
   , out1 in out varchar2
   , out2 in out varchar2
   );
END;
/
CREATE OR REPLACE PACKAGE BODY test
IS

pat1 CONSTANT varchar2(1000) := '%tttttttttttttttttt%';
pat2 CONSTANT varchar2(1000) := 'lllllllllllllllllllllll';
pat3 CONSTANT varchar2(1000) := '%dfddddddddddddddddddiii%';
pat4 CONSTANT varchar2(1000) := 'yyyyyyyyyyyyyyyyyyyyyyyyy';

ls       VARCHAR2(1000);
b1       BOOLEAN;
b2       BOOLEAN;

   PROCEDURE test_plsql2 (
     var1 in out varchar2
   , var2 in out varchar2
   , out1 in out varchar2
   , out2 in out varchar2
   );
begin

if false
then
   b1 := var1 LIKE pat3;
   b2 := var2 LIKE pat1;
--
if b1
then
    if b2
    then
       ls := pat2;
    else
       ls := pat4;
    end if;
end if;
.
   out1 := ls;
END;

or something alike, hope you get the idea. On my system it gives:
00:01:28.12 vs 00:00:08.60.

> When I looked at the C code generated by the native compilation, I was not
> very pleased the way native compilation works.

I think this statement of yours does answer your original question --
bad PL/SQL coding --> bad NC results.

HTH,
-- 
Vladimir Begun
The statements and opinions expressed here are my own and
do not necessarily represent those of Oracle Corporation.

Khedr, Waleed wrote:

> Below are two dummy procs that are good enough to explain the issue (Jared
> forgive me for posting this big code).
> All the code in proc test_plsql1 is inside an IF clause that will not run.
[...]
> proc test_3 ran 30 million times in 9 minutes while test_2 ran in 20
> minutes.
> Also test_2 required more CPU resources while running.
> 
> Also I tried native compilation, which did not do a lot (only 10 %
faster).
> When I looked at the C code generated by the native compilation, I was not
> very pleased the way native compilation works.
> 
> Does anybody have a clue why?
> 
> I tried to include the proc in a package and pin it but there was no
> difference.


-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.net
-- 
Author: Vladimir Begun
  INET: Vladimir.Begun@oracle.com

Fat City Network Services    -- 858-538-5051 http://www.fatcity.com
San Diego, California        -- Mailing list and web hosting services
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).
-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.net
-- 
Author: Khedr, Waleed
  INET: Waleed.Khedr@FMR.COM

Fat City Network Services    -- 858-538-5051 http://www.fatcity.com
San Diego, California        -- Mailing list and web hosting services
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: ListGuru@fatcity.com (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).

