Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

การกู้คืนสถิติใน Oracle Database

บล็อกโพสต์นี้จะสำรวจว่าคุณจะกู้คืนสถิติใน Oracle®Database เมื่อใดและอย่างไร

แนะนำตัว

ในฐานะผู้ดูแลระบบฐานข้อมูล (DBA) คุณมักจะพบว่าการรวบรวม Freshstatistics นำไปสู่การเพิ่มประสิทธิภาพในการดำเนินการตามแผนการดำเนินการที่ไม่เหมาะสม ในกรณีดังกล่าว คุณอาจต้องการคืนค่าสถิติจากช่วงเวลาที่ประสิทธิภาพดีขึ้น

อย่างไรก็ตาม Oracle Database เวอร์ชันต่างๆ มีการเปลี่ยนแปลงเล็กน้อยในวิธีจัดการสถิติ:

  • Oracle 10g เริ่มรักษาสถิติโดยอัตโนมัติเพื่อให้กู้คืนได้ง่าย
  • ใน 11.1 และใหม่กว่า Oracle ได้แนะนำวิธีที่ดีกว่า ซึ่งช่วยให้คุณสามารถเผยแพร่สถิติที่ล่าช้าได้

สาเหตุที่เป็นไปได้สำหรับประสิทธิภาพทางสถิติที่ไม่ดี

คุณอาจพบว่าจำเป็นต้องรวบรวมสถิติเพื่อให้แน่ใจว่าเครื่องมือเพิ่มประสิทธิภาพเลือกแผนการดำเนินการที่เหมาะสมที่สุด แต่การรวบรวมสถิติจะทำให้การแสดงคำสั่ง SQL ที่แยกวิเคราะห์เป็นโมฆะ นอกจากนี้ การแยกวิเคราะห์คำสั่งหลังการรวบรวมสถิติใหม่จะทำให้เครื่องมือเพิ่มประสิทธิภาพเลือกแผนการดำเนินการที่แตกต่างและปรับให้เหมาะสมน้อยกว่าแผนเดิมได้

ใน Oracle 10g และใหม่กว่า คุณสามารถกู้คืนสถิติได้โดยใช้ dbms_stats แพ็คเกจซึ่งให้ตัวเลือกแก่คุณในการกู้คืนสถิติและสถิติการส่งออก

ตามค่าเริ่มต้น Oracle จะเก็บสถิติที่ผ่านมาเป็นเวลา 31 วัน แต่คุณสามารถเปลี่ยนช่วงเวลานั้นได้

รูปภาพต่อไปนี้แสดงคำสั่ง SQL เพื่อแสดงระยะเวลาเก็บรักษาปัจจุบัน:

การกู้คืนสถิติใน Oracle Database

หากต้องการเปลี่ยนระยะเวลาเก็บรักษา ให้รันคำสั่งต่อไปนี้ โดยที่ xx คือจำนวนวันที่คุณต้องการใช้:

 SQL> execute DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (xx)

แบบสอบถามต่อไปนี้ช่วยให้คุณเข้าใจว่าสถิติข้อมูลในอดีตใดที่คุณสามารถกู้คืนได้:

การกู้คืนสถิติใน Oracle Database

หมายเหตุ: ตัวอย่างนี้แสดงสถิติจากวันที่กล่าวถึงก่อนหน้านี้และภายหลัง

กำลังเรียกคืนสถิติตาราง

ตัวอย่างนี้สาธิตวิธีการคืนค่าสถิติตารางจากวันที่ก่อนหน้า

ขั้นแรก ระบุสถิติที่มีให้โดยเรียกใช้คำสั่งต่อไปนี้:

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

ส่งออกสถิติที่คุณต้องการบันทึก

คุณยังสามารถส่งออกสถิติที่คุณต้องการบันทึกหรือส่งออกสถิติปัจจุบัน ก่อนที่คุณจะทำการเปลี่ยนแปลงโดยทำตามขั้นตอนต่อไปนี้:

  1. สร้างตารางสถิติโดยการรันคำสั่งที่คล้ายกับตัวอย่างต่อไปนี้:

    Exec dbms_stats.create_stat_table (ownname => 'MYSELF', stattab => 'MYSELF_STATS_',tblspace => '

    ');

    ชื่อเจ้าของ: ชื่อเจ้าของstattab: ชื่อตารางภายใต้ผู้ใช้ MYSELF เพื่อสร้างtblspace: tablespace ที่จะสร้างตารางนี้

  2. ส่งออกสถิติในตารางก่อนหน้าโดยรันคำสั่งที่คล้ายกับตัวอย่างต่อไปนี้:

    exec dbms_stats.export_table_stats('SCHEMA1','TAB1',NULL,'STATS','TAG1_TAB1',TRUE);

    ตัวอย่างเช่น:

    Exec dbms_stats.export_database_stats (statown => 'MYSELF', stattab => 'MYSELF_STATS');

  3. บทสรุป

    ข้อมูลและข้อความค้นหาในโพสต์นี้ช่วยให้คุณกู้คืนสถิติฐานข้อมูลทุกประเภท (ตาราง ฐานข้อมูล สคีมา Fixed_Object ระบบ และพจนานุกรม) ให้เป็นวันที่ที่ผ่านมาอย่างเหมาะสม เพื่อให้มั่นใจว่าประสิทธิภาพของฐานข้อมูลจะราบรื่น

    ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม คุณยังแชทตอนนี้เพื่อเริ่มการสนทนาได้

    เรียนรู้เพิ่มเติมเกี่ยวกับบริการฐานข้อมูลของเรา