Database
 sql >> डेटाबेस >  >> RDS >> Database

स्प्लिटिंग स्ट्रिंग्स:ए फॉलो-अप

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

ALTER FUNCTION [dbo].[DelimitedSplitN4K]
(@pString NVARCHAR(4000), @pDelimiter NCHAR(1))
RETURNS TABLE WITH SCHEMABINDING AS
 RETURN
  WITH E1(N) AS (
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
  ),
  E2(N) AS (SELECT 1 FROM E1 a, E1 b),
  E4(N) AS (SELECT 1 FROM E2 a, E2 b), 
  cteTally(N) AS (SELECT TOP (ISNULL(DATALENGTH(@pString)/2,0)) 
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4),
  cteStart(N1) AS (SELECT 1 UNION ALL 
    SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
  ),
cteLen(N1,L1) AS(SELECT s.N1,
    ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,4000)
    FROM cteStart s
  )
 SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
        Item       = SUBSTRING(@pString, l.N1, l.L1)
   FROM cteLen l;
GO
. से

(केवल परिवर्तन जो मैंने किए हैं:मैंने इसे प्रदर्शित करने के लिए स्वरूपित किया है, और मैंने टिप्पणियों को हटा दिया है। आप मूल स्रोत यहां प्राप्त कर सकते हैं।)

मुझे अपने परीक्षणों में कुछ समायोजन करने पड़े ताकि जेफ के कार्य का उचित प्रतिनिधित्व किया जा सके। सबसे महत्वपूर्ण बात:मुझे उन सभी नमूनों को त्यागना पड़ा जिनमें कोई भी तार> 4,000 वर्ण शामिल थे। इसलिए मैंने dbo.strings तालिका में 5,000-वर्ण स्ट्रिंग्स को 4,000 वर्णों में बदल दिया, और केवल पहले तीन गैर-मैक्स परिदृश्यों पर ध्यान केंद्रित किया (पहले दो के लिए पिछले परिणामों को ध्यान में रखते हुए, और नए के लिए तीसरे परीक्षण को फिर से चलाना 4,000-वर्ण स्ट्रिंग लंबाई)। मैंने नंबर तालिका को सभी परीक्षणों में से एक से हटा दिया, क्योंकि यह स्पष्ट था कि वहां प्रदर्शन हमेशा कम से कम 10 के कारक से खराब था। निम्नलिखित चार्ट चार परीक्षणों में से प्रत्येक में कार्यों के प्रदर्शन को फिर से दिखाता है औसत 10 रन से अधिक और हमेशा ठंडे कैश और साफ बफर के साथ।

तो यहाँ प्रत्येक प्रकार के कार्य के लिए मेरी थोड़ी संशोधित पसंदीदा विधियाँ हैं:

आप देखेंगे कि सीएलआर मेरी पसंद का तरीका बना हुआ है, एक मामले को छोड़कर जहां बंटवारे का कोई मतलब नहीं है। और ऐसे मामलों में जहां सीएलआर एक विकल्प नहीं है, एक्सएमएल और सीटीई विधियां आम तौर पर अधिक कुशल होती हैं, एकल चर विभाजन के मामले में, जहां जेफ का कार्य सबसे अच्छा विकल्प हो सकता है। लेकिन यह देखते हुए कि मुझे 4,000 से अधिक वर्णों का समर्थन करने की आवश्यकता हो सकती है, संख्या तालिका समाधान इसे विशिष्ट परिस्थितियों में मेरी सूची में वापस ला सकता है जहां मुझे सीएलआर का उपयोग करने की अनुमति नहीं है।

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

एक तरफ के रूप में, मैंने इस टिप्पणी को जेफ के कार्यों के संस्करणों में से एक में देखा जो टिप्पणियों में पोस्ट किया गया था:मैं यह भी धन्यवाद देता हूं कि जिसने भी पहला लेख "नंबर टेबल" पर देखा है, जो निम्नलिखित यूआरएल पर स्थित है और एडम मैकनिक को कई साल पहले मुझे इस तक ले जाने के लिए। -सहायक-संख्या-तालिका.html


वह लेख मेरे द्वारा 2004 में लिखा गया था। इसलिए जिसने भी समारोह में टिप्पणी जोड़ी, आपका स्वागत है। :-)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पीएल/एसक्यूएल ट्यूटोरियल:पीएल/एसक्यूएल के बारे में वह सब कुछ जो आपको जानना आवश्यक है

  2. SQL डेटा हेरफेर भाषा

  3. CentOS 6 . पर कैसेंड्रा v3 कैसे स्थापित करें

  4. एसक्यूएल में आईएफ स्टेटमेंट कैसे करें?

  5. SQL में एक टेबल कैसे ड्रॉप करें