Làm cách nào để biết hiệu năng SQL Server DB của tôi bị giới hạn phần cứng?


8

Thử nghiệm một ứng dụng hiện đang tải một người dùng - vì dữ liệu thử nghiệm đã tăng lên kích thước sản xuất (400k-2M hàng trên mỗi bảng), một số sp CHỌN không còn đủ nhanh nữa (với dữ liệu thử nghiệm giới hạn, được sử dụng mỗi lần <30ms, bây giờ là 100-200ms, nhưng có một số, vì vậy độ trễ đang trở nên rõ ràng trong UI).


Nó gần như được đảm bảo là mã và thiết kế, không phải phần cứng ...
gbn

Nếu các truy vấn của bạn có thể tận dụng các Hàm phân tích, máy chủ sql 2000 chắc chắn bị giới hạn phần mềm.
bernd_k

Chà, ít nhất nó không hoàn toàn là phần cứng - Tôi đặt một phiên bản 2008 Express cạnh nhau trên máy thử nghiệm. 2000 lần vẫn trong cùng một phạm vi, 2008 lần là tất cả <20ms. Những người phục vụ dường như không làm rõ sự khác biệt. Sau khi xóa số liệu thống kê và trong một bài kiểm tra ứng dụng giống hệt nhau, năm 2000 có thời gian chờ PAGEIOLATCH_SH là 2,48 giây, trong khi chờ 4ms. Năm 2008 có 2,14 giây, avg chờ 2ms. Cái nào tốt hơn, nhưng không giải thích được sự cải thiện gấp 10 lần về thời gian phản hồi thực tế - có phải chỉ là trong những cải tiến chung của động cơ từ năm 2000 đến 2008 không được phản ánh trong các số liệu thống kê?
Pastymage

Câu trả lời:


8

Bạn có thể sử dụng DBCC SQLPERF("waitstats"). Điều này sẽ trả về thời gian chờ của những nhiệm vụ mà máy chủ SQL của bạn đang chờ. Giải thích chi tiết của từng quầy có thể được tìm thấy trực tuyến. Bạn có thể sử dụng thông tin này để tìm ra nút thắt của bạn.

Ngoài ra, bật thống kê máy khách trong bộ phân tích truy vấn để xem thời gian chờ ở phía máy khách.

Tôi cho rằng phần cứng của bạn đã không thay đổi kể từ lần thử nghiệm đầu tiên của bạn, vì vậy vì chúng không đổi, tôi sẽ không nghi ngờ gì về chúng.


Tôi đã lấy một vài truy vấn để đặt hàng và lọc thông tin liên quan từ các nhân viên phục vụ và nó không cho tôi biết nhiều (xem nhận xét của tôi về mục gốc).
Pastymage

@Pastymage cũng thử chạy sp_updatestats trong SQL 2000 DB của bạn. Họ thử lại truy vấn và xem có cải thiện hiệu suất nào không.
StanleyJohns

Không, chính xác như vậy. Ditto cho cập nhật DBCC.
Pastymage

2

Suy nghĩ:

  • phần cứng hầu như không bao giờ là vấn đề: đó là thiết kế và mã kém
  • luôn luôn kiểm tra với chất lượng và số lượng dữ liệu gần sản xuất

Một số giải pháp:

Chạy chỉ mục DMV bị thiếu để xem, tốt, chỉ mục bị thiếu:

SELECT 
  migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure, 
  'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) 
  + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']'
  + ' ON ' + mid.statement 
  + ' (' + ISNULL (mid.equality_columns,'') 
    + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END 
    + ISNULL (mid.inequality_columns, '')
  + ')' 
  + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement, 
  migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

... và các truy vấn DMV đắt nhất

SELECT TOP 20
    qs.sql_handle,
    qs.execution_count,
    qs.total_worker_time AS Total_CPU,
    total_CPU_inSeconds = --Converted from microseconds
    qs.total_worker_time/1000000,
    average_CPU_inSeconds = --Converted from microseconds
    (qs.total_worker_time/1000000) / qs.execution_count,
    qs.total_elapsed_time,
    total_elapsed_time_inSeconds = --Converted from microseconds
    qs.total_elapsed_time/1000000,
    st.text,
    qp.query_plan
FROM
    sys.dm_exec_query_stats AS qs
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
        CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY qs.total_worker_time DESC

Mặt khác, câu hỏi SO này có các mẹo hay từ tôi và các loại đại diện SQL khác: https://stackoverflow.com/q/4118156/27535 (Tôi sẽ không sao chép / dán cả 3 câu trả lời dài)


Những DMV đó rất tuyệt vời cho năm
2005+

@SqlSandwiches: Rất tiếc, đã bỏ lỡ điều đó.
gbn

Đã thử điều này trong phiên bản Express 2008 mà tôi đã thiết lập - dm_exec_query_stats dường như không có mặt?
Pastymage

1

Ghi nhật ký tài nguyên hệ thống hoặc nhìn vào trình quản lý tác vụ để xem có bao nhiêu tài nguyên hệ thống được sử dụng bởi các quy trình.


1

Điều thú vị cần được xem xét là phiên bản MSSQL 2000 đang chạy

Có bốn phiên bản nhị phân

  1. bày tỏ
  2. Tiêu chuẩn
  3. Chuyên nghiệp
  4. Doanh nghiệp

Mỗi phiên bản có giới hạn về RAM và CPU.

Điều đáng để khám phá là khả năng lượng dữ liệu hiện được lưu trữ đã vượt quá khả năng của phiên bản MSSQL 2000 do các truy vấn cần thêm RAM để truy vấn / truy vấn phụ hoặc sử dụng CPU không đủ. Bạn có thể yêu cầu nâng cấp phiên bản nhị phân lên phiên bản MSSQL 2000 Entrprise (có thể là một cú đánh dài vì phiên bản MSSQL của bạn bao nhiêu tuổi) hoặc phiên bản tốt nhất mà ngân sách của bạn có thể chi trả.

Bạn thậm chí có thể muốn thoát khỏi MSSQL 2000 vì năm 2008 là lần mới nhất và có hỗ trợ hiện tại. Một lần nữa, đây có thể là một vấn đề ngân sách. Nếu bạn đã sử dụng Enterprise hoặc ngân sách của bạn không thể cho phép bất kỳ nâng cấp lớn nào, bây giờ bạn có thể khám phá DB Statistics hoặc DB Design.

Tuyên bố miễn trừ trách nhiệm: Tôi không phải là DBA của SQL Server


Nâng cấp lên 2008 dường như là một sửa chữa nhanh chóng, bởi vì ngay cả 2008 Express với giới hạn RAM 1 CPU 1 GB đã giải quyết hoàn toàn vấn đề. Tuy nhiên, tôi muốn hiểu tại sao / làm thế nào ...
Pastymage
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.