Chỉ mục toàn văn của SQL Server 2008 dường như không bao giờ hoàn thành


13

Trang web của chúng tôi có cơ sở dữ liệu SQL Server 2008 R2 Express Edition với lập chỉ mục toàn văn cho tìm kiếm trang web của chúng tôi. Mỗi khi một bản ghi mới được thêm hoặc cập nhật vào một trong các bảng được lập chỉ mục, quá trình lập chỉ mục dường như không bao giờ hoàn thành.

Tôi đã theo dõi tình trạng trong vài tuần qua bằng cách sử dụng cơ bản cùng một truy vấn được tìm thấy trên trang web này: http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-search/2155/Why-is-this -population-mất-quá lâu

Đây là những gì tôi thấy khi tôi chạy truy vấn (nhấp vào kích thước đầy đủ): Trạng thái chỉ mục toàn văn

Các bản ghi mới nhất trong các bảng được lập chỉ mục không bao giờ hoàn thành và không thể tìm kiếm được. Mặc dù không có nhiều dữ liệu trong các bảng, tôi đã chờ đợi nhiều ngày để xem việc lập chỉ mục có hoàn thành hay không, nhưng không có gì thay đổi.

Cách duy nhất tôi có thể khiến việc lập chỉ mục hoàn thành thành công là xây dựng lại danh mục hoặc bỏ và tạo lại tất cả các chỉ mục.

Mỗi lần tôi làm điều đó, vấn đề tương tự lại xuất hiện ngay khi bản ghi mới đầu tiên được thêm vào.

Dưới đây là số liệu thống kê máy chủ chỉ trong trường hợp:

  • AMD Opteron lõi tứ 2.34GHz
  • RAM 4GB
  • Windows Server 2008 R2 Enterprise SP1 x64
  • Phiên bản SQL Server 2008 R2 Express với Dịch vụ nâng cao x64

Câu trả lời:


6

Cuối cùng tôi đã tìm ra nguyên nhân của vấn đề của mình!

Tôi đã cố gắng trong nhiều tháng để theo dõi vấn đề, nhưng cuối cùng đã từ bỏ, vô hiệu hóa theo dõi thay đổi tự động, chỉ cần bắt đầu thủ công dân số gia tăng và tiếp tục cuộc sống của tôi.

Trong khi đó, đã có một lỗi dai dẳng khác mà tôi gặp khó khăn khi theo dõi. Định kỳ trang web sẽ đưa ra lỗi kết nối DB:

Không thể mở cơ sở dữ liệu "XXXX" theo yêu cầu đăng nhập. Việc đăng nhập thất bại. Đăng nhập thất bại cho người dùng 'XXXX'.

Hóa ra cả hai vấn đề này đều có cùng một giải pháp. Tất cả những gì tôi phải làm là tắt một cài đặt cơ sở dữ liệu có tên là Tự động đóng. Để làm điều này, chỉ cần nhấp chuột phải vào cơ sở dữ liệu và nhấp vào thuộc tính. Trong cửa sổ thuộc tính, chọn Tùy chọn và đặt "Tự động đóng" thành sai.

Cửa sổ thuộc tính cơ sở dữ liệu

Ngay sau khi tôi tắt Tự động đóng, các sự cố đăng nhập DB của tôi đã biến mất và theo dõi thay đổi tự động hoạt động hoàn hảo.

Cảm ơn một lần nữa vì sự giúp đỡ của mọi người. Tôi rât cảm kich!


3

Tò mò nếu bạn đã trải qua các bước khắc phục sự cố trong BOL cho Hiệu suất toàn văn bản - http://technet.microsoft.com/en-us/l Library / ms142560.aspx .

Tôi cá rằng SQL Server đang ăn hết bộ nhớ của bạn và không để trình nền bộ lọc có bất kỳ, vì vậy dân số của bạn chậm, vì rất có thể nó phải trao đổi nội dung xuống tệp trang. Bạn nên giới hạn dung lượng bộ nhớ mà SQL có thể sử dụng (tôi nghĩ ở đâu đó khoảng 3 GB với thông số kỹ thuật hệ thống hiện tại của bạn - sẽ để lại 1GB cho FDhost và HĐH).


bỏ phiếu @Brandon. Đọc phần này, "Nguyên nhân chính làm giảm hiệu suất lập chỉ mục toàn văn bản là giới hạn tài nguyên phần cứng:"
MacGyver

2

Đây là một tập lệnh mà tôi đã tạo bằng các con trỏ để xây dựng lại và điền vào các chỉ mục đầy đủ cho bất kỳ bảng nào có một bảng cho MSSQL2008. Điều này đang làm việc trong một môi trường sản xuất với cơ sở dữ liệu được di chuyển từ máy chủ MSSQL 2000. Tôi đã tắt theo dõi thay đổi và chỉ chạy quy trình được lưu trữ này thông qua SQL Server Agent. Nếu bạn đang sử dụng express, bạn có thể sử dụng tập lệnh VBS để chạy nó thông qua Trình lập lịch tác vụ.

Điều quan trọng trong kịch bản là phải xây dựng lại đầu tiên trên mỗi danh mục trước khi cố gắng điền vào các chỉ mục.

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

Có ai có một phương pháp không yêu cầu con trỏ không?


0

Thông thường nên cập nhật danh mục toàn văn bằng các kích hoạt. Đó là aproach tôi sử dụng trên mssql, nhưng trong trường hợp của tôi vì tôi đã sử dụng một ứng dụng được bản địa hóa với một số yêu cầu cụ thể dẫn tôi đến một giải pháp sử dụng kích hoạt, giải pháp đó hoạt động 100% từ 2 năm trước.

Xem lại việc thực hiện của bạn chống lại ví dụ này .


Ngay bây giờ các chỉ mục của tôi được đặt thành theo dõi thay đổi tự động. Tôi đã đọc rằng việc thay đổi nó thành thủ công và sử dụng trình kích hoạt thực sự có thể gây ra sự cố khi một người chèn hoặc cập nhật bản ghi trong bảng được lập chỉ mục trước khi cập nhật chỉ mục được kích hoạt từ bản cập nhật bảng trước đó chưa kết thúc. Có vẻ như tính năng theo dõi thay đổi tự động sẽ hoạt động ... đặc biệt là vì tôi không có nhiều bản ghi trong bảng.
Jargs

Tôi đã xem lại thiết lập của mình so với liên kết ví dụ mà bạn đưa ra, nhưng mọi thứ dường như theo thứ tự. Tôi thậm chí đã thử sửa chữa cài đặt SQL Server của mình, nhưng vấn đề vẫn còn.
Jargs

1
Tôi không biết điều này có liên quan hay không, nhưng tôi đã từng gặp vấn đề với dân số fulltextcatalog vì các vấn đề về Word Breaker. Nếu bạn mở SSMS và chọn Lưu trữ trong cơ sở dữ liệu của bạn, sau đó nhấp chuột phải vào danh mục toàn văn. Chuyển đến Bảng / Lượt xem và xem Ngôn ngữ cho Word Breaker. Có cột nào sử dụng các ngôn ngữ khác nhau cho trình ngắt từ không? Tôi đã nhận thấy rằng nếu bạn có các ngôn ngữ khác nhau cho Word Breakers trong cùng một bảng thì dân số sẽ không hoạt động. Có thể không liên quan nhưng ai biết?
Craig Efrein

0

Không chắc nguyên nhân gốc rễ trong tình huống của bạn là gì, nhưng điều này có thể xảy ra sau khi sao lưu xảy ra. Không chắc chắn nếu đó là những gì xảy ra trong trường hợp của bạn hoặc bảng đó khác với các bảng khác như thế nào. Bây giờ bạn có tôi tò mò. Bạn có bật sao chép SQL không?

Để khắc phục tạm thời, tôi sẽ thực hiện "Thu thập dữ liệu" (dân số) trên bàn khi điều này xảy ra.

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

Sử dụng mã này:

ALTER FULLTEXT INDEX ON dbname.dbo.tablename
START FULL POPULATION;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.