หลายคนทราบกันดีว่า 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
ไม่มีความคิดเห็น:
แสดงความคิดเห็น