บล็อกโพสต์นี้จะสำรวจว่าคุณจะกู้คืนสถิติใน Oracle®Database เมื่อใดและอย่างไร
แนะนำตัว
ในฐานะผู้ดูแลระบบฐานข้อมูล (DBA) คุณมักจะพบว่าการรวบรวม Freshstatistics นำไปสู่การเพิ่มประสิทธิภาพในการดำเนินการตามแผนการดำเนินการที่ไม่เหมาะสม ในกรณีดังกล่าว คุณอาจต้องการคืนค่าสถิติจากช่วงเวลาที่ประสิทธิภาพดีขึ้น
อย่างไรก็ตาม Oracle Database เวอร์ชันต่างๆ มีการเปลี่ยนแปลงเล็กน้อยในวิธีจัดการสถิติ:
- Oracle 10g เริ่มรักษาสถิติโดยอัตโนมัติเพื่อให้กู้คืนได้ง่าย
- ใน 11.1 และใหม่กว่า Oracle ได้แนะนำวิธีที่ดีกว่า ซึ่งช่วยให้คุณสามารถเผยแพร่สถิติที่ล่าช้าได้
สาเหตุที่เป็นไปได้สำหรับประสิทธิภาพทางสถิติที่ไม่ดี
คุณอาจพบว่าจำเป็นต้องรวบรวมสถิติเพื่อให้แน่ใจว่าเครื่องมือเพิ่มประสิทธิภาพเลือกแผนการดำเนินการที่เหมาะสมที่สุด แต่การรวบรวมสถิติจะทำให้การแสดงคำสั่ง SQL ที่แยกวิเคราะห์เป็นโมฆะ นอกจากนี้ การแยกวิเคราะห์คำสั่งหลังการรวบรวมสถิติใหม่จะทำให้เครื่องมือเพิ่มประสิทธิภาพเลือกแผนการดำเนินการที่แตกต่างและปรับให้เหมาะสมน้อยกว่าแผนเดิมได้
ใน Oracle 10g และใหม่กว่า คุณสามารถกู้คืนสถิติได้โดยใช้ dbms_stats แพ็คเกจซึ่งให้ตัวเลือกแก่คุณในการกู้คืนสถิติและสถิติการส่งออก
ตามค่าเริ่มต้น Oracle จะเก็บสถิติที่ผ่านมาเป็นเวลา 31 วัน แต่คุณสามารถเปลี่ยนช่วงเวลานั้นได้
รูปภาพต่อไปนี้แสดงคำสั่ง SQL เพื่อแสดงระยะเวลาเก็บรักษาปัจจุบัน:
หากต้องการเปลี่ยนระยะเวลาเก็บรักษา ให้รันคำสั่งต่อไปนี้ โดยที่ xx คือจำนวนวันที่คุณต้องการใช้:
SQL> execute DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (xx)
แบบสอบถามต่อไปนี้ช่วยให้คุณเข้าใจว่าสถิติข้อมูลในอดีตใดที่คุณสามารถกู้คืนได้:
หมายเหตุ: ตัวอย่างนี้แสดงสถิติจากวันที่กล่าวถึงก่อนหน้านี้และภายหลัง
กำลังเรียกคืนสถิติตาราง
ตัวอย่างนี้สาธิตวิธีการคืนค่าสถิติตารางจากวันที่ก่อนหน้า
ขั้นแรก ระบุสถิติที่มีให้โดยเรียกใช้คำสั่งต่อไปนี้:
SQL> select TABLE_NAME, STATS_UPDATE_TIME from dba_tab_stats_history where table_name like 'MY_TABLE' and owner='MYSELF' order by 2;
TABLE_NAME STATS_UPDATE_TIME
--------------- --------------------------------------
MY_TABLE 20-DEC-19 05.32.26.887184 AM -05:00
MY_TABLE 20-DEC-19 10.10.19.361091 PM -05:00
MY_TABLE 21-DEC-19 05.32.14.475934 AM -05:00
MY_TABLE 21-DEC-19 10.10.18.725917 PM -05:00
MY_TABLE 22-DEC-19 10.10.17.841143 PM -05:00
MY_TABLE 23-DEC-19 05.32.56.168779 AM -05:00
MY_TABLE 23-DEC-19 10.10.23.633939 PM -05:00
MY_TABLE 24-DEC-19 05.32.14.082730 AM -05:00
MY_TABLE 24-DEC-19 10.10.21.712948 PM -05:00
MY_TABLE 25-DEC-19 05.32.13.710159 AM -05:00
MY_TABLE 25-DEC-19 10.10.17.836929 PM -05:00
MY_TABLE 26-DEC-19 05.32.14.545533 AM -05:00
MY_TABLE 26-DEC-19 10.10.12.808687 PM -05:00
MY_TABLE 27-DEC-19 05.32.13.779967 AM -05:00
คุณจะเห็นว่า MY_TABLE ได้รับการวิเคราะห์หลายครั้งในช่วงไม่กี่วันที่ผ่านมา เพื่อเรียกคืนสถิติตารางของตารางที่รวบรวมไว้เมื่อ21-DEC-19 10.10.18.725917 PM -05:00 ให้รันคำสั่งต่อไปนี้:
SQL> execute dbms_stats.restore_table_stats('MYSELF','MY_TABLE','21-DEC-19 10.10.18.725917 PM -05:00');
PL/SQL procedure successfully completed.
การกู้คืนสถิติสคีมา
ตัวอย่างนี้สาธิตวิธีการคืนค่าสถิติสคีมาจากวันที่ก่อนหน้า
เพื่อเรียกคืนสถิติสคีมาของตารางที่รวบรวมไว้เมื่อ21-DEC-19 10.10.18.725917 PM -05:00 ให้รันคำสั่งต่อไปนี้:
SQL> exec dbms_stats.restore_schema_stats(ownname=>'MYSELF', AS_OF_TIMESTAMP=>'21-DEC-19 10.10.18.725917 PM -05:00');
หากต้องการค้นหาตัวเลือกสถิติสคีมาที่พร้อมใช้งานสำหรับ AS_OF_TIMESTAMP ให้รันคำสั่งต่อไปนี้และเลือกวันที่ที่เหมาะสมสำหรับการกู้คืน:
select count(*), stats_update_time from dba_tab_stats_history where owner='MYSELF'group by stats_update_time;
เรียกคืนสถิติอื่นๆ
คุณได้เห็นวิธีคืนค่าสถิติของตารางและสคีมาแล้ว รายการต่อไปนี้แสดงเอนทิตีทั้งหมดที่คุณสามารถกู้คืนสถิติก่อนหน้า:
- TABLE_STATS
- SCHEMA_STATS
- DATABASE_STATS
- DICTIONARY_STATS
- FIXED_OBJECTS_STATS
- SYSTEM_STATS
ส่งออกสถิติที่คุณต้องการบันทึก
คุณยังสามารถส่งออกสถิติที่คุณต้องการบันทึกหรือส่งออกสถิติปัจจุบัน ก่อนที่คุณจะทำการเปลี่ยนแปลงโดยทำตามขั้นตอนต่อไปนี้:
-
สร้างตารางสถิติโดยการรันคำสั่งที่คล้ายกับตัวอย่างต่อไปนี้:
Exec dbms_stats.create_stat_table (ownname => 'MYSELF', stattab => 'MYSELF_STATS_
',tblspace => ' ');
ชื่อเจ้าของ: ชื่อเจ้าของstattab: ชื่อตารางภายใต้ผู้ใช้ MYSELF เพื่อสร้างtblspace: tablespace ที่จะสร้างตารางนี้
ส่งออกสถิติในตารางก่อนหน้าโดยรันคำสั่งที่คล้ายกับตัวอย่างต่อไปนี้:
exec dbms_stats.export_table_stats('SCHEMA1','TAB1',NULL,'STATS','TAG1_TAB1',TRUE);
ตัวอย่างเช่น:
Exec dbms_stats.export_database_stats (statown => 'MYSELF', stattab => 'MYSELF_STATS');
บทสรุป
ข้อมูลและข้อความค้นหาในโพสต์นี้ช่วยให้คุณกู้คืนสถิติฐานข้อมูลทุกประเภท (ตาราง ฐานข้อมูล สคีมา Fixed_Object ระบบ และพจนานุกรม) ให้เป็นวันที่ที่ผ่านมาอย่างเหมาะสม เพื่อให้มั่นใจว่าประสิทธิภาพของฐานข้อมูลจะราบรื่น
ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม คุณยังแชทตอนนี้เพื่อเริ่มการสนทนาได้
เรียนรู้เพิ่มเติมเกี่ยวกับบริการฐานข้อมูลของเรา