SQL सर्वर 2008 पूर्ण पाठ अनुक्रमणिका कभी पूरा नहीं होता है


13

हमारी वेबसाइट खोज के लिए पूर्ण-पाठ अनुक्रमण के साथ हमारी वेबसाइट में SQL Server 2008 R2 एक्सप्रेस संस्करण डेटाबेस है। हर बार एक नया रिकॉर्ड अनुक्रमित तालिकाओं में जोड़ा या अपडेट किया जाता है, तो अनुक्रमण प्रक्रिया कभी पूरी नहीं होती है।

मैं मूल रूप से इस साइट पर मिली समान क्वेरी का उपयोग करके पिछले कई हफ्तों से स्थिति की निगरानी कर रहा हूं: http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-search/2155/Why-is-this -population लेने-तो लंबी

जब मैं क्वेरी चलाता हूं तो यह वही होता है (पूर्ण आकार के लिए क्लिक करें): पूर्ण-पाठ सूचकांक स्थिति

अनुक्रमित तालिकाओं में नवीनतम रिकॉर्ड कभी भी पूर्ण नहीं होते हैं और यह खोज योग्य नहीं होते हैं। टेबलों में बहुत अधिक डेटा नहीं होने के बावजूद, मैंने यह देखने के लिए दिनों का इंतजार किया है कि क्या अनुक्रमण पूरा हो जाता है, लेकिन कभी भी कुछ भी नहीं बदलता है।

एकमात्र तरीका मैं अनुक्रमण को सफलतापूर्वक पूरा करने में सक्षम हूं या तो सूची को फिर से बनाना है या सभी अनुक्रमितों को छोड़ना और फिर से बनाना है।

जब भी मैंने ऐसा किया है, पहला नया रिकॉर्ड जुड़ते ही वही समस्या वापस आ रही है।

यहाँ केवल मामले में सर्वर आँकड़े हैं:

  • क्वाड-कोर AMD Opteron 2.34GHz
  • 4 जीबी रैम
  • Windows Server 2008 R2 एंटरप्राइज़ SP1 x 64
  • SQL Server 2008 R2 एक्सप्रेस संस्करण उन्नत सेवाओं के साथ x64

जवाबों:


6

मुझे आखिरकार अपनी समस्या का कारण मिल गया!

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

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

लॉगिन द्वारा अनुरोधित डेटाबेस "XXXX" नहीं खोल सकता। लॉगिन विफल रहा। उपयोगकर्ता 'XXXX' के लिए लॉगिन विफल हुआ।

यह पता चला कि इन दोनों समस्याओं का एक ही समाधान था। मुझे बस एक डेटाबेस सेटिंग बंद करनी थी, जिसे ऑटो क्लोज़ कहा जाता है। ऐसा करने के लिए, बस डेटाबेस पर राइट-क्लिक करें और गुण क्लिक करें। गुण विंडो में विकल्प चुनें और "ऑटो क्लोज़" को असत्य पर सेट करें।

डेटाबेस गुण विंडो

जैसे ही मैंने ऑटो बंद को निष्क्रिय किया, मेरे DB लॉगिन मुद्दे चले गए और स्वचालित परिवर्तन ट्रैकिंग ने पूरी तरह से काम किया।

फिर से सभी की मदद के लिए धन्यवाद। मैं इसकी सराहना करता हूं!


3

यदि आप पूर्ण-पाठ प्रदर्शन के लिए BOL में समस्या निवारण चरणों से गुजरे हैं तो उत्सुक - http://technet.microsoft.com/en-us/library/ms142560.aspx

मैं शर्त लगा रहा हूं कि SQL सर्वर आपकी सभी मेमोरी खा रहा है और फ़िल्टर डेमॉन को कोई भी ऐसा नहीं करने दे रहा है, इसलिए आपकी आबादी धीमी है, क्योंकि यह पृष्ठ फ़ाइल के नीचे सामान स्वैप करने की सबसे अधिक संभावना है। आपको स्मृति की मात्रा को सीमित करना चाहिए जिसे SQL उपयोग कर सकता है (मैं आपके मौजूदा सिस्टम स्पेक्स को देखते हुए 3GB के आसपास कहीं सोचूंगा - जो कि FDHost और OS के लिए 1GB छोड़ देगा)।


अप-वोटिंग @Brandon इस खंड को पढ़ें, "कम पूर्ण-पाठ अनुक्रमण प्रदर्शन का मुख्य कारण हार्डवेयर-संसाधन सीमाएँ हैं:"
मैकगिवेर

2

यहाँ एक स्क्रिप्ट है, जिसे मैंने MSSQL2008 के लिए किसी भी तालिका के पुनर्निर्माण और पूर्ण अनुक्रमित करने के लिए कर्सर का उपयोग करके बनाया है। यह MSSQL 2000 सर्वर से माइग्रेट किए गए डेटाबेस के साथ उत्पादन वातावरण में काम कर रहा है। मैंने परिवर्तन ट्रैकिंग बंद कर दी है और इस संग्रहीत कार्यविधि को SQL सर्वर एजेंट के माध्यम से चला रहा हूँ। यदि आप एक्सप्रेस का उपयोग कर रहे थे, तो आप इसे टास्क शेड्यूलर के माध्यम से चलाने के लिए एक वीबीएस स्क्रिप्ट का उपयोग कर सकते हैं।

इंडेक्स को आबाद करने की कोशिश करने से पहले हर कैटलॉग पर पहले पुनर्निर्माण करना स्क्रिप्ट में महत्वपूर्ण था।

CREATE PROCEDURE [dbo].[rebuild_repopulate_fulltext] 
AS
BEGIN

Declare @cmdA NVARCHAR(255)
Declare @cmdB NVARCHAR(255)
Declare @cmdC NVARCHAR(255)
DECLARE @Database VARCHAR(255)   
DECLARE @Table VARCHAR(255)  
DECLARE @cmd NVARCHAR(500)  
DECLARE @fillfactor INT 
DECLARE @Catalog VARCHAR(255)
DECLARE @Schema VARCHAR(255)

SET @fillfactor = 90 

DECLARE DatabaseCursor CURSOR FOR  
SELECT name FROM MASTER.dbo.sysdatabases   
WHERE name NOT IN ('master','msdb','tempdb','model','distribution')   
ORDER BY 1  

OPEN DatabaseCursor  

FETCH NEXT FROM DatabaseCursor INTO @Database  
WHILE @@FETCH_STATUS = 0  
BEGIN  

   -- rebuild fulltext catalog
   set @cmd = 'DECLARE CatalogCursor CURSOR FOR 
        SELECT t.name AS TableName, c.name AS FTCatalogName, s.name as schemaname
        FROM ['+ @Database + '].sys.tables t JOIN ['+ @Database +'].sys.fulltext_indexes i
        ON t.object_id = i.object_id
        JOIN ['+ @Database + '].sys.fulltext_catalogs c
        ON i.fulltext_catalog_id = c.fulltext_catalog_id
        JOIN ['+ @Database + '].sys.schemas s ON t.schema_id = s.schema_id'
   --PRINT @cmd
   EXEC (@cmd)  


   OPEN CatalogCursor   

   FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   WHILE @@FETCH_STATUS = 0   
   BEGIN  

    SET @cmdB = 'USE ['+ @Database + ']; ALTER FULLTEXT CATALOG ' + @Catalog + ' REBUILD;'
    --PRINT @cmdB
    EXEC (@cmdB)


    FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   END   

   CLOSE CatalogCursor   


   OPEN CatalogCursor   

   FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   WHILE @@FETCH_STATUS = 0   
   BEGIN  

    SET @cmdC = 'USE ['+ @Database + ']; ALTER FULLTEXT INDEX ON ['+ @Database + '].[' + @Schema + '].[' + @Table + '] START FULL POPULATION;' 
    --PRINT @cmdC
    EXEC (@cmdC)

    FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   END   

   CLOSE CatalogCursor   
   DEALLOCATE CatalogCursor  



   FETCH NEXT FROM DatabaseCursor INTO @Database  
END  

CLOSE DatabaseCursor   
DEALLOCATE DatabaseCursor

END

क्या किसी के पास कोई ऐसा तरीका है जिसे शाप देने वालों की आवश्यकता न हो?


0

आमतौर पर ट्रिगर्स का उपयोग करके पूर्ण-पाठ कैटलॉग को अपडेट करने की सिफारिश की जाती है। यही कारण है कि मैं mssql पर उपयोग कर रहा हूँ, लेकिन मेरे मामले में क्योंकि मैं कई विशिष्ट आवश्यकताओं के साथ एक स्थानीयकृत अनुप्रयोग है जो मुझे ट्रिगर का उपयोग करके समाधान की ओर ले जाता है, यह समाधान 2 साल पहले शुरू होने वाले 100% काम करता है।

इस उदाहरण के विरुद्ध अपने कार्यान्वयन की समीक्षा करें ।


अभी मेरे सूचकांक स्वचालित परिवर्तन ट्रैकिंग पर सेट हैं। मैंने पढ़ा है कि इसे मैनुअल में बदलना और ट्रिगर्स का उपयोग करना वास्तव में समस्या पैदा कर सकता है जब एक व्यक्ति सम्मिलित करता है या पिछले टेबल अपडेट से ट्रिगर इंडेक्स अपडेट से पहले किसी इंडेक्सेड टेबल में रिकॉर्ड अपडेट करता है। ऐसा लगता है कि स्वचालित परिवर्तन ट्रैकिंग को काम करना चाहिए ... खासकर जब से मेरे पास मेरे टेबल में कई रिकॉर्ड नहीं हैं।
जारग्स

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

1
मुझे नहीं पता कि यह संबंधित है, लेकिन मुझे एक बार वर्ड ब्रेकर समस्याओं के कारण फुलटेक्स्टिक्स आबादी के साथ एक समस्या थी। यदि आप SSMS खोलते हैं और अपने डेटाबेस के तहत संग्रहण का चयन करते हैं, तो पूर्ण पाठ कैटलॉग पर राइट क्लिक करें। टेबल्स / दृश्य पर जाएं और वर्ड ब्रेकर के लिए भाषा देखें। क्या ऐसे स्तंभ हैं जो शब्द तोड़ने वालों के लिए विभिन्न भाषाओं का उपयोग करते हैं? मैंने देखा है, कि यदि आपके पास एक ही टेबल में वर्ड ब्रेकर के लिए अलग-अलग भाषाएं हैं, तो जनसंख्या काम नहीं करती है। शायद असंबंधित लेकिन कौन जानता है?
क्रेग एफ्रेइन

0

यह निश्चित नहीं है कि आपकी स्थिति में मूल कारण क्या है, लेकिन बैकअप होने के बाद ऐसा हो सकता है। निश्चित नहीं है कि आपके मामले में क्या हो रहा है या वह तालिका दूसरों से अलग कैसे है। अब आप मेरे लिए उत्सुक हैं। क्या आपके पास SQL ​​प्रतिकृति चालू है?

एक अस्थायी सुधार के लिए, मैं ऐसा होने पर टेबल पर एक "क्रॉल" (जनसंख्या) का प्रदर्शन करूँगा।

http://msdn.microsoft.com/en-us/library/ms142575(v=sql.105).aspx

इस कोड का उपयोग करें:

ALTER FULLTEXT INDEX ON dbname.dbo.tablename
START FULL POPULATION;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.