शब्द "SARGable" का वास्तव में क्या मतलब है?


24

SQL सर्वर उपयोगकर्ता शब्द "sargable" का उपयोग करते हैं । मुझे आश्चर्य हो रहा है कि क्या कोई उद्देश्य कार्यान्वयन-अज्ञेय कालातीत परिभाषा है "सारगबल" के लिए।

उदाहरण के लिए, WHERE foo LIKE '%bar%'कहा जाता है कि बहुत से लोग बर्खास्त नहीं होते हैं , लेकिन कुछ RDBMS ऐसे प्रश्नों पर अनुक्रमित का उपयोग करने में सक्षम होते हैं । फिर "सरगेबल" का क्या मतलब है?

अन्य संदर्भ


5
आप यह बताना चाह सकते हैं कि आपका प्रश्न SQL सर्वर के बारे में नहीं है, बल्कि " व्यर्थ " शब्द के बारे में है । आपके प्रश्न ने केवल SQL सर्वर को संदर्भित किया है क्योंकि यह "% wordhere%" खोज को संभालने में सक्षम नहीं है, जबकि जाहिर है कि अन्य RDBMS हैं।
जॉन उर्फ ​​हॉट

जवाबों:


31

शब्द "सर्गबल" की शुरुआत सबसे पहले पी। ग्रिफ़िथ्स सेलिंगर एट अल ने की थी। 1979 में ACM द्वारा प्रकाशित "एक संबंधपरक डेटाबेस प्रबंधन प्रणाली में प्रवेश पथ चयन" । गैर-एसीएम सदस्यों के लिए http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf पर उस पेपर की एक प्रति है

इस अनुच्छेद में इस शब्द को परिभाषित किया गया है:

अनुक्रमणिका और खंड 1 स्कैन वैकल्पिक रूप से विधेयकों का एक सेट ले सकते हैं, जिसे खोज तर्क (या SARGS) कहा जाता है, जो RSI 2 कॉलर में वापस आने से पहले एक ट्यूपल पर लागू होते हैं । यदि टुपल विधेय को संतुष्ट करता है, तो उसे वापस कर दिया जाता है; अन्यथा स्कैन तब तक जारी रहता है जब तक कि यह या तो एक नल नहीं खोज लेता है जो SARGS को संतुष्ट करता है या खंड या निर्दिष्ट सूचकांक मूल्य सीमा को समाप्त करता है। यह ट्यूपल्स के लिए आरएसआई कॉल करने के ओवरहेड को समाप्त करके लागत को कम करता है जिसे आरएसएस के भीतर कुशलता से खारिज किया जा सकता है। सभी विधेय उस रूप के नहीं हैं जो SARGS बन सकते हैं। एक सारगर्भित भविष्यवाणी एक रूप है (या जिसे प्रपत्र में रखा जा सकता है) "कॉलम तुलना-ऑपरेटर मूल्य"। एसएआरजीएस को इस तरह के विधेय की अभिव्यक्ति के रूप में व्यक्त किया जाता है जो कि असंगत रूप में भविष्यवाणी करता है।

दूसरे शब्दों में, एक सारगर्भित विधेय ऐसा होता है जिसे स्टोरेज इंजन (एक्सेस मेथड) द्वारा सीधे टेबल या इंडेक्स रिकॉर्ड को देखते हुए हल किया जा सकता है। एक गैर-बर्खास्त विधेय, इसके विपरीत, कार्रवाई करने के लिए DBMS के उच्च स्तर की आवश्यकता होती है। उदाहरण के लिए, WHERE lastname = 'Doe'भंडारण इंजन द्वारा क्षेत्र की सामग्री को देखते हुए इसका परिणाम तय किया जा सकता हैlastname को प्रत्येक रिकॉर्ड की । दूसरी ओर, WHERE UPPER(lastname) = 'DOE'SQL इंजन द्वारा फ़ंक्शन के निष्पादन की आवश्यकता होती है, जिसका अर्थ है कि भंडारण इंजन को उन सभी पंक्तियों को वापस करना होगा जो इसे पढ़ता है (बशर्ते कि वे अन्य संभव, मिलान योग्य विधेयकों से मेल खाते हों) मूल्यांकन के लिए SQL इंजन पर वापस आकर, अतिरिक्त लागत का खर्च उठाएं ।

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

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

डेटा सर्जेबल विधेय विधेय हैं जिन्हें इंडेक्स मैनेजर द्वारा मूल्यांकन नहीं किया जा सकता है, लेकिन डेटा प्रबंधन सेवाओं (डीएमएस) द्वारा मूल्यांकन किया जा सकता है। आमतौर पर, इन विधेयकों को आधार तालिका से अलग-अलग पंक्तियों के उपयोग की आवश्यकता होती है। यदि आवश्यक हो, डीएमएस विधेय का मूल्यांकन करने के लिए आवश्यक कॉलम पुनः प्राप्त करेगा,

तथ्य यह है कि एसक्यूएल सर्वर-स्पीक सार्जेबल विधेय में केवल वे होते हैं जिन्हें इंडेक्स सीक का उपयोग करके हल किया जा सकता है, संभवतः टेबल स्कैन के दौरान इस तरह के विधेय को लागू करने के लिए इसके भंडारण इंजन की अक्षमता से निर्धारित होता है।

सर्जेबल और नॉन-सर्जेबल विधेयकों को कभी-कभी "चरण 1" और "चरण 2" के रूप में क्रमशः वर्णित किया जाता है (यह भी डीबी 2 शब्दावली से आता है )। चरण 1 विधेयकों का मूल्यांकन क्वेरी प्रसंस्करण के निम्नतम स्तर पर किया जा सकता है, जबकि तालिका या सूचकांक रिकॉर्ड पढ़ते हुए। चरण 1 की शर्तों से मेल खाती पंक्तियाँ, यदि कोई हों, तो मूल्यांकन के अगले स्तर, चरण 2 में भेजी जाती हैं।


1 - सिस्टम आर में सेगमेंट तालिका के टुपल्स का भौतिक भंडारण है; एक खंड स्कैन अन्य DBMSes में टेबल स्कैन के बराबर है।

2 - आरएसआई - आरएसएस 3 इंटरफ़ेस, एक ट्यूल-उन्मुख क्वेरी इंटरफ़ेस। इस चर्चा के लिए प्रासंगिक इंटरफ़ेस फ़ंक्शन अगला है, जो अगली पंक्ति मिलान क्वेरी की भविष्यवाणी करता है।

3 - आरएसएस, या रिसर्च स्टोरेज सिस्टम, सिस्टम आर के स्टोरेज सबसिस्टम।


"सीधे टेबल या इंडेक्स रिकॉर्ड को देखते हुए" इसका क्या मतलब है? मेरा मतलब है कि निश्चित रूप = UPPER()से एक फ़ंक्शन कॉल है, लेकिन ऐसा memcmpखुद से है। यह लिखना बहुत आसान होगा memcmpकि एएससीआईआई और माननीय मामले को अनदेखा करता है (सिर्फ दूसरी बात को देखें)। क्या यह इसे SARGABLE बनाता है? @ Ypercube का उदाहरण भी देखें, dba.stackexchange.com/questions/162263/…
इवान कैरोल

4
@ EvanCarroll का मतलब है कि स्टोरेज इंजन के बाहर लागू किए गए डेटाबेस फ़ंक्शंस (जैसे क्वेरी प्रोसेसर / एक्ज़ीक्यूशन इंजन / एक्सप्रेशन सर्विस के भीतर) के बिना, सीधे टेबल या इंडेक्स रिकॉर्ड को देखना। Ypercube के उदाहरण में, क्वेरी को योजनाकार / ऑप्टिमाइज़र द्वारा पूर्वनिर्मित किया जाता है जैसे कि SARGable शब्दों में गैर-SARGable खोज को व्यक्त किया जाता है।
पॉल व्हाइट को फिर से बहाल मोनिका

क्या करता है "तालिका या सूचकांक रिकॉर्ड को देखकर सीधे" मतलब है? मुझे यकीन नहीं है कि यह कैसे समझा रहा है "सीधे तालिका या सूचकांक रिकॉर्ड का अवलोकन" । है x=0SARGable? क्या -0 = +0, ' ' = ''या स्थानिक समानता के बारे में ? निश्चित रूप से उस चीज का उदाहरण क्या होगा जो SARGable थी? जब आप कहते हैं "भंडारण इंजन के बाहर कार्यान्वित डेटाबेस फ़ंक्शन के बिना" आप Ypercube के उदाहरण DATE()में शामिल हैं जो भंडारण इंजन के अंदर शामिल है। वह SARGable क्यों नहीं है?
इवान कैरोल

2
@EvanCarroll संदर्भित पेपर को पढ़ने के लिए कुछ समय लें, और उसके बाद शायद इस उत्तर के माध्यम से जाएं। यदि आपके पास अभी भी प्रश्न हैं जो यहाँ विषय पर होंगे, तो आप उनसे पूछ सकते हैं। ध्यान दें कि DATE()एक वास्तविक (SQL सर्वर) फ़ंक्शन नहीं है, लेकिन (मैंने माना) एक प्रकार के रूपांतरण के लिए श्री घन की आशुलिपि। हम भी इस पर चर्चा कर सकते हैं चैट में यदि आप चाहें।
पॉल व्हाइट को फिर से बहाल मोनिका

18

मेरे लिए, SARGable का अर्थ है कि SQL सर्वर आपके खोज विधेय का उपयोग करते हुए एक सूचकांक की तलाश कर सकता है।

आप बस यह नहीं कह सकते हैं कि DBMS एक इंडेक्स का "फायदा उठा सकता है", क्योंकि गैर-सर्जेबल विधेय के साथ, SQL सर्वर एक गैर-सूचीबद्ध इंडेक्स को स्कैन कर सकता है।


मैं उस विभाजन को भी समाप्त
करूंगा

9

दिमित्री कोरोटकेविच द्वारा प्रो एसक्यूएल सर्वर इंटरनेशनल के अनुसार :

यदि कोई अनुक्रमणिका मौजूद है, तो SQL सर्वर कभी अनुक्रमणिका खोज कार्रवाई का उपयोग कर सकता है, जहां एक खोज तर्क ABLE विधेय है।

एक SARGable विधेय वह है जहाँ SQL सर्वर प्रक्रिया के लिए महत्वपूर्ण मानों के एकल मान या श्रेणी को अलग कर सकता है

SARGable विधेय निम्नलिखित ऑपरेटरों में शामिल हैं: =, >, >=, <,<= , IN, BETWEEN, और LIKE( उपसर्ग मिलान के मामले में )

गैर SARGable ऑपरेटरों में शामिल हैं: NOT, NOT IN,<> , और LIKE( नहीं उपसर्ग मिलान ), और साथ ही तालिका के विरुद्ध कार्य या गणना के उपयोग, और प्रकार रूपांतरण जहां डेटाप्रकार बनाया सूचकांक को पूरा नहीं करता।

उदाहरण :

WHERE name like 'SARGable%'
WHERE name like '%non-SARGable%'

डेमो :

DROP TABLE dbo.Testing;
GO

CREATE TABLE Testing (
    WeirdDatatype   int NOT NULL,
    SomethingElse   char(200)
);

CREATE NONCLUSTERED INDEX IDX_ALWAYS_SARGable
    ON dbo.Testing( SomethingElse);

CREATE NONCLUSTERED INDEX IDX_NOT_ALWAYS_SARGable
    ON dbo.Testing(SomethingElse);

INSERT INTO dbo.Testing
        ( WeirdDatatype, SomethingElse )
SELECT TOP 1000 m.message_id, CONVERT(char(200), m.text)
FROM sys.messages AS m;

अब हम चलाते हैं:

SELECT *
FROM dbo.Testing AS t
WHERE  t.WeirdDatatype = 1001;
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE 'Line%'
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE '%Line%'
     AND t.WeirdDatatype = 1001;

परिणाम हैं:

[1]

आइए SARGable क्वेरी (इंडेक्स सीक) के गुणों को देखें

यहाँ छवि विवरण दर्ज करें

क्वेरी ऑप्टिमाइज़र एक शुरुआत और अंत के सूचकांक में एक सीमा को परिभाषित करने में सक्षम है। इसमें क्वेरी करने के लिए एक खोज तर्क है।

अब गैर-SARGable क्वेरी:

यहाँ छवि विवरण दर्ज करें

आप विधेय की शुरुआत के साथ देख सकते हैं '% गैर ..%' क्वेरी ऑप्टिमाइज़र को DEFINE में प्रारंभ और समाप्ति या सीमा में सीमा की अनुमति नहीं देता है। इसे अब पूरी तालिका (स्कैन) खोजनी होगी।


तो फिर, अगर एक इंडेक्स बाद में बनाया जाता है जो समर्थन WHERE name like '%non-SARGable%'करता है जो स्थिति को व्यर्थ बनाता है? और, यदि हां, तो क्या हम एक विशिष्ट कार्यान्वयन दोष के बारे में बात नहीं कर रहे हैं? IE।, हमें "SQL सर्वर 2016 के रूप में व्यंग्य नहीं" कहना चाहिए
इवान कैरोल

1
हालाँकि SQL Server के रिलीज़ में कुछ भी कब्ज़े में है। जबकि एक इंडेक्स के टिपिंग पॉइंट को ध्यान में रखते हुए प्रेडिकेट की शुरुआत में क्वेरी ऑप्टिमाइज़र के लिए किसी इंडेक्स के भीतर मूल्यों की एक सीमा को परिभाषित करना बहुत मुश्किल होगा। इस प्रकार एक स्कैन और विधेय का उपयोग करना तब गैर-सारगर्भित विधेय कहलाता है।
विक वर्क

2
बेशक यह कार्यान्वयन विशिष्ट है। WHERE DATE(datetime_column) = '2001-01-01'उदाहरण के लिए "एसार्जेबल" है (नए एसक्यूएल सर्वर संस्करणों में (2008+ मुझे लगता है) इंडेक्स की तलाश करेगा) लेकिन पुराने में नहीं।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.