เหตุใด SQL Server จึงปฏิเสธที่จะอัปเดตสถิติเหล่านี้เป็นอย่างอื่นนอกจากสแกนแบบเต็ม


13

ฉันสังเกตเห็นการดำเนินการสถิติการอัปเดตอัตโนมัติ (20 นาที +) ที่ค่อนข้างใช้เวลานานในการสร้างคลังข้อมูลรายวัน ตารางที่เกี่ยวข้องคือ

CREATE TABLE [dbo].[factWebAnalytics](
    [WebAnalyticsId] [bigint] IDENTITY(1,1) NOT NULL,
    [MarketKey] [int] NOT NULL CONSTRAINT [DF_factWebAnalytics_MarketKey]  DEFAULT ((-1)),
    /*Other columns removed*/
 CONSTRAINT [PK_factWebAnalytics] PRIMARY KEY CLUSTERED 
(
    [MarketKey] ASC,
    [WebAnalyticsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MarketKeyPS]([MarketKey])
) ON [MarketKeyPS]([MarketKey])

สิ่งนี้กำลังทำงานบน Microsoft SQL Server 2012 (SP1) - 11.0.3513.0 (X64) ดังนั้นดัชนีคอลัมน์ที่เขียนได้จึงไม่พร้อมใช้งาน

ตารางมีข้อมูลสำหรับคีย์ตลาดที่แตกต่างกันสองคีย์ บิลด์จะสลับพาร์ติชั่นสำหรับ MarketKey ที่เฉพาะเจาะจงไปที่ตาราง staging ปิดใช้งานดัชนี columnstore ดำเนินการเขียนที่จำเป็นสร้าง columnstore ใหม่จากนั้นสลับกลับเข้าไปใหม่

แผนการดำเนินการสำหรับสถิติการอัพเดทแสดงให้เห็นว่ามันดึงแถวทั้งหมดออกจากตารางเรียงลำดับพวกเขารับจำนวนแถวโดยประมาณที่ไม่ถูกต้องอย่างไม่เหมาะสมและมีการรั่วไหลถึงtempdbระดับที่หก

ป้อนคำอธิบายรูปภาพที่นี่

วิ่ง

SELECT [s].[name] AS "Statistic",
       [sp].*
FROM   [sys].[stats] AS [s]
       OUTER APPLY sys.dm_db_stats_properties ([s].[object_id], [s].[stats_id]) AS [sp]
WHERE  [s].[object_id] = OBJECT_ID(N'[dbo].[factWebAnalytics]'); 

แสดงให้เห็นว่า

ป้อนคำอธิบายรูปภาพที่นี่

หากฉันลองและลดขนาดตัวอย่างของสถิติของดัชนีนั้นเป็นแบบอื่นที่ใช้ด้วย

UPDATE STATISTICS [dbo].[factWebAnalytics] [PK_factWebAnalytics] WITH SAMPLE 897667 ROWS

แบบสอบถามทำงานเป็นเวลา 20 นาที + อีกครั้งและแผนการดำเนินการแสดงว่ากำลังประมวลผลแถวทั้งหมดที่ไม่ใช่ตัวอย่างที่ร้องขอ 897,667

สถิติที่สร้างในตอนท้ายของทั้งหมดนี้ไม่น่าสนใจมากและแน่นอนไม่รับประกันเวลาที่ใช้ในการสแกนเต็มรูปแบบ

Statistics for INDEX 'PK_factWebAnalytics'.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Name                            Updated                         Rows                            Rows Sampled                    Steps                           Density                         Average Key Length              String Index                    
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PK_factWebAnalytics             Jan 22 2016 11:31AM             420072086                       420072086                       2                               0                               12                              NO                                                              420072086                       

All Density                     Average Length                  Columns                         
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.5                             4                               MarketKey                       
2.380544E-09                    12                              MarketKey, WebAnalyticsId       

Histogram Steps                 
RANGE_HI_KEY                    RANGE_ROWS                      EQ_ROWS                         DISTINCT_RANGE_ROWS             AVG_RANGE_ROWS                  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1                               0                               3.441652E+08                    0                               1                               
2                               0                               7.590685E+07                    0                               1                               

แนวคิดใดที่ทำให้ฉันพบกับพฤติกรรมนี้และฉันสามารถทำอะไรได้บ้างนอกจากใช้NORECOMPUTEกับสิ่งเหล่านี้


สคริปต์ซ้ำอยู่ที่นี่ มันสร้างตารางที่มี PK แบบคลัสเตอร์และดัชนีแบบคอลัมน์และพยายามอัปเดตสถิติ PK ด้วยขนาดตัวอย่างต่ำ สิ่งนี้ไม่ใช้การแบ่ง - แสดงว่าไม่จำเป็นต้องมีการแบ่งพาร์ติชัน อย่างไรก็ตามการใช้การแบ่งพาร์ติชันที่อธิบายไว้ข้างต้นจะทำให้เรื่องแย่ลงเพราะการสลับพาร์ติชั่นออกแล้วสลับกลับเข้าไปใหม่ (แม้จะไม่มีการเปลี่ยนแปลงอื่น ๆ ) จะเพิ่มการเปลี่ยนแปลง_counterโดยเพิ่มจำนวนแถวในพาร์ติชันเป็นสองเท่า ถือว่าเก่าและอัปเดตอัตโนมัติแล้ว

ฉันได้ลองเพิ่มดัชนีที่ไม่ใช่คลัสเตอร์ในตารางตามที่ระบุไว้ใน KB2986627 (ทั้งสองถูกกรองโดยไม่มีแถวและเมื่อนั้นล้มเหลว NCI ที่ไม่ใช่ตัวกรองก็ไม่มีผลเช่นกัน)

repro ไม่ได้แสดงพฤติกรรมที่มีปัญหาในการสร้าง 11.0.6020.0 และหลังจากอัปเกรดเป็น SP3 ปัญหาได้รับการแก้ไขแล้ว

คำตอบ:


10

สิ่งแรกที่ฉันจะลองคืออัปเดตอินสแตนซ์ของ SQL Server จาก SP1 CU16 ด้วย QFE ที่คุณมีตอนนี้เป็น SP3 CU1 (การสร้าง 2012 ปัจจุบัน) จากนั้นทดสอบซ้ำเพื่อดูว่าพฤติกรรมนั้นเหมือนกันหรือไม่

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

การแก้ไข: ปรับปรุงสถิติดำเนินการสุ่มตัวอย่างและประมวลผลที่ไม่ถูกต้องสำหรับตารางที่มีดัชนี columnstore ใน SQL Server

... เปิดตัวครั้งแรกใน SP2 CU2 อาจเกี่ยวข้อง

ที่กล่าวว่าฉันไม่แน่ใจว่า 2012 columnstore สนับสนุนตารางตัวอย่างจำเป็นสำหรับสถิติตัวอย่าง ฉันจะอัปเดตคำตอบนี้เมื่อคำตอบมีอยู่ในคำถาม


1
(เกี่ยวกับย่อหน้าสุดท้าย) SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsIdทำงานในเวลาน้อยกว่า 30 วินาทีสำหรับฉัน มันไม่ได้ใช้ดัชนี columnstore แม้ว่า มันใช้ดัชนีคลัสเตอร์
Martin Smith

2
ใช่มันดูเหมือนว่ามีอะไรบางอย่างแก้ไขในรุ่นที่ใหม่กว่า ฉันสร้าง repro ง่ายๆที่นี่pastebin.com/7f4TwmKWและบนเซิร์ฟเวอร์ทดสอบที่ใช้ 11.0.5343.0 พบว่าคำขอของฉันสำหรับขนาดตัวอย่าง 10,000 แถวถูกละเว้นและตัวอย่างทั้งหมด 8,000,000 แถวi.stack.imgur.com/DbbjZ.png (แผน เหมือนกับในคำถาม) - แต่ฉันไม่พบสิ่งนี้ใน Microsoft SQL Server 2012 (SP30) (KB3072779) - 11.0.6020.0 (แถวตัวอย่างมี 274,649 ซึ่งค่อนข้างใกล้เคียงกับจำนวนแถวโดยประมาณใน การสร้างก่อนหน้านี้และแผนใช้ CI แทนที่จะเป็นร้านคอลัมน์)
Martin Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.