2013-08-01 6 views
9

एसक्यूएल Azure में से लापता है, मैं एक मेज और अधिक या कम इस तरह की स्थापना की, दो अभिकलन कॉलम (IsExpired और IsDeadlineExpired) कि बस वर्तमान समय में गैर-व्यर्थ datetime कॉलम तुलना के साथ है:गणना कॉलम कभी कभी चुनें *

CREATE TABLE [dbo].[Stuff] 
(
    [StuffId] int NOT NULL IDENTITY(1,1), 
    [Guid] uniqueidentifier NOT NULL, 
    [ExpirationDate] datetime NOT NULL, 
    [DeadlineDate] datetime NOT NULL, 
    [UserId] int NOT NULL, 
    [IsExpired] AS CAST((CASE WHEN [ExpirationDate] < GETUTCDATE() THEN 1 ELSE 0 END) AS bit), 
    [IsDeadlineExpired] AS CAST((CASE WHEN [DeadlineDate] < GETUTCDATE() THEN 1 ELSE 0 END) AS bit), 
    CONSTRAINT [PK_StuffId] PRIMARY KEY ([StuffId]), 
    CONSTRAINT [UNQ_Guid] UNIQUE([Guid]), 
) 
GO 

मैं कई परिणाम सेट, जिनमें से एक खींचती है के साथ एक संग्रहीत प्रक्रिया है:

SELECT * FROM [dbo].[Stuff] WHERE [Guid] = @guid 

मैं हाल ही में यह दर्शाता है कि कभी कभी जब परिणाम सेट SqlDataReader, SqlDataReader.GetOrdinal("IsExpired") साथ पढ़ा जाता है त्रुटि लॉग देखा है IndexOutOfRangeException के साथ विफल रहता है। मुझे पता है कि पिछले कॉलम उन मामलों में भी ठीक काम करते हैं, क्योंकि उन्हें बिना किसी त्रुटि के कोड की पिछली पंक्तियों में पढ़ा जाता है। मुझे यह भी विश्वास है कि प्रक्रिया से परिणाम सेट उचित अनुक्रम में हैं क्योंकि वे कॉलम नाम साझा नहीं करते हैं (अन्यथा पहले कॉलम पढ़ना इसी तरह असफल होगा)।

इसके अलावा: अधिकांश समय पूरी तरह से काम करने लगता है।

क्या यह किसी भी तरह से एज़ूर क्षणिक दोषों के लिए जिम्मेदार ठहराया जा सकता है?

+3

और फिर भी एक और कारण मेरी पसंद समर्थन का उपयोग कभी नहीं करने के लिए '*' –

+0

मैं मानता हूँ, यह दोबारा काम स्पष्ट स्तंभों का चयन के लिए बेहतर होगा और शायद यह 100% काम होगा, लेकिन मैं उम्मीद कभी नहीं '*' इस तरह व्यवहार करने के लिए। मैंने मुख्य रूप से इसे पोस्ट किया क्योंकि यह ऐसा नूडल-स्क्रैचर है। –

+0

हाँ यह बल्कि अजीब है। क्या वे कॉलम तथ्य के बाद जोड़े गए थे? –

उत्तर

0

कुछ पुराने लॉग देखकर, इस निष्कर्ष पर बस गए कि यह त्रुटि तब हो रही थी जब क्वेरी चल रही थी, जबकि एक डीएसीपीएसी को समेकित रूप से तैनात किया गया था (इस विशेष परीक्षण वातावरण में हमारे स्वचालित तैनाती के हिस्से के रूप में)।

मुझे लगता है कि स्कीमा डीएसीपीएसी परिनियोजन के दौरान एक भरोसेमंद स्थिति में आवश्यक नहीं है।

तब से, हमने ऐप को तैनाती के दौरान "रखरखाव मोड" में रखने के लिए कुछ कोड जोड़ा है, (यहां तक ​​कि इन स्वचालित भी)। ऐसा लगता है कि इस मुद्दे को कम करना है।

1

कृपया, इस आलेख को देखें: SELECT * AND SQL Azure

इसके लेखक दृढ़ता से

SELECT * 
FROM TableName 

साथ

SELECT [Column1], [Column2], ... [ColumnN] 
FROM TableName 

क्योंकि चुनें * का उपयोग करते हुए अतिरिक्त पेजिंग, आरएफआईडी लुकअप, अनावश्यक तालिका लॉकिंग के कारण और एक बनाने के लिए भविष्य के किसी भी प्रयास में बाधा उत्पन्न कर सकते हैं बदलने के लिए सलाह देते हैं कवर सूचकांक। संक्षेप में, यह प्रदर्शन के लिए खराब है।

मार्ग द्वारा:

  1. How to get to SQL Azure Query Performance Data
  2. Query Performance
  3. Getting Started with the Windows Azure Tools for Visual Studio
  4. Getting Started with SQL Azure Development
  5. Improving Your I/O Performance
  6. Analyzing Query Performance just got easier with SQL Azure.
  7. : यहाँ आप रोचक लेख का एक सेट मिल गया है

मुझे लगता है कि GetOrdinary ("IsExpired") एमएस एसक्यूएल Azure ढांचे के ऊपर व्यवहार के कारण System.IndexOutOfRangeException कारण बनता है।

निष्कर्ष? का चयन करें एसक्यूएल एज़ूर डेटाबेस के प्रदर्शन में सुधार करने के लिए कॉलम की परिभाषित सूची के साथ कथन चुनें और indexOutOfRange अपवाद से बचें।

संबंधित मुद्दे