2016-07-25 14 views
5

द्वारा बनाम वहाँ ROW_NUMBER का उपयोग कर और एमएस एसक्यूएल सर्वर में बयान एक ORDER BY साथ पहचान का उपयोग कर के बीच कोई अंतर (परिणाम सेट, प्रदर्शन या अर्थ अर्थ के संदर्भ में) है? उदाहरण के लिए, एक कॉलम "प्रथम" साथ एक मेज दिया वहाँROW_NUMBER पहचान और आदेश

SELECT FirstName, ROW_NUMBER() OVER (ORDER BY FirstName) AS Position 
INTO #MyTempTable 
FROM MyTable 

और

SELECT FirstName, IDENTITY(BIGINT) AS Position 
INTO #MyTempTable 
FROM MyTable 
ORDER BY FirstName 
+0

दोनों विकल्पों की निष्पादन योजनाओं पर नज़र डालें। यह आपको प्रदर्शन के लिए एक बहुत अच्छा संकेतक देगा। मुझे संदेह है कि बहुत अंतर आएगा। –

+0

@scsimon उस – JamieD77

+0

@scsimon के बारे में 100% निश्चित नहीं है दूसरी क्वेरी के पास एक ऑर्डर है ताकि आउटपुट वही होगा। और परिभाषा के अनुसार एक तालिका का कोई आदेश नहीं है। –

उत्तर

3

अर्थ अर्थ के बीच कोई अंतर है अलग है। पहला उदाहरण अनुक्रमिक मान के साथ एक पूर्णांक कॉलम बनाता है।

दूसरे उदाहरण, identity() का उपयोग कर एक पहचान स्तंभ बनाता है। इसका मतलब है कि बाद के आवेषण में वृद्धि होगी। ,

select 'a' as x, identity(int, 1, 1) as id 
into #t; 

insert into #t(x) values('b'); 

select * 
from #t; 

प्रसंस्करण के लिए के रूप में, दो अनिवार्य रूप से अपने मामले में एक ही होना चाहिए क्योंकि firstname जरूरतों क्रमबद्ध करना:

उदाहरण के लिए, इस कोड को चलाते हैं। यदि पंक्तियां व्यापक थीं, तो मुझे आश्चर्य नहीं होगा अगर row_number() संस्करण प्रदर्शन में दूसरे को बाहर कर देता है। row_number() के साथ केवल एक कॉलम सॉर्ट किया गया है और फिर मूल डेटा पर मैप किया गया है। identity() के साथ पूरी पंक्ति को सॉर्ट करने की आवश्यकता है। प्रदर्शन में यह अंतर सिर्फ अनुमान लगाया गया है।

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