วันอาทิตย์ที่ 9 พฤศจิกายน พ.ศ. 2551

ตัวอย่าง variable on SQL Statement

หลายคนทราบกันดีว่า library cache นั้นเก็บข้อมูลเกี่ยวกับ sql statements + pl/sql
ดังนั้น ทุกๆ sql ที่เราเรียกใช้งานจะเข้าไปในกระบวนการ optimization แล้วจะเก็บไว้ใน library cache
แล้วจะเอาออกจาก memory ด้วย lru algorithm.

แต่ที่พูดมาทั้งนั้น และทั้งนี้ ถ้าเรา ลดภาระ การ optimization + การเก็บ sql ใน Library cache นั้นคงดี

ผมจึงนำเสนอ การใช้ variable ก็ตัวแปรนี่เอง

ตัวอย่าง 1

log user:

SQL> select * from test01 where object_id=100;

no rows selected

SQL> select * from test01 where object_id=101;

no rows selected

จากนั้น Login ด้วย sys เพื่อต้องการ query V$SQL

SQL> select sql_text,sql_id from v$sql where lower(sql_text) like 'select% from test01%';

SQL_TEXT SQL_ID
-------------------------------------------------- -------------
select * from test01 where object_id=100 42pxm51pbj3gq
select * from test01 where object_id=101 fw9x60q5qbr7z


เราจะพบว่าจาก sql ตอนแรกนั้นได้มีการเก็บเข้าไปใน memory ถึงสองครั้ง
และแน่นอน ว่าต้องมีการ Optimization 2 ครั้งเช่นกัน ลักษณะแบบนี้เขาเรียกกันว่า hard parse

ตัวอย่าง 2

ก่อนอื่นใช้ sys user -> flush shared_pool

SQL> alter system flush shared_pool;

System altered.

login user:


SQL> var A number
SQL> exec :A := 100

PL/SQL procedure successfully completed.

SQL> select * from test01 where object_id=:A;

no rows selected

SQL> exec :A := 101

PL/SQL procedure successfully completed.

SQL> select * from test01 where object_id=:A;

no rows selected

จากนั้นใช้ sys user เพื่อเข้าไป เช็คอีกครั้ง

SQL> select sql_text,sql_id from v$sql where lower(sql_text) like 'select% from test01%'

SQL_TEXT SQL_ID
-------------------------------------------------- -------------
select * from test01 where object_id=:A dtruvsaj9k5xp

จากผลลัพท์ที่เห็น ทำให้รู้ว่า ทั้งสอง statement นั้น จะมีการ optimization ครั้งแรกครั้งเดียว
พอครั้งที่ สอง oracle พบใน memory และนำมาใช้ได้เลย แบบนี้ statement ตัวที่สอง ทำการ soft parse

ซึ่งจะประหยัด CPU และ process ในการคิดของ database

ไม่มีความคิดเห็น: