SQL Server 2008 Tam Metin Dizini Asla Tamamlanmadı


13

Web sitemizde, web sitesi aramamız için tam metin dizine eklenmiş bir SQL Server 2008 R2 Express Edition veritabanı bulunmaktadır. Dizinlenmiş tablolardan birine yeni bir kayıt eklendiğinde veya güncellendiğinde, dizin oluşturma işlemi hiçbir zaman tamamlanmış gibi görünmez.

Temel olarak bu sitede bulunan aynı sorguyu kullanarak son birkaç haftadır durumu izliyorum: http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-search/2155/Why-is-this -population alma çok da uzun

Sorguyu çalıştırdığımda gördüğüm şey (tam boyut için tıklayın): Tam Metin Dizin Durumu

Dizinlenmiş tablolardaki en yeni kayıtlar hiçbir zaman tamamlanmaz ve aranamaz. Tablolarda çok fazla veri olmamasına rağmen, indekslemenin tamamlanıp tamamlanmadığını görmek için günler bekledim, ancak hiçbir şey değişmiyor.

Dizin oluşturmayı başarıyla tamamlayabilmemin tek yolu ya kataloğu yeniden oluşturmak ya da tüm dizinleri bırakıp yeniden oluşturmaktır.

Bunu her yaptığımda, ilk yeni kayıt eklenir eklenmez aynı sorun ortaya çıkıyor.

Her ihtimale karşı sunucu istatistikleri:

  • Dört Çekirdekli AMD Opteron 2.34GHz
  • 4GB RAM
  • Windows Server 2008 R2 Enterprise SP1 x64
  • Gelişmiş Hizmetler x64 ile SQL Server 2008 R2 Express Edition

Yanıtlar:


6

Sonunda problemimin nedenini buldum!

Aylarca sorunu takip etmeye çalıştım, ama sonunda vazgeçtim, otomatik değişiklik izlemeyi devre dışı bıraktım, sadece artan popülasyonu manuel olarak başlattım ve hayatımla devam ettim.

Bu arada, izlemede sorun yaşadığım bir başka nagging hatası vardı. Web sitesi düzenli olarak bir DB bağlantı hatası atar:

Oturum açma tarafından istenen "XXXX" veritabanı açılamıyor. Giriş başarısız oldu. 'XXXX' kullanıcısı için oturum açılamadı.

Her iki sorunun da aynı çözüme sahip olduğu ortaya çıktı. Tek yapmam gereken Otomatik Kapat adlı bir veritabanı ayarını kapatmak. Bunu yapmak için veritabanına sağ tıklayın ve özellikleri tıklayın. Özellikler penceresinde Seçenekler'i seçin ve "Otomatik Kapat" seçeneğini yanlış olarak ayarlayın.

Veritabanı Özellikleri Penceresi

Otomatik Kapat özelliğini devre dışı bıraktığımda, DB oturum açma sorunlarım ortadan kalktı ve otomatik değişiklik izleme mükemmel bir şekilde çalıştı.

Herkesin yardımları için tekrar teşekkürler. Bunu takdir ediyorum!


3

Tam Metin Performansı için BOL'deki sorun giderme adımlarından geçtiyseniz meraklısınız - http://technet.microsoft.com/en-us/library/ms142560.aspx .

SQL Server'ın tüm belleğinizi yediği ve filtre arka plan programının herhangi birine sahip olmasına izin vermediği için bahse giriyorum, bu yüzden nüfusunuz yavaştır, çünkü büyük olasılıkla sayfa dosyasına bir şeyler takas etmek zorunda kalmaktadır. SQL'in kullanabileceği bellek miktarını sınırlamalısınız (mevcut sistem özellikleriniz göz önüne alındığında 3GB civarında bir yere düşünürdüm - FDHost ve OS için 1GB bırakacaktı).


Yukarı oylama @Brandon. "Tam metin dizine ekleme performansının düşmesinin ana nedeni donanım-kaynak sınırlarıdır":
MacGyver

2

MSSQL2008 için herhangi bir tablo için tam dizinleri yeniden oluşturmak ve doldurmak için imleçler kullanarak oluşturduğum bir komut dosyasıdır. Bu, bir MSSQL 2000 sunucusundan geçirilen veritabanlarıyla birlikte bir üretim ortamında çalışmaktadır. Değişiklik izlemeyi kapattım ve sadece bu saklı yordamı SQL Server Agent ile çalıştırın. Express kullanıyorsanız, Görev Zamanlayıcı aracılığıyla çalıştırmak için bir VBS komut dosyası kullanabilirsiniz.

Dizinde, dizinleri doldurmaya çalışmadan önce her katalogda yeniden oluşturma yapmak önemliydi.

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

Herkesin imleç gerektirmeyen bir yöntemi var mı?


0

Genellikle tetikleyicileri kullanarak tam metin kataloğunu güncellemeniz önerilir. Bu mssql'de kullandığım yaklaşımdır, ancak benim durumumda, tetikleyicileri kullanarak bir çözüme götüren birkaç belirli gereksinime sahip yerelleştirilmiş bir uygulamam olduğu için, çözümler 2 yıl önce% 100 çalışıyor.

Uygulamanızı bu örnekle inceleyin .


Şu anda dizinlerim otomatik değişiklik izlemeye ayarlanmış. Manuel olarak değiştirmenin ve tetikleyicilerin kullanılmasının, bir kişi önceki tablo güncellemesinden tetiklenen dizin güncellemesi henüz bitmeden önce dizinlenmiş bir tabloya kayıt eklediğinde veya güncellediğinde sorunlara neden olabileceğini okudum. Otomatik değişiklik izlemenin çalışması gerektiği gibi görünüyor ... özellikle tablolarımda bu kadar fazla kayıt olmadığından.
Jargs

Kurulumumu verdiğiniz örnek bağlantıya göre inceledim, ancak her şey yolunda görünüyor. Hatta SQL Server yüklememi onarmayı denedim, ancak sorun devam ediyor.
Jargs

1
Bunun ilgili olup olmadığını bilmiyorum, ama bir zamanlar Word Breaker sorunları nedeniyle fulltextcatalog nüfusu ile ilgili bir sorun yaşadım. SSMS'yi açar ve veritabanınızın altında Depolama'yı seçerseniz, tam metin kataloğunu sağ tıklayın. Tablolar / Görünümler'e gidin ve Word Breaker'ın Diline bakın. Sözcük ayırıcılar için farklı diller kullanan sütunlar var mı? Aynı tabloda Word Breakers için farklı dillere sahipseniz, nüfusun çalışmadığını fark ettim. Belki ilgisiz ama kim bilir?
Craig Efrein

0

Durumunuzda ana nedenin ne olduğundan emin değilsiniz, ancak bu bir yedekleme gerçekleştikten sonra olabilir. Durumunuzda olanın bu olup olmadığından veya bu tablonun diğerlerinden nasıl farklı olduğundan emin değilim. Şimdi beni meraklandırıyorsun. SQL çoğaltmasını etkinleştirdiniz mi?

Geçici bir düzeltme için, bu olduğunda masada bir "Tarama" (nüfus) gerçekleştirmek istiyorum.

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

Bu kodu kullanın:

ALTER FULLTEXT INDEX ON dbname.dbo.tablename
START FULL POPULATION;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.