2012-06-13 18 views
5

क्या एसक्यूएल सर्वर में कोई कीवर्ड या मेटाफॉर्मेशन है जो आपको बताएगा कि क्या टॉप प्रभावी हुआ है?एसक्यूएल सर्वर टॉप - इस्तेमाल किया?

EX: 
Select TOP 5 * From Stuff 

RESULT: 5 rows 

यह निर्धारित करने का सबसे अच्छा तरीका क्या है कि 6 या उससे अधिक समय होता?

I could do: 
SELECT TOP 6 count(*) FROM Stuff 

लेकिन मैं एक अलग कॉल की संख्या पुनर्प्राप्त करने के बारे में चिंतित हूँ क्योंकि वहाँ वास्तविक क्वेरी और अधिक जटिल इस एक से और एक बड़ी मेज पर है।

धन्यवाद!

+0

किस तरह से "प्रभाव डाला"? इसका मतलब है कि यह वास्तव में आपके परिणाम सेट सीमित है? बस आप जो मिला वह गिनें। – bluevector

+0

@jonnyGold यह बताते हुए कि वह वापस क्या मिला, उसे नहीं बताएगा कि क्या उससे अधिक पंक्तियां उपलब्ध हैं। – ean5533

+0

@ ean5533 इसलिए मैं "प्रभाव डाला" के अर्थ के बारे में स्पष्टीकरण मांग रहा हूं? – bluevector

उत्तर

7

खैर साथ कुछ इस्तेमाल कर सकते हैं, आप शीर्ष एन 1 को चुन सकते हैं (जहां अपने उदाहरण में एन 5 है, इसलिए अपने उदाहरण में शीर्ष 6 चुनें) और त्यागने अपने क्लाइंट कोड में आखिरी वाला, और यह निर्धारित करने के लिए छठे तत्व की उपस्थिति का उपयोग करें कि क्या आपने पहले स्थान पर एन का प्रभाव डाला होगा या नहीं। मुझे यकीन नहीं है कि ऐसा करने का बहुत अधिक मूल्य है, हालांकि।

+5

+1 यह [स्पेस पेन] (http://en.wikipedia.org/wiki/Space_Pen) के बीच एक पेंसिल है। – mafue

+0

+1 ऐसा करने का शायद सबसे प्रभावी तरीका है। –

+0

वाह। यह एक लंबा दिन था। यकीन नहीं है कि यह मेरे दिमाग को पार नहीं किया। – LethalFlipper

0

आप उस प्रश्न में एक बूलियन मान जोड़ सकते हैं जो एक ही तर्क के साथ एक सबक्वायरी के COUNT (*) को 5 से अधिक मान देता है और जब यह मान 5 या उससे कम हो जाता है तो गलत होता है।

यह आपके द्वारा लौटाए जा रहे डेटा को आवश्यक जानकारी जोड़ देगा। यदि आप प्रदर्शन के बारे में चिंतित हैं, और क्वेरी बेहद जटिल है, इससे अलग प्रश्नों पर बड़ा सुधार नहीं हो सकता है, लेकिन सबसे अच्छा मामूली सुधार देना चाहिए।

0

आप उपयोग कर सकते हैं स्वत: कुछ भी नहीं है कि दो प्रश्नों के बिना या प्रदर्शन की हत्या recacluations कर ऐसा करने के लिए कोई तरीका नहीं है ...

Select TOP 5 * From Stuff 

और

Select Count(*) From Stuff 
+1

सच नहीं है, COUNT() ओवर() यह –

+0

@AaronBertrand कर सकता है मैं यह देखने के लिए क्वेरी प्लान देखना चाहता हूं कि कौन सा तरीका अधिक प्रभावशाली है। – bluevector

+1

मुफ्त महसूस करें। अब तक प्रस्तुत किए गए सभी समाधानों में से, जब मैं सभी को एक साथ निष्पादित करता हूं, कार्ल और मार्टिन प्रत्येक की कुल लागत का 4% तक आते हैं। रेडफिल्टर 5% पर 1% अधिक है, एचएलजीईएम 42% है, और आपका सुझाव अन्य 44% के लिए संयुक्त है। मैंने sys.all_columns के खिलाफ अपने परीक्षण किए। –

12

। आप इन पंक्तियों

DECLARE @N INT = 5; 

WITH T 
    AS (SELECT TOP (@N + 1) * 
     FROM master..spt_values 
     ORDER BY number) 
SELECT TOP (@N) *, 
      CASE 
       WHEN Count(*) OVER() = (@N + 1) THEN 1 
       ELSE 0 
      END AS MoreRecords 
FROM T 
ORDER BY number 
+3

@AaronBertrand नहीं, क्योंकि उनके 'साथ' केवल 6 पंक्तियों का चयन किया गया है। – ean5533

+0

@ ean5533 दाएं, लेकिन ओपी का 'साथ' शायद नहीं हो सकता है। मैं शायद एक चर का उपयोग कर इसे प्रदर्शित करेंगे। –

+0

@AaronBertrand - ओपी के पास 'टॉप 6' (या' टॉप एन + 1') होना चाहिए, इसलिए यह 6 वीं पंक्ति के बाद स्कैनिंग रोक सकता है। –

0
SELECT TOP 5 Field1, field2, recordcount 
FROM Stuff 
CROSS JOIN (SELECT COUNT(*) as recordcount FROM Stuff) a 
ORDER BY Field1 
+0

ध्यान दें कि मैंने SELECT * का उपयोग करने के SQL एंटीपेटर्न को हटा दिया है और शीर्ष एन रिकॉर्ड प्राप्त करते समय ऑर्डर द्वारा उपयोग नहीं किया है। – HLGEM

0
select top 5 *, 
    case when count(*) OVER() <= 5 then 'yes' else 'no' end as AllRecordsReturned 
from supportContacts 
संबंधित मुद्दे