मुझे एक बड़ी तालिका के साथ I / O समस्या है।
सामान्य आँकड़े
तालिका में निम्नलिखित मुख्य विशेषताएं हैं:
- वातावरण: एज़्योर SQL डेटाबेस (टियर पी 4 प्रीमियम (500 डीटीयू) है)
- पंक्तियाँ: 2,135,044,521
- 1,275 ने विभाजन का उपयोग किया
- गुच्छेदार और विभाजित सूचकांक
नमूना
यह तालिका कार्यान्वयन है:
CREATE TABLE [data].[DemoUnitData](
[UnitID] [bigint] NOT NULL,
[Timestamp] [datetime] NOT NULL,
[Value1] [decimal](18, 2) NULL,
[Value2] [decimal](18, 2) NULL,
[Value3] [decimal](18, 2) NULL,
CONSTRAINT [PK_DemoUnitData] PRIMARY KEY CLUSTERED
(
[UnitID] ASC,
[Timestamp] ASC
)
)
GO
ALTER TABLE [data].[DemoUnitData] WITH NOCHECK ADD CONSTRAINT [FK_DemoUnitData_Unit] FOREIGN KEY([UnitID])
REFERENCES [model].[Unit] ([ID])
GO
ALTER TABLE [data].[DemoUnitData] CHECK CONSTRAINT [FK_DemoUnitData_Unit]
GO
विभाजन इस से संबंधित है:
CREATE PARTITION SCHEME [DailyPartitionSchema] AS PARTITION [DailyPartitionFunction] ALL TO ([PRIMARY])
CREATE PARTITION FUNCTION [DailyPartitionFunction] (datetime) AS RANGE RIGHT
FOR VALUES (N'2017-07-25T00:00:00.000', N'2017-07-26T00:00:00.000', N'2017-07-27T00:00:00.000', ... )
सेवा की गुणवत्ता
मुझे लगता है कि अनुक्रमित और आँकड़े हर रात वृद्धिशील पुनर्निर्माण / पुनर्गठन / अद्यतन द्वारा बनाए रखा जाता है।
ये सबसे अधिक उपयोग किए जाने वाले सूचकांक विभाजन के वर्तमान सूचकांक आँकड़े हैं:
ये सबसे अधिक उपयोग किए जाने वाले विभाजन के वर्तमान आँकड़े गुण हैं:
मुसीबत
मैं टेबल के खिलाफ उच्च आवृत्ति पर एक साधारण क्वेरी चलाता हूं।
SELECT [UnitID]
,[Timestamp]
,[Value1]
,[Value2]
,[Value3]
FROM [data].[DemoUnitData]
WHERE [UnitID] = 8877 AND [Timestamp] >= '2018-03-01' AND [Timestamp] < '2018-03-13'
OPTION (MAXDOP 1)
निष्पादन योजना इस प्रकार है: https://www.brentozar.com/pastetheplan/?id=rJvI_4TTG
मेरी समस्या यह है कि इन प्रश्नों से आई / ओ संचालन की अत्यधिक मात्रा उत्पन्न होती है जिसके परिणामस्वरूप PAGEIOLATCH_SH
प्रतीक्षा की अड़चन होती है ।
सवाल
मैंने पढ़ा है कि PAGEIOLATCH_SH
इंतजार अक्सर अच्छी तरह से अनुकूलित नहीं अनुक्रमित से संबंधित होते हैं। क्या आपके पास मेरे / I संचालन को कम करने के लिए कोई सिफारिशें हैं? शायद एक बेहतर सूचकांक जोड़कर?
उत्तर 1 - @ S4V1N से टिप्पणी से संबंधित है
पोस्ट की गई क्वेरी योजना SSMS में निष्पादित एक क्वेरी से थी। आपकी टिप्पणी के बाद मैं सर्वर इतिहास पर कुछ शोध करता हूं। सेवा से एक्सक्लूसिव क्वेरी थोड़ी भिन्न (EntityFramework संबंधित) दिखती है।
(@p__linq__0 bigint,@p__linq__1 datetime2(7),@p__linq__2 datetime2(7))
SELECT 1 AS [C1], [Extent1]
.[Timestamp] AS [Timestamp], [Extent1]
.[Value1] AS [Value1], [Extent1]
.[Value2] AS [Value2], [Extent1]
.[Value3] AS [Value3]
FROM [data].[DemoUnitData] AS [Extent1]
WHERE ([Extent1].[UnitID] = @p__linq__0)
AND ([Extent1].[Timestamp] >= @p__linq__1)
AND ([Extent1].[Timestamp] < @p__linq__2) OPTION (MAXDOP 1)
इसके अलावा, योजना अलग दिखती है:
https://www.brentozar.com/pastetheplan/?id=H1fhALpKG
या
https://www.brentozar.com/pastetheplan/?id=S1DFQvpKz
और जैसा कि आप यहाँ देख सकते हैं, हमारे DB प्रदर्शन शायद ही इस क्वेरी से प्रभावित हैं।
उत्तर 2 - @ जोए ओबिश से उत्तर से संबंधित
समाधान के परीक्षण के लिए मैंने एंटिटी फ्रेमवर्क को एक सरल SqlCommand से बदल दिया। परिणाम एक अद्भुत प्रदर्शन को बढ़ावा देने वाला था!
क्वेरी प्लान अब SSMS की तरह ही है और लॉजिकल 8 ~ निष्पादन के लिए ड्रॉप पढ़ता है और लिखता है।
कुल मिलाकर I / O लोड ड्रॉप लगभग 0 है!
यह यह भी बताता है कि मासिक से दैनिक में विभाजन की सीमा को बदलने के बाद मुझे एक बड़ा प्रदर्शन ड्रॉप क्यों मिलता है। विभाजन उन्मूलन के लापता होने से स्कैन करने के लिए अधिक विभाजन हुए।