ฟังก์ชันทางสถิติการบำรุงรักษา (autostats) ใน SQL Server

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 195565 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

อาจทำงานบำรุงรักษาทางสถิติที่มีการนำมาใช้ใหม่ AutoStat สร้างค่าใช้จ่ายที่ไม่พึงประสงค์ในระบบการผลิต โดยทำอย่างใดอย่างหนึ่ง การดำเนินการดังต่อไปนี้:
  • กำลังเริ่มการปรับปรุงทางสถิติในระหว่างรอบระยะเวลาการผลิตจำนวนมาก

    - หรือ -
  • กำลังเริ่มกระบวนการปรับปรุงสถิติที่จุดที่กำหนดจำนวน excessively สูงในเวลา
วัตถุประสงค์ของบทความนี้จะละเอียดเงื่อนไขภายใต้ซึ่งคุณสามารถ คาดว่าจะเห็น autostats ที่สร้างขึ้นและปรับปรุงสถิติที่มีการเรียกใช้กับ ตารางในฐานข้อมูล

สำหรับข้อมูลเกี่ยวกับการ autostats ใน SQL Server 2000 ให้ดูที่ "สถิติใช้ โดยแบบสอบถามอาจัดรูปแบบใน Microsoft SQL Server 2000" ใน MSDN เว็บไซต์ต่อไปนี้:
http://msdn2.microsoft.com/en-us/library/aa902688 (SQL.80) .aspx


หมายเหตุถ้าคุณกำลังใช้ Microsoft SQL Server 2005 ดูสีขาวกระดาษของ Microsoft ต่อไปนี้สำหรับข้อมูลเกี่ยวกับวิธีใช้สถิติโดยอาจัดรูปแบบแบบสอบถามใน SQL Server 2005:
http://technet.microsoft.com/en-us/library/cc966419.aspx

ข้อมูลเพิ่มเติม

ข้อมูลทั่วไป

SQL Server ทำให้ใช้ของอาจัดรูปแบบตามต้นทุนแบบที่สามารถเป็นอย่างมาก มีความสำคัญกับข้อมูลสถิติที่ให้ไว้ในตาราง และ ดัชนี โดยไม่ถูกต้อง และทันสมัยทางสถิติข้อมูล เซิร์ฟเวอร์ SQL สามารถ challenged เพื่อกำหนดแผนการดำเนินการที่ดีที่สุดสำหรับเฉพาะ การสอบถาม

สถิติการรักษาไว้ในแต่ละตารางใน SQL Server เพื่อช่วยในการอาจัดรูปแบบ ในการตัดสินตามต้นทุนการทำรวม:
  • จำนวนของแถวในตาราง
  • จำนวนเพจที่ใช้ตามตาราง
  • หมายเลขของการปรับเปลี่ยนคีย์ของตารางที่ทำตั้งแต่การปรับปรุงครั้งล่าสุดเป็นสถิติ
ไม่ได้เก็บข้อมูลเพิ่มเติมสำหรับดัชนี รวมทั้ง (สำหรับแต่ละดัชนี):
  • ฮีสโตแกมีความสูง equi รมบนคอลัมน์แรก
  • Densities บนเลขนำหน้าทั้งหมดของคอลัมน์
  • ความยาวคีย์โดยเฉลี่ย
สถิติในดัชนีถูกสร้างโดยอัตโนมัติเมื่อใดก็ ตามที่มีการสร้างดัชนี สร้าง นอกจากนี้ ในขณะนี้สามารถถูกสร้าง และรักษาสถิติบน คอลัมน์อื่นเช่นเดียวกัน

เมื่อต้องการเก็บรักษาข้อมูลทางสถิติในการที่ต้องทันสมัยอยู่เสมอว่าเป็น มี SQL Server สามารถทำได้ AutoStat ซึ่ง ผ่านของ SQL Server การตรวจสอบของการปรับเปลี่ยนตาราง มีความสามารถของการปรับปรุงโดยอัตโนมัติใน สถิติสำหรับตารางเมื่อถึงเพดานการการเปลี่ยนแปลงที่แน่นอนแล้ว นอกจากนี้ SQL Server แนะนำอัตโนมัติสร้างสถิติ ซึ่ง ทำให้เซิร์ฟเวอร์เพื่อสร้างสถิติที่จำเป็นสำหรับทั้งหมดโดยอัตโนมัติ ปรับให้เหมาะสมถูกต้องของแบบสอบถามที่ระบุ

การกำหนดเมื่อมีการสร้าง AutoStat imminent

ตามที่กล่าวถึงข้างต้น AutoStat โดยอัตโนมัติ update สถิติสำหรับ ถึงตารางเฉพาะเมื่อการ "เปลี่ยนเขตแดน" แล้ว ที่ คอลัมน์ sysindexes.rowmodctr รักษาอยู่ทั้งหมดของการปรับเปลี่ยนทั้งหมด ตาราง ที่ เวลา สามารถส่งผลกระทบกับของตัวประมวลผลแบบสอบถาม การตัดสินใจในการทำขั้นตอน ตัวนับนี้จะได้รับการปรับปรุงแต่ละครั้งใดก็ได้ ต่อเหตุการณ์ที่เกิดขึ้น:
  • ทำการแทรกแถวเดียว
  • ทำการลบแถวเดียว
  • ทำการปรับปรุงไปยังคอลัมน์ที่จัดทำดัชนีไว้
หมายเหตุ: ตัดตารางอัพเด rowmodctr

หลังจากที่มีการปรับปรุงตารางสถิติ ค่า rowmodctr ถูกตั้งค่าใหม่เป็น 0 และมีการปรับปรุงรุ่นของ schema ของตารางสถิติ

การเพิ่มเติม ในกรณีที่เป็นของแผนปฏิบัติการของกระบวนงานเก็บไว้ นำมาจากแคช และแผนนั้นจะมีความสำคัญกับสถิติ สถิติ รุ่นของ schema ที่จะสามารถเปรียบเทียบกับรุ่นปัจจุบัน ถ้ามีใหม่ จะ recompiled สถิติพร้อมใช้งาน แผนสำหรับกระบวนงานที่เก็บไว้

อัลกอริทึมพื้นฐานสำหรับสถิติเกี่ยวกับการปรับปรุงอัตโนมัติคือ:
  • ถ้า cardinality สำหรับตารางมีน้อยกว่าหก และตารางในฐานข้อมูลของ tempdb อัตโนมัติปรับปรุง ด้วยการปรับเปลี่ยนตารางทุกหก
  • ถ้า cardinality สำหรับตารางมากกว่า 6 แต่น้อยกว่า หรือเท่ากับ 500 การปรับปรุงสถานะเปลี่ยนแปลงทุก ๆ 500
  • ถ้าการ cardinality สำหรับตารางมีค่ามากกว่า 500 ปรับปรุงสถิติเมื่อ (500 + 20 เปอร์เซ็นต์ของตาราง) การเปลี่ยนแปลงเกิดขึ้น
  • สำหรับตัวแปรตาราง การเปลี่ยนแปลง cardinality ไม่กระตุ้นสถิติเกี่ยวกับการปรับปรุงอัตโนมัติ
หมายเหตุ: ในที่นี้ควรเข้มงวดที่สุด SQL Server นับ cardinality เป็นจำนวนของแถวในตาราง

หมายเหตุ: นอกจากการ cardinality, selectivity ของเพรดิเคตยังมีผล AutoStats การสร้าง ซึ่งหมายความว่า สถิติที่อาจไม่ปรับปรุง afer ปรับเปลี่ยนทุก ๆ 500 ถ้า cardinality < 500="" or="" for="" every="" 20%="" of="" changes="" if="" cardinality="" were=""> 500 ได้ มีสร้างมาตราส่วนอัพปัจจัย (ค่าช่วงตั้งแต่ 1 ถึง 4, 1 และ 4 ที่ครอบคลุมยิ่งขึ้น) ทั้งนี้ขึ้นอยู่กับที่ selectivity และผลิตภัณฑ์ของปัจจัยนี้และจำนวนที่ใช้ในการเปลี่ยนแปลงตามที่ได้รับจากอัลกอริทึมจะเป็นหมายเลขที่ถูกต้องแท้จริงของการเปลี่ยนแปลงที่จำเป็นสำหรับการสร้าง AutoStats

สามารถ summarised อัลกอริทึมด้านบนในรูปแบบของตาราง:
_________________________________________________________________________________
 Table Type | Empty Condition | Threshold When Empty |Threshold When Not Empty 
_________________________________________________________________________________
 Permanent  | < 500 rows      | # of Changes >= 500  | # of Changes >= 500 + (20% of Cardinality)
___________________________________________________________________________
 Temporary  | < 6 rows        | # of Changes >= 6    | # of Changes >= 500 + (20% of Cardinality)
___________________________________________________________________________
Table
Variables   | Change in cardinality does not affect AutoStats generation.
___________________________________________________________________________
ต่อไปนี้เป็นตัวอย่างที่สองเพื่อช่วยสาธิตแนวคิดนี้:

ตัวอย่างที่ 1

พิจารณาผู้สร้างตารางในฐานข้อมูล การ pubs ซึ่งประกอบด้วยแถวที่ 23 และ มีดัชนีที่สอง มีการจัดทำดัชนีไม่ซ้ำกันดัชนีกลุ่ม UPKCL_auidind หนึ่งคอลัมน์ au_id และแบบคอมโพสิต nonclustered ดัชนี aunmind ได้ สร้างคอลัมน์ au_lname และ au_fname เนื่องจากตารางนี้ประกอบด้วย แถวที่น้อยกว่า 500, AutoStat จะเริ่มต้นหลังจากที่ 500 ที่มีการเปลี่ยนแปลงลงในตาราง ข้อมูลที่เกิดขึ้น การเปลี่ยนแปลงสามารถเป็นอย่าง น้อย 500 แทรก ลบ อย่างใดอย่างหนึ่ง การเปลี่ยนแปลงคอลัมน์ที่จัดทำดัชนีไว้เช่น au_lname หรือชุดใด ๆ ดังกล่าว

คุณสามารถ ดังนั้น ทำนายเมื่อปรับปรุงสถิติที่จะเริ่มต้นโดย การตรวจสอบค่า sysindexes.rowmodctr ซึ่งจะเพิ่มขึ้นเมื่อมีการ การปรับปรุงแต่ละ เมื่อมาถึง หรือเกินกว่า 500 คุณสามารถคาดว่าการปรับปรุง สถิติที่จะเริ่มต้น

ตัวอย่างที่ 2

พิจารณาตารางสอง t2 ที่มี cardinality ของ 1000 สำหรับตาราง มีมากกว่า 500 แถว SQL Server จะปรับปรุงสถิติเมื่อ (500 + 20 เปอร์เซ็นต์) มีการเปลี่ยนแปลง คำนวนทางคณิตศาสตร์ 20 เปอร์เซ็นต์ของ 1000 คือ 200 ดังนั้นคุณคาดว่าจะเห็น AutoStat ที่เริ่มการทำงานหลังจากการประมาณ 700 ได้ทำการปรับเปลี่ยนตาราง

การทำงานอัตโนมัติสำหรับใช้ในการระบุ Autostats

เมื่อต้องการใช้ในการระบุเมื่อรัน AutoStat โดยอัตโนมัติ คุณสามารถสำรวจ sysindexes ตาราง และระบุเมื่อมีการปรับเปลี่ยนตารางจะไม่ให้เข้าถึงตัว จุดเริ่มต้น อัลกอริทึมพื้นฐานสำหรับการทำเช่นนั้นคือต่อไปนี้:
   if (sysindexes.rows > 500)
      if (sysindexes.rows * 0.20 >= sysindexes.rowmodctr && production
      hours) //500 change leeway
         begin
            disable autostats
            log autostats disable
         end
      else
         begin
            stats ok
         end
   else
      if (sysindexes.rowmodctr >= 425) //75 change leeway
         begin
            disable autostats
            log autostats disable
         end
				

คุณไม่สามารถกำหนดตารางเวลางานเพื่อดำเนินการต่อไปนี้ในภายหลัง:
  • เรียกใช้การปรับปรุงสถิติจากตารางทั้งหมดที่คุณถูกบังคับให้ปิดใช้งานในระหว่างวัน

    - และ -
  • คุณสามารถเปิดใช้งาน AutoStat เนื่องจากตัวนับการปรับเปลี่ยนแต่ละตารางจะถูกรีเซ็ตเป็น 0 เมื่อรันการปรับปรุงสถิติ

การควบคุมว่า สถิติการปรับปรุงจะทำงานกับตาราง

วิธีแก้ปัญหาที่เห็นได้ชัดเจนที่สุดกับคำถามนี้ เมื่อมีการรับรองแล้วว่าเป็น AutoStat Problematic คือการ ปิดการใช้งานอัตโนมัติสถิติ จึงออกจากเครื่อง ผู้ดูแลฐานข้อมูลว่างจัดตารางเวลาการปรับปรุงสถิติในระหว่างที่น้อยกว่า เวลาที่รำคาญ คุณสามารถทำอย่างใดอย่างหนึ่ง โดยใช้สถิติการปรับปรุง คำชี้แจงหรือ sp_autostats ที่เก็บกระบวนงาน ไวยากรณ์สำหรับการปรับปรุง สถิติงบคือ:
   UPDATE STATISTICS <table>...with NORECOMPUTE
				

ไวยากรณ์สำหรับกระบวนการ sp_autostats ที่เก็บไว้เป็น:
sp_autostats<table_name> <stats_flag>,<index_name> </index_name></stats_flag></table_name>
โดยที่ <stats_flag>คือไม่ว่าจะเป็น "" หรือ "ปิด" </stats_flag>

นอกจากนี้คุณยังสามารถใช้ sp_dboption ในการปิดการใช้งานของการเกิดการปรับปรุงอัตโนมัติ สถิติหรือสร้างสถิติในระดับต่อฐานข้อมูล:
sp_dboption<dbname> 'อัตโนมัติปรับปรุง สถิติ'<on |="" off=""> </on></dbname>

- หรือ -

sp_dboption <dbname> 'อัตโนมัติสร้างสถิติ' <on |="" off=""> </on></dbname>

การควบคุมหมายเลขของกระบวนการปรับปรุงสถิติที่เกิดขึ้นพร้อมกัน

ในปัจจุบัน short ของการปิดใช้งาน AutoStat สำหรับตารางที่ระบุ ไม่ สุดเพื่อกำหนดหมายเลขของใบแจ้งยอดสถิติเกี่ยวกับการปรับปรุงอัตโนมัติ ซึ่งจะถูกรันพร้อม (DCR 51539 ได้ถูกเก็บข้อมูลแล้วสำหรับสิ่งนี้) ที่ เซิร์ฟเวอร์ อย่างไรก็ตาม จำกัดจำนวนที่ใช้ในการปรับปรุงสถิติที่เกิดขึ้นพร้อมกัน ขั้นตอนที่ 4 สำหรับแต่ละตัวประมวลผล

การกำหนดเมื่อ Autostats จะถูกเรียกใช้

คุณสามารถใช้ค่าสถานะการติดตาม 205 การรายงานเมื่อมีสถิติขึ้นอยู่กับการจัดเก็บ ขั้นตอนจะถูก recompiled เป็นผลมาจากการ AutoStat ค่าสถานะการติดตามนี้ จะเขียนข้อความต่อไปนี้เมื่อต้องการล็อกข้อผิดพลาด:
spid9 11:10:51.98 1998-10-15 ที่คอมไพล์ใหม่ที่นำออกใช้: ProcName: sp_helpindex
LineNo: StmtNo 75:29
เมื่อมีการใช้ค่าสถานะการติดตาม 205 ข้อความต่อไปนี้จะยัง bracket AutoStat การข้อความจาก 8721 เมื่อมีการอัพเดตสถิติ เปิด ข้อความในวงเล็บที่สามารถ distinguished ด้วยค่า RowModCnt ซึ่ง จะมีค่ามากกว่า 0 วงเล็บปิด หลังจากสถิติของการปรับปรุง จะมีค่า RowModCnt เป็น 0:
การเปลี่ยนแปลงแบบแผน spid8 11:38:43.68 1998-10-15: Tbl Dbid: 7 Objid:
133575514 RowModCnt: 60500 RowModLimit: 60499
สำหรับข้อความนี้ "RowModCnt" เป็นยอดรวมของการปรับเปลี่ยนไป ตาราง "RowModLimit" คือ เขตแดนซึ่ง เมื่อเกิน ผลการ ดำเนินการคำสั่งปรับปรุงสถิติสำหรับตาราง

มีการเปิดใช้งานการตั้งค่าการติดตามสถานะ 8721 ซึ่งจะเป็นการถ่ายโอนข้อมูล ลงในล็อกข้อผิดพลาดเมื่อมีการเรียกใช้ AutoStat ต่อไปนี้คือการ ตัวอย่างของชนิดของข้อความที่คุณคาดว่าจะดู:
1998-10-14 16:22:13.21 spid13 AUTOSTATS: ปรับปรุง Tbl: [ผู้เขียน]
แถว: Mods 23: ผูก 501: ช่วงเวลาที่ 500:47ms UpdCount: 2
สำหรับข้อความนี้ "Mods" เป็นจำนวนรวมของการปรับเปลี่ยนตาราง เพดานปรับเปลี่ยนเป็น "ขอบ" "ระยะเวลา" เป็นระยะเวลา ที่คำชี้แจงสถิติเกี่ยวกับการปรับปรุงที่จำเป็นสำหรับการทำให้เสร็จสมบูรณ์ และ "UpdCount" มีการตรวจนับสถิติที่ปรับปรุงแล้ว

นอกจากนี้คุณยังสามารถใช้ของผู้สร้างโปรไฟล์เซิร์ฟเวอร์ SQL ที่ระบุเมื่อปรับปรุงสถิติ คำสั่งจะถูกเรียกใช้ เมื่อต้องการทำเช่นนี้ ทำตามขั้นตอนต่อไปนี้:
  1. บนเครื่องของผู้สร้างโปรไฟล์เมนู คลิกเครื่องมือแล้ว คลิกตัวเลือก.
  2. บนเครื่องทั่วไปแท็บ ไปเหตุการณ์แล้ว เลือกระดับชั้นของเหตุการณ์ทั้งหมด.
  3. กำหนดข้อมูลการติดตามใหม่ และภายใต้เหตุการณ์เลือกเบ็ดเตล็ดเลือกการอัพเดตอัตโนมัติ Statssub-event
หมายเหตุ: ถ้าสถิติมากกำลังถูกปรับปรุง โดย AutoStat จำนวนยอดเยี่ยม ข้อความที่สามารถเขียนไปยังล็อกข้อผิดพลาด ทดลองกับเหล่านี้อย่างละเอียด ติดตามสถานะก่อนที่จะใช้ ในการผลิตใด ๆ หรือมิฉะนั้นสำคัญ เซิร์ฟเวอร์

ล็อก schema

SQL Server ใช้ล็อก schema ทั้งสองอย่างซึ่งถูกนำสองชนิด เมื่อนั้นการปรับปรุงสถิติสำหรับตาราง:
   Sch-S: Schema Stability Lock
   ----------------------------
   This lock ensures that a schema element, such as a table or index, will
   not be dropped while any session holds a schema stability lock on the
   schema element.

   Sch-M-UPD-STATS: Schema Modification Lock
   -----------------------------------------
   This is a non-blocking lock that is used by the system to ensure that
   only one automatic UPDATE STATISTICS process is run against a table at
   any given point in time. The sp_lock stored procedure will report this
   lock has having a type = TAB, resouce = UPD-STATS and mode = SCH-M.
				
คุณสามารถดูล็อกเหล่านี้ได้ โดยการเรียกใช้ sp_lock หรือ โดยการเลือกจากตัว ในตาราง syslockinfo

คุณสมบัติ

หมายเลขบทความ (Article ID): 195565 - รีวิวครั้งสุดท้าย: 28 มกราคม 2554 - Revision: 4.0
ใช้กับ
Keywords: 
kbinfo kbmt KB195565 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:195565

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com