Tôi đang sử dụng tìm kiếm văn bản đầy đủ sql 2008 và tôi đang gặp vấn đề nghiêm trọng với hiệu suất tùy thuộc vào cách tôi sử dụng Chứa hoặc Chứa. Dưới đây là mẫu: (bảng một có khoảng 5000 hồ sơ và có một chỉ số được bảo hiểm trên bảng 1 có tất cả các trường trong mệnh đề where. Tôi đã cố đơn giản hóa các câu lệnh để tha thứ cho tôi nếu có vấn đề về cú pháp.)Sql phục vụ tìm kiếm văn bản đầy đủ với không ổn định là rất chậm khi sử dụng trong JOIN!
Kịch bản 1:
select * from table1 as t1
where t1.field1=90
and t1.field2='something'
and Exists(select top 1 * from containstable(table1,*, 'something') as t2
where t2.[key]=t1.id)
kết quả: 10 giây (rất chậm)
Kịch bản 2:
select * from table1 as t1
join containstable(table1,*, 'something') as t2 on t2.[key] = t1.id
where t1.field1=90
and t1.field2='something'
kết quả: 10 giây (rất chậm)
Kịch bản 3:
Declare @tbl Table(id uniqueidentifier primary key)
insert into @tbl select {key] from containstable(table1,*, 'something')
select * from table1 as t1
where t1.field1=90
and t1.field2='something'
and Exists(select id from @tbl as tbl where id=req1.id)
kết quả: phần nhỏ của một giây (siêu nhanh)
Bottom line, có vẻ như nếu tôi sử dụng Containstable trong bất kỳ loại điều kiện tham gia hoặc điều kiện nào của câu lệnh chọn cũng có các điều kiện khác, hiệu suất thực sự là xấu. Ngoài ra nếu bạn nhìn vào hồ sơ, số lần đọc từ cơ sở dữ liệu đi lên mái nhà. Nhưng nếu tôi lần đầu tiên thực hiện tìm kiếm văn bản đầy đủ và đưa kết quả vào một biến bảng và sử dụng biến đó mọi thứ diễn ra siêu nhanh. Số lần đọc cũng thấp hơn nhiều. Có vẻ như trong các kịch bản "xấu", bằng cách nào đó nó bị mắc kẹt trong một vòng lặp khiến nó đọc nhiều lần từ cơ sở dữ liệu, nhưng tất nhiên tôi không hiểu tại sao.
Bây giờ câu hỏi đặt ra trước hết là tại sao lại xảy ra? và câu hỏi hai là các biến bảng có thể mở rộng được không? điều gì sẽ xảy ra nếu nó dẫn đến 10 của hàng ngàn hồ sơ? là nó vẫn sẽ được nhanh chóng.
Bất kỳ ý tưởng nào? Cảm ơn
Dường như vấn đề này áp phích này có http://stackoverflow.com/questions/2746303/freetext-query-is-slow-includes-top-and-order-by/2749322#2749322. Các hàng ước tính và thực tế từ truy vấn văn bản miễn phí khi bạn xem kế hoạch thực hiện là gì? –
Ồ, Và trong câu trả lời cho truy vấn của bạn về các biến bảng, chúng được quyết định unscalalable nếu bạn đang đi để tham gia vào các bảng khác với họ. Trình tối ưu hóa truy vấn luôn giả định rằng chúng sẽ chỉ trả lại 1 hàng có thể dẫn đến một số kế hoạch tối ưu phụ rất nhỏ trong trường hợp chúng có hàng chục nghìn bản ghi. Bảng tạm thời không nhận được số liệu thống kê được tạo cho chúng. –