ฉันสังเกตเห็นการดำเนินการสถิติการอัปเดตอัตโนมัติ (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 ปัญหาได้รับการแก้ไขแล้ว
SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsId
ทำงานในเวลาน้อยกว่า 30 วินาทีสำหรับฉัน มันไม่ได้ใช้ดัชนี columnstore แม้ว่า มันใช้ดัชนีคลัสเตอร์