Oracle Troubleshoot : ORA-00600: internal error code, arguments: [qeshQBNextBuffer.1], [], [], [],
Oracle Troubleshoot : ORA-00600: internal error code, arguments: [qeshQBNextBuffer.1], [], [], [],
สวัสดีครับห่างหายกันไปนานเพราะติดภาระกิจเยอะ วันนี้มีปัญหาสดใหม่ที่ประสบมาฝาก แต่อาจเป็นปัญหาที่ไม่ค่อยเกิดขึ้นบ่อยนักและสามารถแก้ไขได้ มาดูรายละเอียดกันครับ
Cause :
ปัญหานี้เป็น Bug ที่เกิดขึ้นใน Oracle Enterprise Edition : 10.2.0.3.0 และเกิดขึ้นได้กับเครื่องทุก Platform
เป็นปัญหาที่เกิดขึ้นเมื่อมีการเรียกใช้ “HASH GROUP BY..” (แต่ไม่ได้เกิดทุกครั้งที่เรียกใช้ เป็นเพียงบางครั้งที่ไปโดน
bug พอดี) โดย HASH GROUP BY นี้จะถูกเรียกใช้เมื่อเรามีการรัน “SELECT … FROM … GROUP BY…” Statement
Solution :
1. แก้แบบชั่วคราว โดยเรียกใช้ alter session
alter session set “_gby_hash_aggregation_enabled”=false
|
2. หรือระบุ Hint ไม่เรียกใช้ Hash ใน SELECT Statement ดังนี้
SELECT /*+ no_use_hash_aggregation */ ….FROM …WHER …GROUP BY … |
Case Study :
ตัวอย่างที่ผมเจอคือ ต้องการสร้างตารางใหม่ที่มีการกรองความซ้ำซ้อนของข้อมูล โดยเรียกใช้ GROUP BY ดังนี้
CREATE TABLE C_FINAL_NO_DUP AS SELECT CODE, MIN(SEND_DATE) BEGIN_DATE, MAX(SEND_DATE) END_DATE, SUM(AMOUNT) AMOUNT, … FROM C_DAILY_LOG WHERE TRUNC(SEND_DATE) = TRUNC(SYSDATE) GROUP BY CODE, …;
|
ปรากฎว่าขึ้น Error แบบนี้
Elapsed: 00:00:00.09 FROM C_DAILY_LOG * ERROR at line 20: ORA-00600: internal error code, arguments: [qeshQBNextBuffer.1], [], [], [],
[], [], [], []
|
คราวนี้จึงทำการใส่ Hint จะได้หน้าตาดังนี้แล้วลองเรียกใหม่ก็สามารถสั่งทำงานได้ครับ
CREATE TABLE C_FINAL_NO_DUPAS SELECT /*+ no_use_hash_aggregation */ CODE, MIN(SEND_DATE) BEGIN_DATE, MAX(SEND_DATE) END_DATE, SUM(AMOUNT) AMOUNT, … FROM C_DAILY_LOG WHERE TRUNC(SEND_DATE) = TRUNC(SYSDATE) GROUP BY CODE ;
|