SQL Server 2008 ดัชนีข้อความแบบเต็มไม่เคยดูเหมือนจะเสร็จสมบูรณ์


13

เว็บไซต์ของเรามีฐานข้อมูล SQL Server 2008 R2 Express Edition พร้อมการจัดทำดัชนีข้อความแบบเต็มสำหรับการค้นหาเว็บไซต์ของเรา ทุกครั้งที่มีการเพิ่มหรืออัปเดตระเบียนใหม่ในหนึ่งในตารางที่จัดทำดัชนีกระบวนการจัดทำดัชนีจะไม่เสร็จ

ฉันได้รับการตรวจสอบสถานะในช่วงหลายสัปดาห์ที่ผ่านมาโดยใช้ข้อความค้นหาเดียวกันบนเว็บไซต์นี้: http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-search/2155/Why-is-this -population สละให้ยาว

นี่คือสิ่งที่ฉันเห็นเมื่อฉันเรียกใช้แบบสอบถาม (คลิกเพื่อดูขนาดเต็ม): สถานะดัชนีข้อความแบบเต็ม

ระเบียนใหม่ล่าสุดในตารางที่จัดทำดัชนีไม่สมบูรณ์และไม่สามารถค้นหาได้ แม้ว่าจะมีข้อมูลไม่มากในตารางฉันรอวันเพื่อดูว่าการจัดทำดัชนีเสร็จสมบูรณ์ แต่ไม่มีอะไรเปลี่ยนแปลง

วิธีเดียวที่ฉันสามารถทำให้การทำดัชนีเสร็จสมบูรณ์ได้คือการสร้างแคตตาล็อกใหม่หรือเพื่อดรอปและสร้างดัชนีทั้งหมดอีกครั้ง

ทุกครั้งที่ฉันทำสิ่งนั้นปัญหาเดียวกันจะกลับมาอีกครั้งทันทีที่มีการเพิ่มสถิติใหม่ครั้งแรก

นี่คือสถานะเซิร์ฟเวอร์ในกรณี:

  • Quad-Core AMD Opteron 2.34GHz
  • 4GB RAM
  • Windows Server 2008 R2 Enterprise SP1 x64
  • SQL Server 2008 R2 Express Edition พร้อมบริการขั้นสูง x64

คำตอบ:


6

ในที่สุดฉันก็พบสาเหตุของปัญหาของฉัน!

ฉันพยายามเป็นเวลาหลายเดือนเพื่อติดตามปัญหา แต่สุดท้ายก็เลิกติดตามการเปลี่ยนแปลงอัตโนมัติปิดใช้งานเพิ่งเริ่มต้นด้วยตนเองประชากรส่วนเพิ่มและย้ายไปกับชีวิตของฉัน

ในขณะเดียวกันมีข้อผิดพลาดซึ่งจู้จี้อีกอย่างหนึ่งที่ฉันมีปัญหาในการติดตาม เว็บไซต์จะมีข้อผิดพลาดในการเชื่อมต่อฐานข้อมูลเป็นระยะ:

ไม่สามารถเปิดฐานข้อมูล "XXXX" ที่ร้องขอโดยการเข้าสู่ระบบ การเข้าสู่ระบบล้มเหลว การเข้าสู่ระบบล้มเหลวสำหรับผู้ใช้ 'XXXX'

ปรากฏว่าปัญหาทั้งสองนี้มีวิธีแก้ไขปัญหาเดียวกัน สิ่งที่ฉันต้องทำคือปิดการตั้งค่าฐานข้อมูลที่เรียกว่าปิดอัตโนมัติ ในการทำเช่นนี้เพียงคลิกขวาที่ฐานข้อมูลและคลิกคุณสมบัติ ในหน้าต่างคุณสมบัติเลือกตัวเลือกและตั้งค่า "ปิดอัตโนมัติ" เป็นเท็จ

หน้าต่างคุณสมบัติฐานข้อมูล

ทันทีที่ฉันปิดการใช้งานปิดอัตโนมัติปัญหาการเข้าสู่ระบบฐานข้อมูลของฉันก็หายไปและการติดตามการเปลี่ยนแปลงอัตโนมัติทำงานได้อย่างสมบูรณ์

ขอบคุณอีกครั้งสำหรับความช่วยเหลือของทุกคน ฉันรู้สึกทราบซึ้ง!


3

อยากรู้ว่าคุณได้ผ่านขั้นตอนการแก้ไขปัญหาใน BOL เพื่อให้มีประสิทธิภาพข้อความเต็ม - http://technet.microsoft.com/en-us/library/ms142560.aspx

ฉันพนันว่า SQL Server กินหน่วยความจำทั้งหมดของคุณและไม่ปล่อยให้ daemon ตัวกรองมีดังนั้นประชากรของคุณจึงช้าเนื่องจากเป็นไปได้มากที่จะต้องสลับสิ่งต่าง ๆ ลงในไฟล์หน้า คุณควร จำกัด จำนวนหน่วยความจำที่ SQL สามารถใช้ได้ (ฉันคิดว่าจะอยู่ที่ประมาณ 3GB ตามข้อกำหนดระบบปัจจุบันของคุณ - ซึ่งจะเหลือ 1GB สำหรับ FDHost และระบบปฏิบัติการ)


up-vote @Brandon อ่านหัวข้อนี้ "สาเหตุหลักของการลดการจัดทำดัชนีข้อความแบบเต็มคือข้อ จำกัด ของทรัพยากรฮาร์ดแวร์:"
MacGyver

2

นี่คือสคริปต์ที่ฉันสร้างขึ้นโดยใช้เคอร์เซอร์เพื่อสร้างและเติมดัชนีแบบเต็มสำหรับตารางใด ๆ ที่มีหนึ่งสำหรับ MSSQL2008 สิ่งนี้ทำงานในสภาพแวดล้อมการผลิตโดยใช้ฐานข้อมูลที่ย้ายจากเซิร์ฟเวอร์ MSSQL 2000 ฉันปิดการติดตามการเปลี่ยนแปลงและเพียงแค่เรียกใช้ขั้นตอนการจัดเก็บนี้ผ่านทางตัวแทนของเซิร์ฟเวอร์ SQL หากคุณใช้งานด่วนคุณสามารถใช้สคริปต์ VBS เพื่อเรียกใช้งานผ่าน Task Scheduler

เป็นสิ่งสำคัญในสคริปต์ที่ต้องสร้างใหม่ก่อนทุกแคตตาล็อกก่อนที่จะพยายามเติมดัชนี

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

โดยปกติจะแนะนำให้อัพเดตแค็ตตาล็อกข้อความแบบเต็มโดยใช้ทริกเกอร์ นั่นคือ aproach ที่ฉันใช้กับ mssql แต่ในกรณีของฉันเพราะฉันเป็นแอปพลิเคชั่นที่แปลหลายภาษาที่มีข้อกำหนดเฉพาะหลายอย่างที่นำฉันไปสู่โซลูชันโดยใช้ทริกเกอร์โซลูชันนั้นทำงาน 100% ตั้งแต่ 2 ปีย้อนหลัง

ตรวจสอบการติดตั้งของคุณกับตัวอย่างนี้


ตอนนี้ดัชนีของฉันถูกตั้งค่าเป็นการติดตามการเปลี่ยนแปลงอัตโนมัติ ฉันได้อ่านว่าการเปลี่ยนเป็นคู่มือและการใช้ทริกเกอร์อาจทำให้เกิดปัญหาได้เมื่อบุคคลหนึ่งแทรกหรืออัปเดตระเบียนในตารางดัชนีก่อนที่ดัชนีการทริกเกอร์จากการอัพเดตตารางก่อนหน้ายังไม่เสร็จ ดูเหมือนว่าการติดตามการเปลี่ยนแปลงอัตโนมัติควรทำงาน ... โดยเฉพาะอย่างยิ่งเนื่องจากฉันไม่มีระเบียนจำนวนมากในตารางของฉัน
Jargs

ฉันตรวจสอบการตั้งค่าของฉันกับลิงก์ตัวอย่างที่คุณให้ แต่ทุกอย่างดูเหมือนจะเป็นไปตามลำดับ ฉันได้ลองซ่อมแซมการติดตั้ง SQL Server ของฉันแล้ว แต่ปัญหายังคงอยู่
Jargs

1
ฉันไม่ทราบว่าสิ่งนี้เกี่ยวข้องหรือไม่ แต่ฉันเคยมีปัญหากับประชากรแบบเต็มเนื่องจากปัญหาของ Word Breaker หากคุณเปิด SSMS และเลือกที่เก็บข้อมูลภายใต้ฐานข้อมูลของคุณให้คลิกขวาที่แคตตาล็อกข้อความแบบเต็ม ไปที่ Tables / Views แล้วดู Language for Word Breaker มีคอลัมน์ที่ใช้ภาษาต่าง ๆ สำหรับตัวแบ่งคำหรือไม่ ฉันสังเกตว่าถ้าคุณมีภาษาที่แตกต่างกันสำหรับ Word Breakers ในตารางเดียวกันประชากรจะไม่ทำงาน อาจไม่เกี่ยวข้อง แต่ใครจะรู้
Craig Efrein

0

ไม่แน่ใจว่าเกิดจากสาเหตุใดในสถานการณ์ของคุณ แต่สิ่งนี้สามารถเกิดขึ้นได้หลังจากการสำรองข้อมูลเกิดขึ้น ไม่แน่ใจว่าเป็นสิ่งที่เกิดขึ้นในกรณีของคุณหรือว่าตารางนั้นแตกต่างจากคนอื่น ๆ ตอนนี้คุณมีฉันอยากรู้อยากเห็น คุณเปิดการจำลองแบบ SQL หรือไม่

สำหรับการแก้ไขชั่วคราวฉันจะทำการ "คลาน" (ประชากร) บนโต๊ะเมื่อเกิดเหตุการณ์นี้ขึ้น

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

ใช้รหัสนี้:

ALTER FULLTEXT INDEX ON dbname.dbo.tablename
START FULL POPULATION;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.