05 October 2020

Slow query to test

สร้างการอ่านข้อมูลที่ทำงานเป็นระยะเวลานานบน Database แบบง่ายสำหรับทดสอบการทำงาน

อธิบาย
- การอ่านข้อมูลสามารถเกิดปัญหาดังนี้
- เกิดการใช้ CPU 1 ตัว ปริมาณ 90 - 100% หรือใช้ CPU คนเดียว 1 ตัว (ต่อ 1 session)

สร้าง query slow ด้วยการ loop infinite
อธิบาย
- เมื่อ run คำสั่ง จะเกิดการใช้ทรัพยากรต่างๆดังนี้
- เกิดการใช้ CPU 1 ตัว ปริมาณ 90 - 100%  (1 session ใช้ CPU 1 ตัว)

SQL> begin
  loop
null;
  end loop;
end;
/

สร้าง query slow ด้วยการ sleep
อธิบาย
- เมื่อ run คำสั่ง จะเกิดการใช้ทรัพยากรต่างๆดังนี้
- เกิด Parallel Sessions

Create Function ให้ sleep ระยะเวลา P_SECONDS sec
SQL> create or replace function test_func_slow(p_seconds in number)
return number
is
begin
  dbms_lock.sleep(p_seconds);
  return 1;
end;
/

ตัวอย่าง ใช้ table ใดๆ โดยแต่ละ row ใช้เวลา 300 sec
SQL> select test_func_slow(300)
from test_tb_slow
connect by level <= 20000;

ตัวอย่าง ใช้ table ใดๆ โดยแต่ละ row ใช้เวลา 600 sec = 10 min และใช้ run แบบ parallel 4 CPU
SQL> create table test_tb_slow(id number);
SQL> insert into test_tb_slow(id) values(1);
SQL> insert into test_tb_slow(id) values(2);
SQL> insert into test_tb_slow(id) values(3);
SQL> commit;
SQL> select /*+ parallel(test_tb_slow 4) */ test_func_slow(600)
from test_tb_slow;

ตัวอย่าง ใช้ dual กำหนดจำนวน row = 20000 โดยแต่ละ row ใช้เวลา 300 sec
SQL> select test_func_slow(300)
from dual
connect by level <= 20000;

สร้าง query slow ด้วยการ select ข้อมูลขนาดใหญ่
จากหัวข้อ Insert Large Data to test ให้ insert ข้อมูลขนาดใหญ่ก่อน แล้วจึงเอามา select
อธิบาย
- เมื่อ run คำสั่ง จะเกิดการใช้ทรัพยากรต่างๆดังนี้
- ที่ Database เกิด Logical I/O (มีการอ่านเขียนที่ buffer ปกติอ่านจะแยอะกว่าเขียนค่อนข้างมาก เพราะการเรียกใช้ข้อมูลครั้งต่อๆไป จะมีข้อมูลเดิมบางส่วนอยู่ที่ buffer)
- เกิด Disk I/O read ที่ data file ค่อนข้างมาก เมื่อเป็นการ run ครั้งแรก

- การ select ข้อมูลสามารถเกิดปัญหาดังนี้
- อาจทำให้เกิด error ORA-01555 Snapshot Too Old ถ้า select ข้อมูลจากตารางที่กำลังมีการแก้ไขจาก user คนอื่น
   ข้อมูลเพิ่มเติมจาก https://www.tekstream.com/resource-center/ora-01555-snapshot-too-old/