Tại sao truy vấn của tôi chạy nhanh trong Môi trường A, nhưng chậm trong Môi trường B?


7

Tôi có một đoạn SQL dường như chạy rất nhanh trong Môi trường A, nhưng cùng một truy vấn chạy rất chậm trong Môi trường B!

Các môi trường được cho là giống nhau, vậy tôi nên làm gì và / hoặc tôi nên tìm ở đâu để xem tại sao truy vấn không thực hiện giống nhau?

Câu trả lời:


13

Có nhiều yếu tố cả bên trong và bên ngoài đối với SQL Server có thể khiến cùng một truy vấn thực hiện khác nhau giữa các môi trường khác nhau, ngay cả khi chúng được cấu hình gần giống nhau, bất kỳ một trong số đó có thể dẫn đến hiệu suất và kế hoạch truy vấn rất khác nhau.

Người phục vụ

  • Phần cứng trên các môi trường có giống nhau (đĩa, bộ nhớ, CPU, v.v.) không?
    • Nếu máy ảo đang được sử dụng, hàng xóm ồn ào có thể ảnh hưởng đến hiệu suất VM tổng thể không?
    • Nếu trong đám mây, tự động cân bằng và các cấu hình khác có tương đương không?
  • Là môi trường trộn lẫn giữa vật lý / ảo / đám mây?
  • Các phiên bản hệ điều hành có khớp không?
  • Là môi trường trong các trung tâm dữ liệu khác nhau?

Sơ thẩm

  • Các phiên bản SQL Server có giống nhau không?
    • Một CU hoặc SP có thể tạo ra một thế giới khác biệt ngay cả khi các phiên bản chính giống nhau.
  • Là khối lượng công việc hoạt động trong (các) thực thi truy vấn có thể so sánh được không?
    • Là cùng một khối lượng truy vấn có mặt trong tất cả các môi trường?
    • Là bản chất của khối lượng công việc giống nhau trên tất cả các môi trường?
  • Có phải tất cả các môi trường đều tham gia vào cùng một thiết lập HA / DR không?
    • Nhiều lần môi trường thấp hơn sẽ không có Nhóm sẵn có, Vận chuyển nhật ký hoặc thiết lập sao chép trong khi sản xuất / DR có thể đang sử dụng các công nghệ này.
  • Các công việc bảo trì giống nhau có được chạy trên cùng một lịch trình trong tất cả các môi trường không?
  • Là cờ theo dõi tương đương trên tất cả các môi trường?
  • Là các công việc sao lưu giống nhau chạy trong tất cả các môi trường?
    • Tác động từ các bản sao lưu nên ở mức tối thiểu, nhưng thường thì chúng không chạy ở tất cả các môi trường thấp hơn.
  • Các cấu hình sys có giống nhau không?

Cơ sở dữ liệu

  • Các lược đồ / chỉ mục / thống kê / đối tượng đều bằng nhau giữa các môi trường?
  • Liệu chính xác cùng một dữ liệu tồn tại trên các môi trường?
    • Số lượng dữ liệu
    • Phân phối dữ liệu
    • Kích thước của dữ liệu (nghĩ rằng dữ liệu giả trong các loại dữ liệu có độ dài thay đổi có thể không phản ánh kích thước của các giá trị thực trong các môi trường khác)
  • Là cấu hình mức cơ sở dữ liệu giống nhau?
  • Các mức độ tương thích có giống nhau không?

Với tất cả những điều này, không có gì đáng ngạc nhiên khi trong nhiều trường hợp, đơn giản là không thể sao chép hoàn hảo mọi khía cạnh của cơ sở dữ liệu trên các môi trường khác nhau. Mặc dù thử nghiệm có thể cung cấp một mức độ chắc chắn tốt về cách các truy vấn sẽ thực hiện trong từng môi trường, nhưng sẽ không có gì ngạc nhiên nếu có sự khác biệt giữa các môi trường. Khi phát triển một truy vấn mới, điều chỉnh bổ sung thường là cần thiết khi nó chuyển sang sản xuất.

Thông thường, điều chỉnh truy vấn chậm hơn trong một môi trường sẽ không gây ra hồi quy trong các kế hoạch thực hiện được tạo, do đó đây là cơ hội để điều chỉnh các chỉ mục, số liệu thống kê hoặc chính truy vấn để cải thiện tổng thể.

Lưu ý cuối cùng: môi trường thấp hơn không được khai thác quá mức và thường không được mong đợi sẽ mang lại hiệu suất tương tự như môi trường sản xuất hoặc tiền sản xuất.

Nhiêu tai nguyên hơn:


9

Các câu trả lời khác là tốt, nhưng tôi sẽ nói thêm rằng bạn nên xem xét lượng dữ liệu trong Môi trường B và bất kỳ sự tranh chấp nào với các truy vấn khác.

Một số truy vấn SQL không có vấn đề về hiệu suất trong sự cô lập (ví dụ: 1000 hàng trong bảng, không có truy vấn nào khác đang chạy), nhưng có thể là chương trình kinh dị với 10.000.000 hàng trong bảng (ví dụ: các vấn đề đánh hơi tham số) và / hoặc các truy vấn khác có khả năng ghi vào, cập nhật hoặc khóa các bảng liên quan.

Tôi đồng ý với các câu trả lời khác về việc kiểm tra phần cứng / môi trường / cấu hình khớp trước, nhưng nếu không có gì rõ ràng xuất hiện, hãy bắt đầu xem xét các kế hoạch thực hiện truy vấn, chạy SQL Profiler, v.v.


3

Nói tóm lại, bạn cần cách ly xem bản thân db có chậm so với bản kia hay môi trường của nó chậm hơn. Loại trừ những điều dễ dàng nhất đầu tiên.

Điều này đã xảy ra với tôi trong một vài dịp. Mỗi lần nó trở thành môi trường: một người khác đang chạy trốn và bỏ đói db IOPS trên một máy chủ.

Chạy một đỉnh (1) trên máy chủ chậm hơn và xem CPU có gặp nhiều trạng thái chờ hay cpu ăn cắp nếu bạn ở trong môi trường ảo.

Điều này cũng sẽ giúp chỉ ra các chỉ mục bị thiếu khiến các kế hoạch thực hiện thực hiện quét toàn bộ bảng thay vì quét chỉ mục (nhưng điều đó dễ dàng phát hiện khi ghi nhật ký truy vấn chậm). Điều này cũng sẽ hiển thị trong ps dưới dạng procs ở trạng thái D.

Khi bạn đã loại trừ điều đó, đã đến lúc đào sâu vào phần cứng: công việc đang được trải rộng trên tất cả các CPU, có một cổng mạng được tự thương lượng lại thành 100Mb. Chạy vmstat và / hoặc iostat trên cả hai máy và so sánh sự khác biệt.

Nếu các bộ dữ liệu giống hệt nhau, liệu cùng một truy vấn có tạo ra cùng một kế hoạch thực hiện trên cả hai không? Các bảng có chứa số lượng hàng giống nhau không? Các định nghĩa chỉ mục có giống nhau không? Các bảng có mức độ phân mảnh tương tự? Số lượng tương tự của các kết nối hoạt động?

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.