2010-05-20 13 views
6

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

मुझे कोई समाधान होने की कोई वास्तविक उम्मीद नहीं है, मैंने देखा है और वास्तव में ऐसा करने के किसी भी तरीके को नहीं देखते हैं, हालांकि मुझे उम्मीद है कि किसी को कोई विचार हो सकता है।

अग्रिम धन्यवाद।

संपादित

मैं जानकारी का एक महत्वपूर्ण टुकड़ा भूल जाते हैं, स्रोत कोड के लिए पहुँच नहीं तो हम ग्राहक के पक्ष जहां SQL विवरण बनाई है पर इसे बदल नहीं सकते है। कोई वास्तविक सर्वर साइड घटक नहीं है, क्लाइंट सीधे डेटाबेस तक पहुंचता है। किसी भी समाधान को मूल रूप से एक प्रक्रिया, ट्रिगर, या किसी प्रकार की SQL-Server 2008 सेटिंग/कमांड की आवश्यकता होती है।

+0

क्या अस्थायी फ़िक्स एप्लिकेशन को तोड़ देगा? क्या आप जानते हैं कि इस डेटा का उपयोग कैसे किया जा रहा है? – Paddy

+2

तालिका का नाम बदलें और इसे एक ऐसे दृश्य से प्रतिस्थापित करें जो 'SELECT TOP x * new_name_of_the_table' से चुनें। नोट, हालांकि, आवेदन द्वारा किए गए डेटा मैनिप्लेशंस (INSERT, UPDATE, DELETE) बाद में विफल हो जाएंगे। – Heinzi

+0

@Heinzi दुर्भाग्यवश हमें डालने, अपडेट करने और हटाने में सक्षम होना चाहिए। – tplaner

उत्तर

2

एक संभव समाधान

  • मूल tablename साथ अपमानजनक तालिका
  • नाम बदलने के लिए एक updatable view बनाने हो सकता है
  • SELECT TOP x * FROM OffendingTable अपनी दृश्य परिभाषा के रूप में करें

इस प्रकार, क्लाइंट डेटा चुनते समय परिवर्तन से अवगत नहीं है।


query governor

का उपयोग आप सब पर अपमानजनक क्वेरी के लिए कोई डेटा लौटने कोई आपत्ति नहीं है, क्वेरी राज्यपाल आपको ऐसा करने की अनुमति देता है।

+0

तक पहुंच नहीं है, हेनज़ी की टिप्पणी के समान उत्कृष्ट सुझाव, हालांकि आवेदन के भीतर बयान डालें, अपडेट करें और हटाएं काम नहीं करेंगे। – tplaner

+0

@evolve, यह अधिक कठिन हो जाता है लेकिन आपको अद्यतन करने योग्य विचारों पर पढ़ना चाहिए। अगर आपकी आवश्यकताओं के साथ यह संभव होगा तो मुझे हाथ नहीं पता लेकिन मुझे विश्वास है। –

+0

यह लगभग किसी भी मुद्दे के बिना काम करता है, आवेषण/अद्यतन/हटा देता है, हालांकि यदि आप शीर्ष 100 * से {तालिका} चुनते हैं तो यह हमेशा शीर्ष शीर्ष 100 पर वापस आता है, यह क्वेरी को निष्पादित किए जाने वाले शीर्ष 100 का आधार नहीं देता है। कभी-कभी उनके पास क्वेरी के भीतर WHERE कथन होते हैं जिन्हें काम करने की आवश्यकता होती है। तो हालांकि बंद करो। – tplaner

1

इसके लिए एक आदेश होना चाहिए।

मुझे MYSQL में पता है कि यह एसक्यूएल स्टेटमेंट के अंत में "LIMIT (firstindex, lastindex)" है।

का चयन टॉप 10,20 ... या इस

की तरह कुछ यही मतलब यह होगा कि 10 शुरुआत के साथ 20 पंक्तियों का चयन मुझे लगता है कि

1

:

मैं मैं MSSQL में सुना है आप लिख सकते हैं लगता है आपके द्वारा चुने गए उपयोग कर सकते हैं शीर्ष

चयन टॉप 50 प्रतिशत * व्यक्तियों से (http://www.w3schools.com/sql/sql_top.asp)

या

है इस तरह पेजिंग की मदद से आप

CREATE PROCEDURE [dbo].[GetRequestedRecordByPage] 
@FromList nvarchar(200)    -- Table Name 
,@SortingCol nvarchar(200)   -- Sorting column Name 
,@SelectList nvarchar(200) = '*'   -- Select columns list 
,@WhereClause nvarchar(200) = ''  -- Where clause i.e condition 
,@PageNum int = 1       -- Requested page number 
,@PageSize int = 5     -- No of record in page 
,@TotalNoOfRecord int output   -- Total no of selected records 
AS 
Begin 
    SET NOCOUNT ON 
    DECLARE @Query nvarchar(max)   -- query going to be execute 

    IF rtrim(ltrim(@WhereClause)) <> '' 
    BEGIN 
     SET @Query ='SELECT @TotalNoOfRecord = COUNT(*) 
         FROM  ' + @FromList + ' 
     WHERE ' + @WhereClause 
    END 
    ELSE 
    BEGIN 
     SET @Query ='SELECT @TotalNoOfRecord = COUNT(*) 
         FROM  ' + @FromList 
    END 

    /* Count no. of record */ 
     EXEC sp_executeSQL 
     @Query, 
     @params = N'@TotalNoOfRecord INT OUTPUT', 
     = @TotalNoOfRecord OUTPUT 

DECLARE @lbound int, @ubound int 




/* Calculating upper and lower bound */ 
     SET @lbound = ((@PageNum - 1) * @PageSize) 
     SET @ubound = @lbound + @PageSize + 1 


/* Get list of record(s) */ 
     SELECT @Query = '' 
     SELECT @Query = 'SELECT * 
          FROM ( 
SELECT ROW_NUMBER() OVER(ORDER BY ' + @SortingCol + ') AS rownumber,' [email protected] + 
             ' FROM ' + @FromList 

     IF rtrim(ltrim(@WhereClause)) <> '' 
     BEGIN 
      SELECT @Query = @Query + ' WHERE ' + @WhereClause 
     END 

      SELECT @Query = @Query + ' ) AS tbl 
WHERE rownumber > ' + CONVERT(varchar(9), @lbound) + 
     ' AND rownumber < ' + CONVERT(varchar(9), @ubound) 

     EXEC (@Query)     
End 
+3

ऐसा लगता है कि उसके पास SQL ​​ –

1

यदि क्लाइंट डेटाबेस से कनेक्ट करने के लिए टीसीपी का उपयोग कर रहा है, तो आप सर्वर पक्ष पर क्लाइंट और डेटाबेस सर्वर के बीच एक अधिक पारदर्शी टीसीपी प्रॉक्सी सर्वर डाल सकते हैं। फिर आप क्लाइंट से आने वाले किसी भी अपमानजनक प्रश्नों को फिर से लिख सकते हैं (शीर्ष या क्वेरी में सुधार के कुछ साधनों का उपयोग करके)।

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

मैं इसे एक घंटे में लिख और परीक्षण कर सकता हूं, लेकिन यह सॉकेट प्रोग्रामिंग का कुछ ज्ञान लेता है।

+0

+1। एक उबेरजेक समाधान के रूप में यह अच्छा तरीका होगा। मुझे संदेह है कि यह एक घंटे में कामयाब होगा लेकिन यह निश्चित रूप से करने योग्य है। –

+0

कूल समाधान, यद्यपि व्यावहारिक नहीं है। – tplaner

+0

@Evolve, मैंने इस समाधान का उपयोग अन्य प्रकार के उत्पादन प्रणालियों के लिए किया है। माना जाता है कि, मैंने इसे डेटाबेस सिस्टम के लिए उपयोग नहीं किया है, लेकिन मैं चाहता हूं। –

0

आप तालिका से एक्स रिकॉर्ड के अलावा सभी को छोड़ सकते हैं और उन्हें कहीं और स्टोर कर सकते हैं

संबंधित मुद्दे

 संबंधित मुद्दे