* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download Slide show - Database Specialists
Microsoft Access wikipedia , lookup
Microsoft Jet Database Engine wikipedia , lookup
Tandem Computers wikipedia , lookup
Database model wikipedia , lookup
Clusterpoint wikipedia , lookup
Relational model wikipedia , lookup
Oracle Database wikipedia , lookup
Microsoft SQL Server wikipedia , lookup
Native PL/SQL Compilation
in Oracle9i
Roger Schrag
Database Specialists, Inc.
www.dbspecialists.com
1
Today’s Topics
Overview of PL/SQL native compilation
– What is it?
– How do you use it?
– Why?
– Documented limitations
2
More Topics
My experience with PL/SQL native
compilation
– Project background
– Ease of use
– Stability and reliability
– Performance
– Overall impressions
3
Feature Overview
What is “PL/SQL native compilation”?
How do you use this feature?
Why would you want to bother?
Are there any documented limitations?
4
PL/SQL Native Compilation
Starting in Oracle9i Release 1, PL/SQL
program units can be compiled directly into
machine code.
– Stored procedures, functions, packages, types,
and triggers
Alternatively, PL/SQL code can be
interpreted as in Oracle8i and earlier.
5
When PL/SQL Native
Compilation Occurs
When you create or explicitly recompile a
PL/SQL program, the plsql_compiler_flags
instance parameter tells Oracle whether or
not to natively compile the code.
This setting gets saved with the PL/SQL
program and used in the future in the event
of an implicit recompile.
6
Explicit vs. Implicit Compilation
Explicit compilation is where you tell Oracle to
compile a program unit:
– CREATE PACKAGE dbrx_util…
– CREATE OR REPLACE TRIGGER customers_t1…
– ALTER FUNCTION valid_email_address COMPILE;
Implicit compilation is where Oracle needs to
access a PL/SQL program unit that has been
invalidated. In this case Oracle recompiles the
program without being told to do so.
7
How PL/SQL Code is Compiled
When you compile PL/SQL into byte codes,
Oracle parses the code, validates it, and generates byte codes for interpretation at runtime.
If plsql_compiler_flags is set to ‘native’, then
Oracle generates a C code source file instead
of the byte codes. The C code is compiled
using your C compiler, and linked into a shared
library callable by the oracle executable.
8
How to Natively Compile
PL/SQL Programs
Locate C compiler, linker, and make utility.
Edit the supplied make file as needed.
Create a shared library directory.
Set instance parameters.
Explicitly compile PL/SQL programs.
Query the data dictionary.
9
Locate Your C Compiler,
Linker, and Make Utility
Oracle uses these tools on your database server
to natively compile PL/SQL programs.
See the Oracle Release Notes for your platform or
Metalink bulletin #43208.1 for which C compiler is
certified for use with Pro*C on your platform.
Most operating systems come with one standard
linker and make utility.
Find where these utilities are installed on your
database server.
10
Edit the Supplied Make File
Oracle provides a make file called
spnc_makefile.mk in $ORACLE_HOME/plsql.
Verify the variable settings:
– CC: Location of C compiler
– LD: Location of linker
– CFLAGS: C compiler optimization settings
You might not need to make any changes to the
make file if you are using the C compiler certified
by Oracle.
11
Create a Shared
Library Directory
All compiled shared libraries will reside here.
Use a separate directory for each database.
Only the Oracle software owner should have
write privilege to this directory.
Example:
mkdir $ORACLE_HOME/plsql_libs_$ORACLE_SID
chown oracle:dba $ORACLE_HOME/plsql_libs_$ORACLE_SID
chmod 755 $ORACLE_HOME/plsql_libs_$ORACLE_SID
12
Set Instance Parameters
Set at instance level:
– plsql_native_make_utility
– plsql_native_make_file_name
– plsql_native_library_dir
– plsql_native_library_subdir_count
Turn native compilation on and off at the
instance or session level:
– plsql_compiler_flags
13
plsql_native_make_utility
Specifies the full path of the make utility on
the database server.
Default value is null.
Must set to natively compile PL/SQL.
A DBA can dynamically alter this setting at
the instance level.
Users cannot alter at the session level.
14
plsql_native_make_file_name
Specifies the full path of the make file.
Default value is null.
Must set to natively compile PL/SQL.
A DBA can dynamically alter this setting at
the instance level.
Users cannot alter at the session level.
15
plsql_native_library_dir
Specifies the full path of the directory where
shared libraries will be stored.
Directory must exist—Oracle won’t create it.
Default value is null.
Must set to natively compile PL/SQL.
A DBA can dynamically alter this setting at
the instance level.
Users cannot alter at the session level.
16
plsql_native_library_subdir_count
Specifies the number of subdirectories to be used
under plsql_native_library_dir.
Default value is 0.
Set this to a value greater than zero if you expect
to have 15,000 or more natively compiled PL/SQL
programs. (Filesystem performance degrades if
you have too many files in one directory.)
A DBA can dynamically alter this setting at the
instance level.
Users can’t alter at the session level.
17
plsql_compiler_flags
Specifies whether or not PL/SQL programs should
be natively compiled, and whether or not
debugging code should be generated.
Default value is ‘interpreted’. Alternate values are
‘native’, ‘debug’, and ‘non_debug’.
A DBA can dynamically alter this setting at the
instance level.
Users can also alter this setting at the session
level.
18
plsql_native_c_compiler
and plsql_native_linker
Specifies the full path of the C compiler and linker
on the database server.
Default value is null.
You should leave these parameters unset and
allow the make file to specify the locations.
A DBA can dynamically alter these settings at the
instance level.
Users cannot alter at the session level.
19
Sample Parameter Settings
ALTER SYSTEM SET plsql_native_make_utility =
'/usr/ccs/bin/make';
ALTER SYSTEM SET plsql_native_make_file_name =
'/u01/app/oracle/product/9.2.0/plsql/spnc_makefile.mk';
ALTER SYSTEM SET plsql_native_library_dir =
'/u01/app/oracle/product/9.2.0/plsql_libs_dbrxprod';
ALTER SYSTEM SET plsql_compiler_flags = 'native';
20
Explicitly Compile
PL/SQL Programs
CREATE OR REPLACE PACKAGE dbrx_util…
ALTER TRIGGER customers_t1 COMPILE;
Implicitly recompiled PL/SQL will be recompiled
the way it was originally compiled. The setting of
plsql_compiler_flags is ignored during an implicit
recompile.
Script to assist with explicitly recompiling all code:
http://otn.oracle.com//tech/pl_sql/htdocs/R
EADME_2188517.htm
21
Query the Data Dictionary
SQL>
2
3
4
5
6
SELECT object_name, param_name,
param_value
FROM
user_stored_settings
WHERE param_name LIKE 'plsql%'
AND
object_name IN ('LOADER', 'DBRX_UTIL')
/
OBJECT_NAME
----------DBRX_UTIL
LOADER
PARAM_NAME
-------------------plsql_compiler_flags
plsql_compiler_flags
PARAM_VALUE
--------------------NATIVE,NON_DEBUG
INTERPRETED,NON_DEBUG
22
Why Compile PL/SQL Programs
For Native Execution?
Boost performance.
Improve scalability.
23
Boosting Performance
Procedural logic like IF/THEN, loops, and
jumps bypass Oracle’s PL/SQL byte code
interpreter.
SQL statements within a PL/SQL program
are not affected.
Oracle University course material claims
natively compiled “PL/SQL without SQL
references is 2 to 10 times faster” than
interpreted code.
24
Improving Scalability
Byte codes for interpreted PL/SQL programs
are loaded into the shared pool in their
entirety at invocation.
Natively compiled PL/SQL programs use
PGA memory, reducing shared pool
contention. (Of course, the shared libraries
still have to be loaded into memory by the
operating system.)
25
Documented Limitations
Package bodies must be compiled the same
way as their specifications—either both are
interpreted or both are natively compiled.
The debugging facility is not available in
PL/SQL programs compiled for native
execution.
Not a limitation: You are allowed to natively
compile the built-in PL/SQL packages.
26
My Experience with PL/SQL
Native Compilation
Project background
Ease of use
Stability and reliability
Performance
Overall impressions
27
Database Rx:Testbed For PL/SQL
Native Compilation
Application we use at Database Specialists to
monitor our customers’ databases.
Daemons receive message files from agents
running on customers’ servers at regular intervals.
Message files are parsed, loaded into database,
and analyzed for trends and problems.
Reports are generated and emailed automatically.
Users can generate ad hoc reports via web.
98% of application written in PL/SQL.
28
Database Rx:Testbed For PL/SQL
Native Compilation
29
Test Environment Basic Stats
Oracle9i Release 2 (9.2.0.1 and 9.2.0.4) 64 bit
Standard Edition.
Sun E450 server running 64 bit Solaris 8.
Schema contains 168 tables.
Over 35,000 lines of PL/SQL in 210 program units
(packages, procedures, triggers).
Backend PL/SQL programs parse, load, and
analyze message files.
Frontend PL/SQL programs generate reports and
dynamic web pages.
30
Ease of Use
On paper, PL/SQL native compilation looks
easy to use:
– Setup requires just a few ALTER SYSTEM
commands.
– Once set up, native compilation is transparent
to the developer.
In reality it is pretty easy to use, but does
have a few rough edges.
31
Ease of Use Issues
Documentation
Compiler compatibility
Compiler and make file issues
Error handling
Compile speed
Managing shared library files
All or nothing approach
32
Documentation
Release 9.2.0.1 and earlier provided little
documentation, but 9.2.0.4 is a bit better:
– See the platform-specific release notes
Metalink bulletin #151224.1 is helpful
Oracle Technology Network posting also
helpful:
http://otn.oracle.com//tech/pl_sql/htdocs/R
EADME_2188517.htm
33
Documentation
Important points not mentioned in the
documentation:
– Use a separate shared library directory for each
database
– Natively compile everything or nothing
34
Compiler Compatibility
PL/SQL native compilation is only certified
with one or two C compilers on each
platform.
Certifications for Oracle9i Release 2:
– Solaris 64 bit: Sun Forte Workshop 6.2 (eight
patches required)
– Solaris 32 bit: Sun Forte Workshop 6.1 or 6.2
– HP-UX: HP ANSI C B.11.01.25171 (one patch
required)
35
– Linux: gcc 2.95.3
Compiler Issues
Make file provided with 64 bit Oracle for
Solaris is designed for use with Sun Forte
Workshop 6.2, but I couldn’t get it to work
with that compiler.
Comments in make file show changes
required to use gcc instead of Forte.
I uncommented the lines for gcc and it
worked with gcc 3.1 perfectly the first time.
36
More Compiler Issues
Note that if you are using 64 bit Oracle, then
your compiler must generate code for 64 bit
architecture.
– For gcc this means adding “-m64” to CFLAGS.
– Odd error at runtime: “wrong ELF class:
ELFCLASS32”
Test optimization flags to find ideal
performance vs. compile speed balance.
37
Make File Issues
Compiling a PL/SQL program native the first time
will give output in SQL*Plus like the following:
SQL> ALTER SESSION SET plsql_compiler_flags = 'NATIVE';
Session altered.
SQL> ALTER PROCEDURE login COMPILE;
mv: cannot access /u01/app/oracle/product/9.2.0/plsql_libs
_dbrxprod/LOGIN__DBRX_OWNER__0.so
*** Error code 2 (ignored)
The following command caused the error:
mv /u01/app/oracle/product/9.2.0/plsql_libs_dbrxprod/LOGIN
__DBRX_OWNER__0.so /u01/app/oracle/product/9.2.0/plsql_lib
s_dbrxprod/LOGIN__DBRX_OWNER__0.so.$$
Procedure altered.
SQL>
38
Error Handling During
Native Compilation
Error output from make session will write to your
screen when connected to a local database.
Error output is lost when connected to a remote
database via Oracle Net.
These error messages are not accessible on the
Oracle error stack, the user_errors view, or the
SHOW ERRORS command in SQL*Plus.
SHOW ERRORS displays “PLS-00923: native
compilation failed: make:spdtexmk:?”.
39
Compile Speed
Compiling PL/SQL for native execution is
much slower than compiling for interpreted
execution (anywhere from twice as long to
ten times as long).
Compilation speed depends on C compiler
and linker speed.
Speed is strongly influenced by C compiler
optimization settings.
40
Managing Shared Library Files
When you drop a natively compiled PL/SQL
program, Oracle does not delete the shared
library file.
When a natively compiled PL/SQL program
gets recompiled (explicitly or implicitly),
Oracle renames the old shared library file
and does not delete it.
It is up to the DBA to manually delete
obsolete shared library files.
41
Missing Shared Library Files
Oracle will give an error if it cannot find a
shared library file.
– Oracle will not create a new shared library
automatically.
– Data dictionary will show PL/SQL is valid.
– You must explicitly recompile the PL/SQL.
So DBAs must be very careful...
– ...when purging obsolete shared library files
– ...when cloning databases
42
All or Nothing
Natively compile all PL/SQL programs or
none of them.
– Performance penalty occurs when natively
compiled code calls interpreted code.
– The result can be slower than if all code was
interpreted.
– Applies to built-ins (like SYS.STANDARD) too.
43
All or Nothing
The documentation does not mention this
anywhere.
The 1000+ built-ins are not natively
compiled by default when you create a
database. Recompiling all of the built-ins for
native execution takes time.
Oracle has provided a script on OTN that
will recompile all PL/SQL for native
execution.
44
Has All PL/SQL Been
Natively Compiled?
SQL>
2
3
4
SELECT
FROM
WHERE
GROUP BY
param_value, COUNT(*)
dba_stored_settings
param_name = 'plsql_compiler_flags'
param_value;
PARAM_VALUE
COUNT(*)
--------------------- ---------INTERPRETED,NON_DEBUG
1349
NATIVE,NON_DEBUG
1
45
Stability and Reliability
Once a PL/SQL program unit has been
successfully compiled for native execution, it
seems just as solid to me at runtime as if it were
being interpreted.
Computationally intensive code gives precisely the
same results whether natively compiled or
interpreted.
I experienced no ORA-00600 errors or weird
“PL/SQL internal error” messages.
46
Performance Tests
Null loop
Basic arithmetic
Cosines
Select from dual
Database Rx file loader
Database Rx report viewer
Compiler optimization flags
Oracle9i vs. Oracle8i
47
Performance Test: Null Loop
Iterate through an empty loop 100,000,000 times.
Compile Method
Interpreted
Native
CPU Seconds
67.40
21.62
Runtime savings: 67%
Conclusion: Branching and no-ops run significantly
faster when natively compiled.
48
Performance Test:
Basic Arithmetic
Add 10,000,000 numbers together.
Compile Method
Interpreted
Native
CPU Seconds
20.65
14.99
Runtime savings: 27%
Conclusion: Basic arithmetic runs faster when
natively compiled.
49
Performance Test: Cosines
Compute 100,000 cosines and add them together.
Compile Method
Interpreted
Native
CPU Seconds
28.40
28.25
Runtime savings: Less than 1%
Conclusion: Native compilation cannot speed up
certain mathematical computations.
50
Performance Test:
Select From Dual
Fetch one row from SYS.dual 100,000 times.
Compile Method
Interpreted
Native
CPU Seconds
24.88
24.47
Runtime savings: 2%
Conclusion: Native compilation cannot speed up
SQL, but it seems to reduce SQL processing
overhead very slightly.
51
Performance Test:
Database Rx File Loader
Parse, validate, and load 8700 text messages.
Compile Method
Interpreted
Native
CPU Seconds
17.79
15.68
Runtime savings: 12%
Conclusion: Complex PL/SQL code containing
some SQL and a lot of procedural logic can run
somewhat faster when natively compiled.
52
Performance Test:
Database Rx Report Viewer
Generate four dynamic web pages, including an
eight page Performance Summary report
Compile Method
Interpreted
Native
CPU Seconds
9.64
9.66
Runtime savings: None.
Conclusion: PL/SQL programs containing resourceheavy SQL and only a little procedural logic do not
benefit from native compilation.
53
Performance Test:
Compiler Optimization Flags
Add 10,000,000 numbers together.
Compile Method
Interpreted
Native (no optimization)
Native (gcc –O1)
Native (gcc –O3)
CPU Seconds
20.65
15.40
14.63
14.99
Conclusion: The C compiler optimization flags can
impact the speed at which natively compiled PL/SQL
programs run.
54
Performance Test:
Compiler Optimization Flags
Compile Database Rx loader package (5700 lines).
Compile Method
Interpreted
Native (no optimization)
Native (gcc –O1)
Native (gcc –O3)
Seconds to Compile
4.79
46.74
89.80
180.53
Conclusion: C compiler optimization flags have a
substantial impact on how long it takes to compile a
PL/SQL program for native execution.
55
Performance Test:
Oracle9i versus Oracle8i
Parse, validate, and load 8700 text messages.
Compile Method
Interpreted (9i)
Native (9i)
Interpreted (8i)
CPU Seconds
17.79
15.68
21.85
Conclusion: Complex PL/SQL containing a lot of
procedural logic can run 20% faster in Oracle9i than
in Oracle8i—even without native compilation. (The
savings here were in procedural logic execution, not
56
SQL optimization.)
PL/SQL Native Compilation:
My Overall Impressions
On the plus side:
– Can speed up some PL/SQL programs
– Extremely stable (9.2.0.1, 9.2.0.4 on Solaris)
– Relatively bug-free
– Not too hard to set up
– 9.2.0.4 has improved documentation over
previous releases
57
PL/SQL Native Compilation:
My Overall Impressions
On the minus side:
– Performance gains are extremely modest
• The natively compiled code consists of a series of
calls to Oracle’s PL/SQL state machine and nothing
more.
– Shared library management is an accident
waiting to happen.
– Documentation in earlier releases is lacking
58
Caveat:Your Mileage May Vary!
Performance gains vary from one
application to the next.
Stability varies from one environment to the
next.
Never take somebody else’s word on
performance or stability.
– Always test on your system using your platform,
your application, and your version of Oracle.
59
Additional Resources
Platform-specific Release Notes
Note covering the basics: Metalink bulletin #151224.1
List of certified C compilers: Metalink bulletin #43208.1
White paper that accompanies this presentation:
http://www.dbspecialists.com/presentations.html
Script to switch database between native and interpreted
(recompiles all PL/SQL):
http://otn.oracle.com/tech/pl_sql/htdocs/README_2188
517.htm
White papers on OTN that discuss new features in
PL/SQL, including native compilation:
http://otn.oracle.com/tech/pl_sql
60
Contact Information
Roger Schrag
Database Specialists, Inc.
388 Market Street, Suite 400
San Francisco, CA 94111
Tel: 415/344-0500
Email: [email protected]
Web: www.dbspecialists.com
61