SQL Server 2008 Indeks Teks Lengkap Tidak Pernah Terlihat Lengkap


13

Situs web kami memiliki database SQL Server 2008 R2 Express Edition dengan pengindeksan teks lengkap untuk pencarian situs web kami. Setiap kali catatan baru ditambahkan atau diperbarui di salah satu tabel yang diindeks, proses pengindeksan tampaknya tidak pernah selesai.

Saya telah memantau status selama beberapa minggu terakhir menggunakan permintaan yang pada dasarnya sama dengan yang ditemukan di situs ini: http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-search/2155/Why-is-this -populasi-mengambil-begitu-lama

Ini yang saya lihat ketika saya menjalankan kueri (klik untuk ukuran penuh): Status Indeks Teks Lengkap

Catatan terbaru dalam tabel yang diindeks tidak pernah lengkap dan tidak dapat dicari. Meskipun tidak ada banyak data dalam tabel, saya telah menunggu berhari-hari untuk melihat apakah pengindeksan selesai, tetapi tidak ada yang berubah.

Satu-satunya cara saya berhasil menyelesaikan pengindeksan adalah dengan membangun kembali katalog atau untuk menjatuhkan dan membuat kembali semua indeks.

Setiap kali saya melakukan itu, masalah yang sama akhirnya kembali segera setelah catatan baru pertama ditambahkan.

Berikut adalah statistik server untuk berjaga-jaga:

  • Quad-Core AMD Opteron 2.34GHz
  • RAM 4GB
  • Windows Server 2008 R2 Enterprise SP1 x64
  • SQL Server 2008 R2 Express Edition dengan Layanan Lanjutan x64

Jawaban:


6

Saya akhirnya menemukan penyebab masalah saya!

Saya mencoba berbulan-bulan untuk melacak masalah ini, tetapi akhirnya menyerah, menonaktifkan pelacakan perubahan otomatis, baru saja secara manual memulai populasi tambahan dan melanjutkan hidup saya.

Sementara itu, ada kesalahan lain yang mengganggu bahwa saya mengalami kesulitan melacak. Secara berkala situs web akan menampilkan kesalahan koneksi DB:

Tidak dapat membuka basis data "XXXX" yang diminta oleh login. Login gagal. Gagal masuk untuk pengguna 'XXXX'.

Ternyata kedua masalah ini memiliki solusi yang sama. Yang harus saya lakukan adalah mematikan pengaturan basis data yang disebut Tutup Otomatis. Untuk melakukan ini, cukup klik kanan database dan klik properti. Di jendela properti pilih Opsi dan setel "Tutup Otomatis" ke false.

Jendela Properti Database

Segera setelah saya menonaktifkan Tutup Otomatis, masalah login DB saya hilang dan pelacakan perubahan otomatis berfungsi dengan baik.

Sekali lagi terima kasih atas bantuan semua orang. Saya menghargainya!


3

Penasaran jika Anda telah melalui langkah pemecahan masalah di BOL untuk Kinerja Teks Lengkap - http://technet.microsoft.com/en-us/library/ms142560.aspx .

Saya bertaruh SQL Server memakan semua memori Anda dan tidak membiarkan daemon filter memilikinya, jadi populasi Anda lambat, karena kemungkinan besar harus menukar barang ke file halaman. Anda harus membatasi jumlah memori yang dapat digunakan SQL (saya pikir sekitar 3GB mengingat spesifikasi sistem Anda saat ini - yang akan menyisakan 1GB untuk FDHost dan OS).


up-voting @Brandon. Baca bagian ini, "Penyebab utama penurunan kinerja pengindeksan teks lengkap adalah batas sumber daya perangkat keras:"
MacGyver

2

Berikut ini adalah skrip yang saya buat menggunakan kursor untuk membangun kembali dan mengisi indeks lengkap untuk tabel apa pun yang memiliki satu untuk MSSQL2008. Ini berfungsi di lingkungan produksi dengan basis data yang dimigrasikan dari server MSSQL 2000. Saya telah mematikan pelacakan perubahan dan menjalankan prosedur tersimpan ini melalui SQL Server Agent. Jika Anda menggunakan express, Anda bisa menggunakan skrip VBS untuk menjalankannya melalui Penjadwal Tugas.

Penting dalam skrip untuk melakukan pembangunan kembali terlebih dahulu pada setiap katalog sebelum mencoba mengisi indeks.

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

Adakah yang punya metode yang tidak membutuhkan kursor?


0

Biasanya disarankan untuk memperbarui katalog teks lengkap menggunakan pemicu. Itu adalah pendekatan yang saya gunakan pada mssql, tetapi dalam kasus saya karena saya memiliki aplikasi lokal dengan beberapa persyaratan spesifik yang mengarahkan saya ke solusi menggunakan pemicu, bahwa solusi bekerja 100% mulai 2 tahun yang lalu.

Tinjau implementasi Anda terhadap contoh ini .


Saat ini indeks saya disetel ke pelacakan perubahan otomatis. Saya telah membaca bahwa mengubahnya menjadi manual dan menggunakan pemicu sebenarnya dapat menyebabkan masalah ketika satu orang memasukkan atau memperbarui catatan dalam tabel yang diindeks sebelum indeks yang dipicu pembaruan dari pembaruan tabel sebelumnya belum selesai. Sepertinya pelacakan perubahan otomatis harus berfungsi ... terutama karena saya tidak memiliki banyak catatan di tabel saya.
Jargs

Saya meninjau pengaturan saya terhadap contoh tautan yang Anda berikan, tetapi semuanya tampak beres. Saya bahkan mencoba memperbaiki instalasi SQL Server saya, tetapi masalahnya tetap ada.
Jargs

1
Saya tidak tahu apakah ini terkait, tapi saya pernah punya masalah dengan populasi fulltextcatalog karena masalah Word Breaker. Jika Anda Buka SSMS dan pilih Storage di bawah database Anda, lalu klik kanan pada katalog teks lengkap. Buka Tabel / Tampilan dan lihat Language for Word Breaker. Apakah ada kolom yang menggunakan berbagai bahasa untuk pemecah kata? Saya perhatikan, bahwa jika Anda memiliki bahasa yang berbeda untuk Pemecah Kata di tabel yang sama, populasi tidak berfungsi. Mungkin tidak terkait tetapi siapa yang tahu?
Craig Efrein

0

Tidak yakin apa penyebab root dalam situasi Anda, tetapi ini bisa terjadi setelah pencadangan terjadi. Tidak yakin apakah itu yang terjadi dalam kasus Anda atau bagaimana tabel itu berbeda dari yang lain. Sekarang Anda membuat saya penasaran. Apakah Anda mengaktifkan replikasi SQL?

Untuk perbaikan sementara, saya akan melakukan "Perayapan" (populasi) di atas meja saat ini terjadi.

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

Gunakan kode ini:

ALTER FULLTEXT INDEX ON dbname.dbo.tablename
START FULL POPULATION;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.