2011-03-31 19 views
6

मेरे पास एक पहचान कॉलम Id के साथ एक तालिका है।तालिका स्कैन के बिना पहचान कॉलम के लिए अधिकतम मान प्राप्त करें

जब मैं निष्पादित करें:

select max(Id) from Table 

एसक्यूएल सर्वर एक मेज स्कैन और धारा कुल करता है।

मेरा सवाल यह है कि, यह आईडी को सौंपा गया अंतिम मूल्य क्यों नहीं देख सकता है? यह identity है, इसलिए जानकारी को ट्रैक किया जाना चाहिए, है ना?

क्या मैं इसे मैन्युअल रूप से देख सकता हूं?

+2

क्या आईडी आईडी भी क्लस्टर सूचकांक है? –

+0

@ जो नहीं, यह – Blorgbeard

उत्तर

16

आप डालने के लिए अंतिम पहचान मान देखने के लिए IDENT_CURRENT का उपयोग कर सकते हैं, उदा।

IDENT_CURRENT('MyTable') 

हालांकि, इस फ़ंक्शन का उपयोग करते समय सतर्क रहें। एक असफल लेनदेन अभी भी इस मान को बढ़ा सकता है, और Quassnoi राज्यों के रूप में, यह पंक्ति हटा दी गई हो सकती है।

ऐसा लगता है कि यह एक टेबल स्कैन करता है क्योंकि यह गारंटी नहीं दे सकता कि अंतिम पहचान मान MAX मान है। उदाहरण के लिए पहचान एक सरल वृद्धिशील पूर्णांक नहीं हो सकता है। आप अपनी पहचान के रूप में एक कमी पूर्णांक का उपयोग कर सकते हैं।

5

क्या हुआ यदि आपने नवीनतम रिकॉर्ड हटा दिया है?

IDENTITY का मान अब वास्तविक डेटा के अनुरूप नहीं होगा।

आप MAX(id) के लिए तेजी से लुकअप चाहते हैं, आप उस पर एक सूचकांक बनाना चाहिए (या शायद यह एक PRIMARY KEY घोषित)

+0

अच्छा बिंदु नहीं है (हालांकि मैं इस तालिका में रिकॉर्ड नहीं हटाता) – Blorgbeard

+3

@ ब्लॉगरबीर्ड: निश्चित रूप से, मैं आपको विश्वास करता हूं, यह 'एसक्यूएल सर्वर' है जो नहीं करता है। – Quassnoi

+0

हाँ मैं इसे समझता हूं। इस धागे में बहुत अच्छे कारण हैं कि मुझे मैक्स (आईडी) के साथ पूरी चीज और छड़ी को भूलना चाहिए :) – Blorgbeard

0

क्रमांक प्राथमिक कुंजी या अनुक्रमित है? ऐसा लगता है कि इसे उन मामलों में तलाश करना चाहिए।

+0

नहीं, इसमें कोई अनुक्रमणिका नहीं है और यह पीके – Blorgbeard

+1

@ ब्लॉगरबीर्ड नहीं है क्योंकि IDENT_CURRENT() आपकी तालिका में डेटा को प्रतिबिंबित नहीं कर सकता है, इसका उपयोग MAX() के लिए नहीं किया जा सकता है और आपके पास कोई अनुक्रमणिका नहीं है, इसलिए आप तालिका स्कैन के साथ समाप्त होते हैं । –

1

मुझे पूरा यकीन है कि आप उस क्षेत्र पर अवरोही क्रम में एक सूचकांक स्थापित कर सकते हैं और यह सबसे बड़ी कुंजी खोजने के लिए इसका उपयोग करेगा। यह तेज़ होना चाहिए।

+0

काम करेगा, लेकिन मुझे इस डीबी में केवल – Blorgbeard

3

क्या तालिका उस कॉलम पर क्लस्टर है? आप उपयोग कर सकते हैं शीर्ष 1:

SELECT TOP 1 [ID]  
FROM [Table] 
order by ID desc 
+0

के लिए एक इंडेक्स जोड़ने की अनुमति नहीं है, यह आईडी पर क्लस्टर नहीं है। मैंने यह कोशिश की, लेकिन यह स्कैन/सॉर्ट करता है जो मैक्स (आईडी) से धीमा है। – Blorgbeard

1

आप इस निम्नलिखित बयान चलाने के लिए और पिछले UNION ALL निकाल सकते हैं। वर्तमान पहचान मान प्राप्त करने के लिए इस कथन को चलाएं।

SELECT 
    ' SELECT '+char(39)+[name]+char(39)+' AS table_name, IDENT_CURRENT('+char(39)+[name]+char(39)+') AS currvalue UNION ALL' 
    AS currentIdentity 
FROM sys.all_objects WHERE type = 'U' 
संबंधित मुद्दे