สถิติเก็บอยู่ใน SQL Server อยู่ที่ไหน


27

สถิติที่ใช้โดยเครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาเก็บอยู่ในไฟล์ฐานข้อมูล SQL Server และบัฟเฟอร์พูลหรือไม่

โดยเฉพาะอย่างยิ่งมีวิธีที่จะคิดออกหน้าใช้สถิติโดยใช้ DMVs และ / หรือ DBCC หรือไม่

ฉันเป็นเจ้าของทั้ง SQL Server 2008 Internals และ SQL Server Internals และการแก้ไขปัญหาหนังสือและไม่มีใครพูดถึงโครงสร้างทางกายภาพของสถิติ หากพวกเขาฉันไม่สามารถค้นหาข้อมูลนี้


1
เมื่อคุณสร้างสถิติเพียงสำเนาของฐานข้อมูลมันจะแสดงไบนารีSTATS_STREAMฉันไม่เคยตรวจสอบว่านี่เป็นสิ่งที่สามารถค้นหาได้ในไฟล์เอง
Martin Smith

2
สถิติถูกสร้างขึ้นโดยฟังก์ชั่นรวมภายในเท่านั้น ( StatMan) ที่ส่งออก blob (แดกดันชื่อนั้นจะถูกเน้นเป็นฟังก์ชั่นในหน้าต่างแบบสอบถาม SSMS) ตามหลักเหตุผลแล้วสถิตินั้นเกี่ยวข้องกับดัชนีหรือชุดของคอลัมน์ตารางดังนั้นฉันจะเริ่มต้นด้วยการตรวจสอบตารางเมทาดาทาภายในที่กำลังมองหาคอลัมน์binaryหรือvarbinaryคอลัมน์ที่จะนำไปสู่การหยด สิ่งนี้ควรดูได้โดยใช้DBCC PAGEแต่อาจไม่ใช่วิธีอื่นเพราะทุกอย่างอยู่ภายใน
Jon Seigel

1
@ivanmp ฉันได้แก้ไขคำถามของคุณเพื่อความกระจ่างเนื่องจาก DBA สามเณรจำนวนมากไม่รู้ว่า BP หรือ QO คืออะไร
Max Vernon

2
จะต้องใช้sysindexes.statblobแต่ตั้งแต่ปี 2005 ที่ผลตอบแทนNULLและสถานที่ตั้งที่ไม่มีเอกสารสมบูรณ์กลับคืนเท่านั้น (ที่ฉันรู้) DBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;ผ่าน
Aaron Bertrand

1
พบสถิติดัชนี - พวกเขาอยู่ในsys.sysidxstats- ดูเหมือนว่ามีตัวชี้ LOB ในตารางนั้น ฉันไม่แน่ใจว่าสถิติของคอลัมน์อยู่ที่ไหน พวกเขาอาจอยู่ในตารางนั้นเช่นเดียวกับtypeคอลัมน์
Jon Seigel

คำตอบ:


30

พบพวกเขา

  1. สร้างตารางด้วยวัตถุสถิติอย่างง่าย

    CREATE DATABASE splunge;
    GO
    USE splunge;
    GO
    CREATE TABLE dbo.foo(bar INT, munge INT);
    GO
    CREATE STATISTICS x ON dbo.foo(bar);
    CREATE STATISTICS y ON dbo.foo(munge);
    GO
    INSERT dbo.foo SELECT s1.[object_id], s2.[object_id]
      FROM sys.objects AS s1
      CROSS JOIN sys.objects AS s2;
    GO
    UPDATE STATISTICS dbo.foo;
    GO
    
  2. เชื่อมต่อโดยใช้ DAC ( ADMIN:Server[\instance])

  3. เรียกใช้แบบสอบถามต่อไปนี้:

    DBCC SHOW_STATISTICS('dbo.foo', 'x') WITH STATS_STREAM;
    DBCC SHOW_STATISTICS('dbo.foo', 'y') WITH STATS_STREAM;
    
    SELECT name, imageval 
      FROM sys.stats AS s
      INNER JOIN sys.sysobjvalues AS o
      ON s.object_id = o.objid
      AND s.stats_id = o.subobjid
    WHERE 
      s.object_id = OBJECT_ID('dbo.foo');
    

คุณจะทราบว่าimagevalสำหรับวัตถุสถิติแต่ละรายการนั้นไม่เหมือนกับสถิติ Blob แต่มันมีสถิติ Blob ซึ่งเป็นเพียงการชดเชย ในระบบของฉันมันให้สิ่งนี้สำหรับ x (ฉันเห็นได้ชัดว่าตัดบิตบิตยุติธรรม):

0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
                            0x07000000C4E1BE00EEA0...rest the same

และนี่สำหรับ y:

0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
                            0x07000000C7E1BE00EEA0...rest the same

สิ่งนี้เป็นจริงสำหรับสถิติที่อิงดัชนี

คุณอาจทำการตรวจสอบเพิ่มเติมนี้กับชุดของแบบสอบถามโดยใช้DBCCคำสั่ง ก่อนอื่นให้ค้นหาหน้าที่เกี่ยวข้องกับดัชนีคลัสเตอร์บนsys.sysobjvalues(แทนที่ชื่อฐานข้อมูลของคุณ):

DBCC IND('splunge', 'sys.sysobjvalues', 1);

PageType = 1ผลที่ได้จะแสดงรายการพวงของหน้าเว็บที่คุณกำลังสนใจในคนของ ด้วยฐานข้อมูลใหม่คุณควรจะสามารถค้นหาข้อมูลนี้ในหน้าใดหน้าหนึ่งที่มีPagePIDค่าสูงสุด เช่นในระบบของฉันนี่คือหน้า 281 ดังนั้นฉันจึงมองใกล้ที่หน้านั้น:

DBCC TRACEON(3604);

DECLARE @dbid INT = DB_ID();

DBCC PAGE(@dbid, 1, 281, 3);

DBCC TRACEOFF(3604);

ฉันพบข้อมูลในช่อง 17:

ผลลัพธ์บางส่วนของหน้า DBCC

(บนฐานข้อมูลขนาดใหญ่คุณอาจต้องค้นหาและจิกเพิ่มเติมเนื่องจากไม่มีการรับประกันว่าแม้วัตถุสถิติใหม่จะจบลงในหน้าใหม่ (er))

ไปข้างหน้าและลองทำเองที่บ้าน แต่มีเหตุผลที่คุณต้องเชื่อมต่อกับ DAC สำหรับสิ่งนี้ ฉันอยากรู้อยากเห็นแน่นอนว่าคุณจะทำอย่างไรกับข้อมูลนี้ที่คุณไม่สามารถทำได้ด้วยDBCC SHOW_STATISTICSผลลัพธ์

โปรดทราบว่าหลักสูตรนี้ไม่ได้พยายามถอดรหัสSTATS_STREAMเพื่อให้ฮิสโตแกรมหรือข้อมูลอื่น ๆ และฉันไม่สามารถหาหลักฐานใด ๆ ที่แสดงว่าการส่งออกตารางของDBCC SHOW_STATISTICS ... WITH HISTOGRAMถูกเก็บไว้ที่ใดก็ได้ในรูปแบบตาราง Joe Chang มีข้อมูลบางอย่างเกี่ยวกับการถอดรหัสหากเป็นสิ่งที่คุณต้องการ ผมไม่คิดว่ามันเป็นสิ่งที่คุณต้องการจะทำในแบบสอบถาม - DBCCเพียงแค่ใช้


2
เรามีสุภาพสตรีและสุภาพบุรุษผู้ชนะ ฉันให้ทิปหมวกของคุณกับคุณ
เชน

ฮ่าฮ่าฮ่าขอแสดงความยินดีและขอบคุณมาก! ไม่ต้องกังวลฉันไม่ได้ทำอะไรที่ฉันไม่ควรทำ (AKA "โง่") มันเป็นเพียงการเติบโตส่วนบุคคล ฉันสนใจมันมากเมื่อฉันรู้ว่าฉันไม่พบอะไรเกี่ยวกับเรื่องนี้ทุกที่ =)
ivanmp

เกี่ยวกับบทความของ Joe Chang ฉันพบในขณะที่ฉันค้นหาคำตอบ ฉันเริ่มอ่านแล้ว ขอบคุณอีกครั้ง. :)
ivanmp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.