Các truy vấn có thể bắt đầu chậm lại theo thời gian vì một vài lý do và bạn xây dựng lại các chỉ mục có thể khắc phục vấn đề theo một số cách. Tôi sẽ chia sẻ một số lý do phổ biến hơn trong kinh nghiệm của mình nhưng cũng có thể có những nguyên nhân khác. Tôi đoán là bạn đang mắc phải một trong những vấn đề này .. Tôi cũng đã hỏi một số câu hỏi dưới dạng nhận xét cho câu hỏi của bạn để xem liệu chúng tôi có thể biết thêm chi tiết không. Nhưng một vài suy nghĩ:
Thống kê Bắt máy chủ SQL cũ duy trì thống kê cột và chỉ mục. Những điều này về cơ bản cho Trình tối ưu hóa truy vấn cách dữ liệu của bạn được phân phối. Thông tin này rất quan trọng đối với trình tối ưu hóa trong việc chọn phương thức truy cập dữ liệu phù hợp (Seek vs Scan) và sau đó chọn phương thức nối đang được sử dụng. Nếu bạn đã bật thống kê cập nhật tự động (cài đặt mặc định trong SQL .. Ở cấp độ cơ sở dữ liệu), chúng sẽ được tính toán lại, nhưng chỉ khi dữ liệu "đủ" thay đổi. Vì vậy, nếu bạn có một số chèn vào bảng của mình nhưng không bao giờ cập nhật thống kê theo cách thủ công và các chèn / cập nhật không đủ để kích hoạt cập nhật thống kê tự động, bạn có thể phải chịu các kế hoạch kém cho phân phối dữ liệu của mình ... Việc xây dựng lại chỉ mục của bạn cũng tính toán lại thống kê chỉ mục của bạn Tôi sẽ tạo một công việc để cập nhật thủ công các số liệu thống kê một cách thường xuyên, dù sao đây cũng là một cách tốt nhất - và lần sau điều này xảy ra hãy thử và chạy sp_updatestats
trong cơ sở dữ liệu của bạn và xem bạn có nhận thấy sự khác biệt không
Các vấn đề về kế hoạch truy vấn Bạn có thể bị đánh hơi tham số - về cơ bản lần đầu tiên một truy vấn chạy một giá trị được truyền vào - truy vấn được tối ưu hóa cho giá trị đó. Khi bạn tiếp theo chạy nó với một giá trị khác sẽ được hưởng lợi từ một gói truy vấn khác, nó sẽ chịu đựng với kế hoạch truy vấn ban đầu dẫn đến một truy vấn chậm. Khi mọi thứ chạy chậm cho ứng dụng - chúng cũng chậm nếu bạn chạy cùng một truy vấn trong SQL Server Management Studio? Nếu nó nhanh trong SSMS nhưng chậm trong ứng dụng - đó có thể là một dấu hiệu tốt chỉ về việc đánh hơi tham số. Nếu nó luôn chậm trên bảng theo thời gian cho tất cả các truy vấn và bất kể tham số nào, thì tôi sẽ không nhìn vào đây. Bài viết này nói khá nhiều về việc đánh hơi tham số.
Không đủ bộ nhớ / quá nhiều kế hoạch ad hoc Có vẻ như bạn đang gửi ad hoc SQL đến SQL Server. Điều này đôi khi có thể làm bộ nhớ cache kế hoạch của bạn, đặc biệt nếu bạn có một gói riêng cho mỗi lần thực hiện truy vấn. Tùy thuộc vào bộ nhớ trên máy chủ của bạn, điều này cũng có thể dẫn đến sự cố. Có bao nhiêu bộ nhớ trên máy chủ của bạn? Kiểm tra liên kết này về vấn đề với các kế hoạch sử dụng duy nhất. Bạn không có nhiều giải pháp tuyệt vời trong SQL Server 2005 cho vấn đề này, nếu bạn có nó. Nếu bạn có thể tạo lại vấn đề này trong môi trường không prod, tôi khuyên bạn nên chạy DBCC FREEPROCCACHE
trong môi trường không prod nếu điều này xảy ra lần nữa. Xin lưu ý! Đây là một cài đặt rộng đối tượng, nếu bạn thực hiện điều này trong sản xuất - mọi kế hoạch truy vấn được lưu trữ trong bộ đệm cho bất kỳ cơ sở dữ liệu nào sẽ không còn ở đó nữa. Nó có nghĩa là bạn phải "trả tiền" cho các phần tổng hợp một lần nữa. Nếu bạn có tính đồng thời cao và một hệ thống bận rộn, điều này có thể gây ra sự cố. Nếu đây là cơ sở dữ liệu thực sự duy nhất và dù sao bạn cũng gặp vấn đề về hiệu năng, thì việc thử sản xuất này sẽ không hại gì. Nếu bạn có Cơ sở dữ liệu khác và chỉ muốn làm điều đó cho cơ sở dữ liệu này, bài đăng trên blog này giải thích cách tiếp cận rõ ràng cho chỉ một DB.
Phân mảnh chỉ mục - Có thể phân mảnh chỉ mục là vấn đề thực tế ở đây, nhưng tôi ngạc nhiên rằng nó trở nên rất tệ. Nếu các bảng của bạn được nhóm trên một khóa gây ra sự phân mảnh nhanh chóng và bạn có rất nhiều phần chèn, đây có thể là trường hợp. Nó sẽ trở nên tồi tệ hơn nhiều nếu bạn bị thiếu sức mạnh về bộ nhớ và đĩa IO. Thiết lập một công việc để xây dựng lại / sắp xếp lại các chỉ mục của bạn một cách thường xuyên sẽ tốt. Dựa trên câu trả lời của bạn cho một số câu hỏi trong các ý kiến trên có thể có những việc khác cần làm để giảm thiểu tác động của việc này.