शीर्ष 100 प्रतिशत का चयन क्यों करें?


82

मैं समझता हूं कि एसक्यूएल सर्वर 2005 से पहले , आप एसक्यूएल सर्वर को व्यू डेफिनिशन में ऑर्डर के उपयोग की अनुमति देने के लिए "ट्रिक" कर सकते हैं TOP 100 PERCENT, सिलेक्ट क्लॉज में भी शामिल कर सकते हैं । लेकिन मैंने अन्य कोड को देखा है जो मुझे विरासत में मिला है जो उपयोग करता है SELECT TOP 100 PERCENT... डायनेमिक एसक्यूएल स्टेटमेंट ( एएसपी.नेट ऐप्स में एडीओ में उपयोग किया जाता है , आदि)। इस के लिए कोई कारण है? क्या परिणाम वही नहीं है जिसमें शामिल नहीं है ?TOP 100 PERCENT


5
हो सकता है कि कुछ स्टेटमेंट कंस्ट्रक्शन चल रहा हो: "SELECT TOP {0} PERCENT ..."
माइकल पेट्रोत्ता

आपका पहला वाक्य मेरे छिपे हुए प्रश्न का उत्तर बन गया है।
मुहम्मद आशिकुज्जमान

मैं शीर्ष 99.9999999 पर्केंट का उपयोग करता हूं और यह हमेशा काम करता है। यह काफी करीब है। मैं अपेक्षित संख्या के रिकॉर्ड के आधार पर '9' की संख्या को बढ़ाता हूं। अधिक रिकॉर्ड, अधिक 9 और यह हमेशा काम करता है। मैंने एसक्यूएल 2008 से एसक्यूएल 2017 तक उपयोग किया है।
पैडी

जवाबों:


51

इसका उपयोग " मध्यवर्ती भौतिककरण (Google खोज) " के लिए किया गया था

अच्छा लेख: एडम मचानिक: मध्यवर्ती भौतिकीकरण के रहस्यों की खोज

यहां तक ​​कि उन्होंने एक एमएस कनेक्ट भी उठाया ताकि यह एक क्लीनर फैशन में किया जा सके

मेरा विचार "स्वाभाविक रूप से बुरा नहीं है", लेकिन इसका उपयोग तब तक न करें जब तक कि 100% सुनिश्चित न हो। समस्या यह है, यह केवल उस समय पर काम करता है जब आप इसे करते हैं और शायद बाद में नहीं (पैच स्तर, स्कीमा, इंडेक्स, पंक्ति गणना आदि) ...

काम का उदाहरण

यह विफल हो सकता है क्योंकि आप नहीं जानते कि किस क्रम में चीजों का मूल्यांकन किया जाता है

SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1 AND CAST(foo AS int) > 100

और यह विफल भी हो सकता है क्योंकि

SELECT foo
FROM
    (SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1) bar
WHERE
    CAST(foo AS int) > 100

हालाँकि, यह SQL Server 2000 में नहीं था। आंतरिक क्वेरी का मूल्यांकन और स्पूल किया गया है:

SELECT foo
FROM
    (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (foo) = 1 ORDER BY foo) bar
WHERE
    CAST(foo AS int) > 100

ध्यान दें, यह अभी भी SQL Server 2005 में काम करता है

SELECT TOP 2000000000 ... ORDER BY...

दूसरी क्वेरी विफल क्यों होती है? क्योंकि आंतरिक क्वेरी (आवश्यक) पूरी तरह से मूल्यांकन नहीं है?
केनी एविट जूल

यह दूसरी कड़ी बताती है कि कभी-कभी अस्थायी तालिकाओं को बनाने से नाटकीय प्रदर्शन में सुधार होता है!
केनी एविट जूल 18'13

41

TOP (100) SQL सर्वर के हाल के संस्करणों में PERCENT पूरी तरह से अर्थहीन है, और यह (एक साथ देखने की परिभाषा या व्युत्पन्न तालिका के मामले में, इसके अनुसार ORDER BY) क्वेरी प्रोसेसर द्वारा अनदेखा किया जाता है।

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

डायनेमिक SQL में यह क्यों दिखाई दे सकता है, इसका मुझे कोई अंदाजा नहीं है। आप सही हैं कि इसका कोई कारण नहीं है, और परिणाम इसके बिना (और फिर, एक दृश्य परिभाषा या व्युत्पन्न तालिका के मामले में, दोनों शीर्ष और आदेश द्वारा खंड के बिना) समान है।


यह सच नहीं है; विवरण के लिए @ जीबी द्वारा जवाब से इस लिंक को देखें।
केनी एविट जूल 18'13

4
आपके द्वारा संदर्भित लिंक SELECT TOP (100) PERCENT .. ORDER BY के बारे में कुछ नहीं कहता है, जो अर्थहीन है। लिंक में SELECT TOP (2147483647) .. ORDER BY के उपयोग का उल्लेख है। वर्तमान में, SQL सर्वर ऑप्टिमाइज़र SELECT TOP (100) PERCENT .. ORDER BY को समाप्त कर देगा, क्योंकि यह अर्थहीन है। यह संयोजन हमेशा पंक्तियों के उसी संग्रह को परिभाषित करता है जैसे SELECT without TOP / ORDER BY। ऑप्टिमाइज़र वर्तमान में यह निर्धारित करने का प्रयास नहीं करता है कि क्या 2147483647 में सभी पंक्तियाँ शामिल हैं, इसलिए यह इस मामले में TOP - ORDER BY संयोजन को समाप्त नहीं करता है।
स्टीव कैस

2
लिंक वास्तव में उल्लेख करता है TOP (100) PERCENT: "... मैं ORDER BY के साथ संयोजन के रूप में TOP 100 PERCENT का उपयोग करके व्युत्पन्न तालिका के सारणीबद्ध सारणीकरण, अस्थायी सारणी को मजबूर करने का प्रयास कर सकता हूं। दुर्भाग्य से, SQL सर्वर क्वेरी ऑप्टिमाइज़र टीम ने फैसला किया कि यह 'n' है। टी एक अच्छा विचार है, और आशावादी अब इस तरह के प्रयासों की उपेक्षा करता है। " यह वास्तव में आप का समर्थन करता है।
केनी एविट

अगर मैं कर सकता था, तो मैं अपने पतन को पूर्ववत कर दूंगा । [यदि आप अपने उत्तर को संपादित करते हैं तो मैं इसे
बढ़ा दूंगा

1
तुम शायद भ्रमित हो क्योंकि मैंने अपना विचार बदल दिया है; मेरी पहली टिप्पणी गलत थी; आप सही हे।
केनी एविट

23

... एक दृश्य परिभाषा में ORDER BY के उपयोग की अनुमति दें।

यह एक अच्छा विचार नहीं है। एक दृश्य को कभी भी परिभाषित नहीं किया जाना चाहिए।

ORDER BY का प्रदर्शन पर प्रभाव पड़ता है - इसका उपयोग करने का मतलब यह है कि ORDER BY स्पष्टीकरण योजना में बदल जाएगा। यदि आपके पास एक क्वेरी है जहां दृश्य को तत्काल क्वेरी में किसी भी चीज़ में शामिल किया गया है, या इनलाइन दृश्य (CTE / सबक्वेरी फैक्टरिंग) में संदर्भित किया जाता है - ORDER BY को हमेशा अंतिम ORDER BY (इसे परिभाषित किया गया था) से पहले चलाया जाता है। उन पंक्तियों को ऑर्डर करने का कोई लाभ नहीं है जो अंतिम परिणाम सेट नहीं हैं जब क्वेरी शीर्ष (या MySQL / पोस्टग्रेज के लिए सीमा) का उपयोग नहीं कर रही है।

विचार करें:

CREATE VIEW my_view AS
    SELECT i.item_id,
           i.item_description,
           it.item_type_description
      FROM ITEMS i
      JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id
  ORDER BY i.item_description

...

  SELECT t.item_id,
         t.item_description,
         t.item_type_description
    FROM my_view t
ORDER BY t.item_type_description

... का उपयोग करने के लिए बराबर है:

  SELECT t.item_id,
         t.item_description,
         t.item_type_description
    FROM (SELECT i.item_id,
                 i.item_description,
                 it.item_type_description
            FROM ITEMS i
            JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id
        ORDER BY i.item_description) t
ORDER BY t.item_type_description

यह बुरा है क्योंकि:

  1. उदाहरण आइटम के विवरण से शुरू में सूची का आदेश दे रहा है, और फिर आइटम प्रकार के विवरण के आधार पर इसे फिर से व्यवस्थित किया गया है। यह संसाधनों को पहले प्रकार में बर्बाद कर रहा है - जैसा चल रहा है इसका मतलब यह नहीं है कि यह चल रहा है:ORDER BY item_type_description, item_description
  2. यह स्पष्ट नहीं है कि एनकैप्सुलेशन के कारण दृश्य क्या आदेश दिया गया है। इसका मतलब यह नहीं है कि आपको अलग-अलग क्रमों के साथ कई विचार बनाने चाहिए ...

6

यदि कोई ORDER BYखंड नहीं है, तो TOP 100 PERCENTबेमानी है। (जैसा कि आप उल्लेख करते हैं, यह विचारों के साथ 'चाल' था)

[उम्मीद है कि ऑप्टिमाइज़र इसे दूर अनुकूलित करेगा।]


5

मैंने अन्य कोड देखा है जो मुझे विरासत में मिला है जो SELECT TOP 100 PERCENT का उपयोग करता है

इसका कारण सरल है: एंटरप्राइज मैनेजर सहायक होने की कोशिश करता था और आपके कोड को आपके लिए इसमें शामिल करने के लिए प्रारूपित करता था। कोई मतलब नहीं था इसे हटाने की कोशिश कर रहा है क्योंकि यह वास्तव में कुछ भी चोट नहीं पहुंचाई और अगली बार जब आप इसे बदलने के लिए गए तो ईएम इसे फिर से सम्मिलित करेगा।


4

कोई कारण नहीं बल्कि उदासीनता, मुझे लगता है।

ऐसे क्वेरी स्ट्रिंग्स आमतौर पर एक ग्राफिकल क्वेरी टूल द्वारा उत्पन्न होते हैं। उपयोगकर्ता कुछ तालिकाओं से जुड़ता है, एक फिल्टर जोड़ता है, एक क्रम बनाता है, और परिणामों का परीक्षण करता है। चूंकि उपयोगकर्ता क्वेरी को दृश्य के रूप में सहेजना चाहता है, इसलिए उपकरण एक शीर्ष 100 PERCENT जोड़ता है। इस मामले में, हालांकि, उपयोगकर्ता SQL को अपने कोड में कॉपी करता है, जहां WHERE क्लॉज को मानकीकृत करता है, और डेटा एक्सेस लेयर में सब कुछ छुपाता है। मन से बाहर, दृष्टि से बाहर।


1

कृपया नीचे दिए गए प्रयास करें, आशा है कि यह आपके लिए काम करेगा।

      SELECT TOP
              ( SELECT COUNT(foo) 
                  From MyTable 
                 WHERE ISNUMERIC (foo) = 1) * 
                  FROM bar WITH(NOLOCK) 
              ORDER BY foo
                 WHERE CAST(foo AS int) > 100
               )

1

त्रुटि यह सब कहते हैं ...

Msg 1033, लेवल 15, स्टेट 1, प्रोसीजर टेस्टव्यू, लाइन 5 ORDER BY क्लॉज व्यू, इनलाइन फ़ंक्शंस, व्युत्पन्न टेबल, सबक्वेरी और कॉमन टेबल एक्सप्रेशंस में अमान्य है, जब तक कि TOP, OFFSET या XML के लिए भी निर्दिष्ट नहीं किया जाता है।

उपयोग न करें TOP 100 PERCENT, का उपयोग करें TOP n, जहां एन एक संख्या है

TOP 100 PERCENT (जिन कारणों से मुझे जानकारी नहीं है) को SQL Server VIEW (2012 के बाद के संस्करण) द्वारा अनदेखा किया गया है, लेकिन मुझे लगता है कि MS ने इसे सिंटैक्स कारणों से रखा है। TOP n बेहतर है और एक दृश्य के अंदर काम करेगा और इसे उस तरह से सॉर्ट करेगा जब आप शुरू में उपयोग किया जाता है, लेकिन सावधान रहें


0

मुझे लगता है कि आप परिणाम में एक चर का उपयोग कर सकते हैं, लेकिन एक दृश्य में ORDER BY टुकड़ा प्राप्त करने से अलग, आपको "TOP 100 PERCENT" बताते हुए कोई लाभ नहीं होगा:

declare @t int
set @t=100
select top (@t) percent * from tableOf

2
प्रश्न Why use Select Top 100 Percentप्रतिशत के लिए एक वैरिएबल काउंट प्राप्त करने का नहीं है।
बुम्मी

0

बस यह कोशिश करो, यह यह बहुत ही बताते हैं। आप एक आदेश के साथ एक दृश्य नहीं बना सकते सिवाय अगर ...

CREATE VIEW v_Test
         AS
           SELECT name
             FROM sysobjects
         ORDER BY name
        GO

Msg 1033, लेवल 15, स्टेट 1, प्रोसीजर टेस्टव्यू, लाइन 5 ORDER BY क्लॉज व्यू, इनलाइन फ़ंक्शंस, व्युत्पन्न टेबल, सबक्वेरी और कॉमन टेबल एक्सप्रेशंस में अमान्य है, जब तक कि TOP, OFFSET या XML के लिए भी निर्दिष्ट नहीं किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.