मेरे पास एक प्रश्न है जो तालिका से परिणाम खोज रहा है, यदि कोई पंक्ति किसी विशिष्ट वस्तु से मेल खाती है तो यह परिणाम प्रदान करेगी।
तो, यह एक 12 अक्षर की संख्या है।
तो कार्यक्षमता यह है कि यदि उपयोगकर्ता ने 414 के रूप में एक संख्या प्रदान की है तो यह '% 414%' की तरह खोज करेगा।
और यदि संख्या की लंबाई 6 अंकों से अधिक है तो यह '4146144%' की तरह खोजेगा
परिणामस्वरूप क्वेरी इतनी धीमी हो रही है क्योंकि हमारे पास 20 मिलियन रिकॉर्ड हैं।
क्या आप कृपया मुझे उस समस्या को ठीक करने के लिए कोई विकल्प प्रदान कर सकते हैं।
कंपनी किसी एपीआई या किसी अन्य चीज का उपयोग करने की अनुमति नहीं दे रही है।
SELECT distinct TOP (15) bt_id AS [Key]
, UPPER(rtrim(ltrim(bt_id)))+' - '+UPPER(rtrim(ltrim(bt_desc))) AS [Description]
FROM fcbillto
WHERE bt_id like '%' + @SearchTerm + '%'
OR bt_desc like '%' + @SearchTerm + '%'
यदि पूर्ण पाठ स्कैन समाधान है, तो क्या मैं एक ही तालिका के लिए दो अलग-अलग कैटलॉग बना सकता हूं क्योंकि उपरोक्त कॉलम में से एक है जिस पर मुझे खोज करने की आवश्यकता है और दूसरी स्थिति में मैं उसी तालिका के किसी अन्य कॉलम पर खोज रहा हूं। तो, मुझे चाहिए दो रिपॉजिटरी बनाने के लिए।
2 जवाब
आपके पास दो समस्याएं हैं जो आपकी क्वेरी के खड़े होने पर किसी भी अनुक्रमणिका के कुशल उपयोग को रोकती हैं:
1) OR
क्लॉज। SQL bt_id
या bt_desc
पर OR
क्लॉज के साथ किसी इंडेक्स का उपयोग नहीं कर सकता है क्योंकि एक कॉलम पर फ़िल्टर करने के लिए इंडेक्स का उपयोग करने से दूसरे कॉलम पर विधेय को पूरा करने वाली मान्य पंक्तियों को खत्म किया जा सकता है। यदि आपके पास दोनों स्तंभों पर एक अनुक्रमणिका थी तो आप दोनों मानदंडों को पूरा करने वाली पंक्तियों को प्राप्त करने के लिए UNION
का उपयोग कर सकते हैं (या यदि आप भाग्यशाली हैं तो ऑप्टिमाइज़र इसे अंडर-द-हूड कर सकता है) लेकिन इंडेक्स का उपयोग नहीं किया जा सकता है जैसा कि चीजें खड़ी हैं क्योंकि ...
2) एक LIKE
एक अग्रणी %
के साथ एक इंडेक्स पर खोज नहीं कर सकता क्योंकि इंडेक्स को प्रमुख वर्णों के आधार पर क्रमबद्ध किया जाता है। यदि इसे स्ट्रिंग के बीच में वर्णों की तलाश करनी है तो यह पंक्तियों की तलाश के लिए अनुक्रमणिका का उपयोग नहीं कर सकता है। (इसका मतलब यह नहीं है कि यह सूचकांक को स्कैन नहीं करेगा क्योंकि यह स्वयं तालिका से छोटा है - इसलिए इस आधार पर अभी भी प्रदर्शन में सुधार हो सकता है)।
इसलिए आवश्यकताओं में बदलाव के बिना वास्तविक प्रदर्शन सुधार देखना मुश्किल साबित हो सकता है। यदि आप आवश्यकताओं को इस तरह बदल सकते हैं कि खोज केवल प्रमुख वर्णों पर है (या किसी अन्य अनुक्रमित कॉलम पर क्वेरी को सीमित करें) तो यह तेज़ होगा (bt_id
और bt_desc
पर अनुक्रमणिका मानते हुए):
SELECT TOP (15) bt_id AS [Key]
, UPPER(rtrim(ltrim(bt_id)))+' - '+UPPER(rtrim(ltrim(bt_desc))) AS [Description]
FROM
(SELECT bt_id
, bt_desc
FROM fcbillto
WHERE bt_id like @SearchTerm + '%'
UNION
SELECT bt_id
, bt_desc
FROM fcbillto
WHERE bt_desc like @SearchTerm + '%') search
ORDER BY bt_id -- I presume?
पूर्ण टेक्स्ट इंडेक्स कॉलम के भीतर शब्दों को खोजने के लिए डिज़ाइन किए गए हैं - आपके पास केवल वर्ण हैं जो मदद नहीं करेंगे।
ORDER BY
की आवश्यकता पर निर्भर करता है। मैंने यह मानते हुए एक जोड़ा कि यह प्रासंगिक होगा। यदि एक की आवश्यकता है तो मूल क्वेरी को पूरी तालिका को स्कैन करना होगा ताकि यह पता लगाया जा सके कि कौन सी पंक्तियां पहले 15 बनाती हैं। यदि नहीं, तो मानदंड को पूरा करने वाली पंक्तियों के आधार पर मूल क्वेरी तेज हो सकती है। हालांकि इसमें एक क्लस्टर इंडेक्स स्कैन शामिल होगा जिसमें लॉकिंग के लिए भयानक प्रभाव पड़ते हैं।
इसको आजमाओ।
SELECT distinct TOP (15)
bt_id AS [Key],
UPPER(rtrim(ltrim(bt_id)))+' - '+UPPER(rtrim(ltrim(bt_desc))) AS [Description]
FROM fcbillto
WHERE charindex(@SearchTerm, bt_id) > 0 OR charindex(@SearchTerm, bt_desc) > 0
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
sql-server
Microsoft SQL सर्वर एक रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है। कॉम्पैक्ट, एक्सप्रेस, एज़्योर, फास्ट-ट्रैक, एपीएस (पूर्व में पीडीडब्ल्यू) और एज़्योर SQL डीडब्ल्यू सहित सभी SQL सर्वर संस्करणों के लिए इस टैग का उपयोग करें। अन्य प्रकार के DBMS (MySQL, PostgreSQL, Oracle, आदि) के लिए इस टैग का उपयोग न करें। सॉफ़्टवेयर और मोबाइल विकास के मुद्दों के लिए इस टैग का उपयोग न करें, जब तक कि यह सीधे डेटाबेस से संबंधित न हो।
LIKE '%414%'
खोजों (एक प्रमुख%
वाइल्डकार्ड के साथ) के साथ प्रश्नों को गति नहीं दे सकती है - वे हमेशा पूर्ण तालिका स्कैन होने वाली हैं और इस प्रकार धीमी हैं ......