MS SQL Server chậm lại theo thời gian?


8

Có bất kỳ ai trong số bạn có kinh nghiệm sau đây, và bạn đã tìm thấy một giải pháp:

Một phần lớn của back-end trang web của chúng tôi là MS SQL Server 2005. Mỗi tuần hoặc hai tuần trang web bắt đầu chạy chậm hơn - và tôi thấy các truy vấn mất nhiều thời gian hơn và lâu hơn để hoàn thành trong SQL. Tôi có một truy vấn mà tôi muốn sử dụng:

USE master
select text,wait_time,blocking_session_id AS "Block",
percent_complete, * from sys.dm_exec_requests 
CROSS APPLY sys.dm_exec_sql_text(sql_handle)  AS s2 order by start_time asc

Điều này khá hữu ích ... nó cung cấp một ảnh chụp nhanh tất cả mọi thứ đang chạy ngay tại thời điểm đó đối với máy chủ SQL của bạn. Điều tuyệt vời là ngay cả khi CPU của bạn được chốt ở mức 100% vì một số lý do và Activity Monitor không chịu tải (Tôi chắc chắn một số bạn đã ở đó) truy vấn này vẫn trả về và bạn có thể thấy truy vấn nào đang giết DB của bạn.

Khi tôi chạy cái này hoặc Trình giám sát hoạt động trong thời gian SQL bắt đầu chạy chậm, tôi không thấy bất kỳ truy vấn cụ thể nào gây ra sự cố - chúng TẤT CẢ chạy chậm hơn trên bảng. Nếu tôi khởi động lại Dịch vụ MS SQL thì mọi thứ đều ổn, nó sẽ tăng tốc - trong một hoặc hai tuần cho đến khi nó xảy ra lần nữa.

Không có gì tôi có thể nghĩ đã thay đổi, nhưng điều này mới chỉ bắt đầu vài tháng trước ... Ý tưởng?

--Thêm

Xin lưu ý rằng khi cơ sở dữ liệu này chậm xảy ra, không có vấn đề gì nếu chúng ta nhận được 100 nghìn lượt xem trang một giờ (thời gian bận rộn hơn trong ngày) hoặc 10 nghìn lượt xem trang một giờ (thời gian chậm) tất cả các truy vấn mất nhiều thời gian hơn bình thường. Máy chủ không thực sự bị căng thẳng - CPU không cao, việc sử dụng đĩa dường như không thể kiểm soát được ... nó có cảm giác như bị phân mảnh chỉ mục hoặc một cái gì đó tương tự nhưng dường như không phải là trường hợp

Theo như kết quả dán của truy vấn tôi đã dán ở trên, tôi thực sự không thể làm điều đó. Truy vấn trên liệt kê thông tin đăng nhập của người dùng thực hiện tác vụ, toàn bộ truy vấn, v.v. và tôi thực sự không muốn đưa ra tên của cơ sở dữ liệu, bảng, cột và thông tin đăng nhập trực tuyến của mình :) ... Tôi có thể cho bạn biết rằng các truy vấn đang chạy tại thời điểm đó là bình thường, các truy vấn tiêu chuẩn cho trang web của chúng tôi chạy mọi lúc, không có gì ngoài định mức.

- Ngày 24

Đã khoảng hai tuần kể từ lần khởi động lại cuối cùng. Tôi đã thực hiện một số thay đổi: Tôi đã tìm thấy một vài truy vấn trong đó chúng tôi đang sử dụng rất nhiều bảng tạm thời hoàn toàn không cần thiết và các nhà phát triển của chúng tôi thay đổi cách họ thực hiện nó. Tôi đã điều chỉnh kích thước của một số cơ sở dữ liệu đang phát triển liên tục (chậm nhưng chắc chắn) thành kích thước thông minh cho sự phát triển của chúng. Tôi đã điều chỉnh cài đặt tự động phát triển để mọi thứ trở nên thông minh hơn (chúng được đặt TẤT CẢ để tăng trưởng 1MB). Cuối cùng tôi đã dọn sạch MSDB một chút. Chúng tôi đăng nhập vận chuyển và thực sự không cần phải giữ các điểm dự phòng hàng năm và hàng năm, tôi đã viết một số tập lệnh giữ điều này chỉ trong một vài tháng. Tôi sẽ tiếp tục cập nhật chủ đề này, vì còn quá sớm để biết vấn đề đã được giải quyết chưa.


Nếu bạn chạy các truy vấn tương tự thông qua Management Studio, bạn có thấy các vấn đề về hiệu suất tương tự như khi chúng được chạy qua ứng dụng không? Điều gì làm cho sự xuống cấp hiệu suất dừng lại hoặc biến mất? Bạn có khởi động lại máy chủ không? Đây là máy chủ vật lý hay máy ảo? Nó có bộ lưu trữ riêng hay nó là một phần của SAN?
DCNYAM

Lưu trữ đính kèm mạng, chính xác là MD 3000. Khởi động lại dịch vụ SQL làm cho nó biến mất. Có bạn thấy thời gian phản hồi chậm hơn từ studio trong thời gian đó.
Dave Holland

Câu trả lời:


3

Chúng tôi đã tìm thấy nó. Hóa ra đó thực sự là một máy chủ web có vấn đề với một trong các nhóm ứng dụng của nó. Nó sẽ bị kẹt khi chạy cùng một tập các truy vấn (điều này xảy ra để xử lý các bảng tạm thời). Nó sẽ chỉ lặp và lặp và cuối cùng làm cho máy chủ SQL buồn. Khi nhóm máy / ứng dụng vi phạm này được tìm thấy và 'đặt xuống', mọi thứ đã được giải quyết.


2

Bạn phải tự hỏi, điều gì xảy ra khi khởi động lại dịch vụ SQL? Rất nhiều thứ, nhưng hai điểm liên quan xuất hiện trong tâm trí:

1) Bộ nhớ SQL được giải phóng.

có thể (không chắc chắn như thế nào khả năng), nếu thiết lập MaxMemory của bạn được đặt quá cao, mà các dịch vụ SQL phát triển để sử dụng tất cả các bộ nhớ có sẵn, và Windows khởi động để trao đổi những thứ quan trọng ra các tập tin hoán đổi. Kiểm tra để đảm bảo rằng MaxMemory được đặt thành một giá trị hợp lý, để lại đủ bộ nhớ bổ sung cho bất kỳ thứ gì khác cần chạy trên hộp đó (nó có phải là máy chủ SQL chuyên dụng không? Hay đó cũng là máy chủ ứng dụng?)

2) TempDB được xây dựng lại từ các kích thước mặc định.

Kiểm tra kích thước tệp tempdb mặc định của bạn, đặc biệt là kích thước mặc định và khoảng thời gian tăng trưởng của tệp Nhật ký TempDB. Nếu khoảng thời gian tăng trưởng được đặt quá THẤP, thì nhật ký có thể tạo ra một số phân mảnh nội bộ đáng kinh ngạc, có thể làm chậm đáng kể việc sử dụng bình thường. Xem những hai bài viết trên blog tuyệt vời bởi Kimberly Tripp.


1) Máy là một máy chủ SQL chuyên dụng có bộ nhớ 16GB, với 14GB được phân bổ cho SQL. 2) Tôi đã không phải khởi động lại kể từ khi tôi thực hiện một số điều chỉnh về kích thước và tăng trưởng DB. Bảng tạm thời được bao gồm trong các điều chỉnh tôi đã thực hiện để có thể nó có một số tác động. Chỉ mới vài tuần thôi nên tôi đang chờ xem liệu tình hình có xảy ra nữa không.
Dave Holland

1

Bạn có sử dụng nhiều bảng tạm thời hoặc con trỏ không? Kiểm tra bất kỳ con trỏ đang được đóng và giải quyết chính xác. Ngoài ra, hãy coi chừng các máy chủ được liên kết - chúng tôi phải sử dụng trình điều khiển lỗi cho máy chủ Informix được liên kết cũ và định kỳ có nghĩa là chúng tôi phải khởi động lại máy chủ.


Chúng tôi sử dụng khá một vài cuộc gọi bảng temp, con trỏ tôi hy vọng chúng ta không sử dụng quá thường xuyên nhưng tôi cho rằng nó có thể biết một số cũ mã hóa "tiêu chuẩn" của chúng tôi vì vậy tôi sẽ nhìn vào đó. Chúng tôi đang sử dụng các máy chủ được liên kết, tuy nhiên chỉ có một và một DB năm 2005 khác.
Dave Holland

0

Nếu nó có vẻ kỳ lạ thì hãy tìm những thứ kỳ lạ.

Nếu điều chỉnh cài đặt máy chủ sql không giúp thử trình quản lý tác vụ windows: đi tới tab quy trình, sau đó tùy chọn> cột> thêm thời gian cpu, xử lý, đọc, ghi, khác và các tùy chọn bộ nhớ.

Quay trở lại danh sách quy trình. Đối với mỗi cột sắp xếp theo cao nhất đến thấp nhất và nhìn vào 5 quy trình hàng đầu. Bất cứ điều gì khác thường? ví dụ: rò rỉ bộ nhớ trên một tiến trình sẽ có số lượng tay cầm kỳ quái. Chúng tôi có một số máy in * ki có thêm tay cầm cho quy trình DCSLoader cứ sau 2 giây. Sau một vài tuần, một máy liệt kê rất nhiều bộ nhớ và cpu miễn phí, nhưng một quá trình với 100.000 tay cầm và sẽ hầu như không di chuyển con trỏ chuột.

Kiểm tra danh sách nhiệm vụ theo lịch trình của bạn quá. Nói với AV của bạn không quét các tập tin .mdf.


Vâng, tôi đã làm tất cả những điều đó, không có gì trong danh sách quy trình là khác thường và như tôi đã nói tôi không khởi động lại máy .. chỉ khởi động lại dịch vụ SQL và vấn đề được giải quyết nên không chắc là tôi sẽ đi để tìm vấn đề bên ngoài các quy trình SQL Server. Nhìn vào tay cầm là một ý kiến ​​hay, tôi sẽ kiểm tra lần sau.
Dave Holland

0

Dave,

Bạn đã kiểm tra số liệu thống kê chờ? truy vấn bạn đưa ra ở trên liệt kê cột 'last_wait_type'. cột đó có thể có một số chi tiết liên quan đến những gì các truy vấn đang chờ (mạng, cpu, v.v.)


Tôi không có, nhưng tôi nên. Tôi sẽ kiểm tra xem lần sau điều này xảy ra.
Dave Holland

0

Nếu "Mô hình khôi phục" sao lưu của bạn là ĐẦY ĐỦ, thì việc sao lưu DB và sau đó sao lưu nhật ký giao dịch có cải thiện mọi thứ không? Trên một hệ thống sắp hết dung lượng đĩa, loại điều này có thể giải thích vấn đề.


Tất cả các DB được ghi lại được vận chuyển cứ sau 15 phút - điều đó có nghĩa là các bản ghi của db và trans được sao lưu liên tục, vì vậy đó không phải là vấn đề .... tất cả chúng đều chạy trên md3K với khoảng một terabyte dung lượng trống.
Dave Holland

tốt để biết sử dụng phương thức nào để máy khách SQL của bạn kết nối với máy chủ SQL? vẫn còn rất nhiều câu hỏi Là máy chủ 64-bit?
djangofan

Các máy khách là các trang web .net (toolbox.com) và có 64 bit.
Dave Holland

vậy, các máy khách .net của bạn có sử dụng trình điều khiển jdbc2.x không và chúng có sử dụng auth tích hợp hay không?
djangofan

0

Tôi dường như có một cấu hình rất giống với cấu hình của bạn (16Gb, được nâng cấp lên 32Gb và MD1000 với một terabyte của đĩa, xe bốn bánh kép).

Điều duy nhất đã giúp tôi chẩn đoán những vấn đề kỳ quái như thế trong quá khứ là beta_lockinfo của Erland Sommarskog. Chạy nó khi nó chậm thời gian và so sánh.

Ngoài ra, tôi đã có một số vấn đề điên rồ với SQL 2005 trước SP2, nhưng SP3 thực sự ổn định.


Thật ra, tôi chỉ nhớ. Hãy thử sử dụng "Khóa trang trong bộ nhớ". Với CU4 cho SP3, ngay cả SQL 2005 Standard cũng có thể sử dụng nó. Xem blog.msdn.com/suhde/archive/2009/05/20/ từ
Ricardo Pardini

0

Hy vọng điều này cung cấp thêm thông tin hữu ích:

SELECT  D.text SQLStatement,
        A.Session_ID SPID,
        C.BlkBy,
        ISNULL(B.status, A.status) Status,
        A.login_name Login,
        A.host_name HostName,
        DB_NAME(B.Database_ID) DBName,
        B.command,
        ISNULL(B.cpu_time, A.cpu_time) CPUTime,
        ISNULL((B.reads + B.writes), (A.reads + A.writes)) DiskIO,
        A.last_request_start_time LastBatch,
        A.program_name
FROM    sys.dm_exec_sessions A
        LEFT JOIN sys.dm_exec_requests B
        ON A.session_id = B.session_id
        LEFT JOIN (
                   SELECT   A.request_session_id SPID,
                            B.blocking_session_id BlkBy
                   FROM     sys.dm_tran_locks AS A
                            INNER JOIN sys.dm_os_waiting_tasks AS B
                            ON A.lock_owner_address = B.resource_address
                  ) C
        ON A.Session_ID = C.SPID
        OUTER APPLY sys.dm_exec_sql_text(sql_handle) D
WHERE   DB_NAME(B.Database_ID) = 'YourDBName' -- Comment out line for all db's
ORDER BY ISNULL(B.cpu_time, A.cpu_time) + ISNULL((B.reads + B.writes), (A.reads + A.writes)) DESC

Hãy chắc chắn rằng db vẫn ổn với:

DBCC CHECKDB -- Checks the allocation and structural integrity of all the objects in the specified database.
DBCC UPDATEUSAGE (bybox) -- Reports and corrects pages and row count inaccuracies in the catalog views

Theo dõi logspace với:

DBCC SQLPERF(LOGSPACE)

Nếu bạn thấy việc mở rộng đang diễn ra, điều đó chắc chắn sẽ làm mọi thứ chậm lại. Nếu bạn chạy cái này, bạn sẽ thấy không gian log của bạn gần hơn và gần hơn 100%, sau đó nhật ký sẽ mở rộng và tỷ lệ phần trăm sẽ co lại khi nó có một khoảng trống. Hy vọng rằng bạn sẽ không bao giờ thấy nó mở rộng trước khi bản sao lưu của bạn khởi động và xóa nhật ký.


Khi tôi chạy truy vấn đầu tiên, tôi không nhận được bất kỳ kết quả nào - chủ yếu là vì thực sự không có phiên nào xảy ra trong những khoảng thời gian chậm chạp này ... nói chung là tất cả các truy vấn đều chạy chậm hơn. Tôi đã chạy qua tất cả các kiểm tra và cập nhật của DBCC và chúng có vẻ tốt. Theo như DBCC SQLPERF (LOGSPACE) DB duy nhất thậm chí gần 100% (ở mức 75%) là mô hình và nó không bao giờ thay đổi đáng kể, các bản sao lưu tàu log đang quan tâm đến kích thước nhật ký.
Dave Holland

-1

Chủ yếu là cấu hình ngốc. Xảy ra.

  • Đầu tiên, bạn thực sự nên thường xuyên chạy phân mảnh chỉ mục trong một lần bảo trì. Lên lịch cho nó như một hoạt động, ngay trước hoặc sau khi bạn thực hiện sao lưu.

  • Thứ hai, không tự động điền cơ sở dữ liệu của bạn và đặc biệt không tự động thu thập nó. Tùy thuộc vào tải autogrow / autoshrink về cơ bản là các cài đặt tự sát.

Không thấy SQL Server chậm như vậy bao giờ. Bạn có thể đăng kết quả của truy vấn đó trong thời gian căng thẳng hugh không? Chắc chắn không có gì cuối cùng của bạn làm quá tải SQL Server tại thời điểm đó?


Đến điểm đầu tiên của bạn: Chúng tôi có các công việc bảo trì hàng tuần (và một số hàng ngày tùy thuộc vào bảng) chỉ số chống phân mảnh và cập nhật số liệu thống kê. Nếu bạn lấy lại thông tin trong các chỉ mục, ngay cả khi nó chậm, chúng vẫn bị phân mảnh ít hơn 2-3%. Đến điểm thứ hai của bạn: Chúng tôi không tự động thu nhỏ - chắc chắn. Các cơ sở dữ liệu này chứa thông tin người dùng / nội dung trang web, v.v ... không ngừng tăng lên (không phải một tấn ... đây không phải là cơ sở dữ liệu khổng lồ) nhưng nếu tôi không để chúng tự động thì làm sao chúng đủ lớn? Tôi sẽ thêm một số chi tiết vào cuối bài viết của tôi để giải quyết phần cuối của những gì bạn nói.
Dave Holland

3
Autogrow không thực sự là một điều xấu. Dựa vào nó, nhưng kích hoạt nó tốt hơn rất nhiều so với tất cả các thay đổi đối với cơ sở dữ liệu của bạn bị dừng vì nó ở kích thước tối đa.
Sean Howat

2
Tăng trưởng theo tỷ lệ phần trăm thường không phải là một điều tốt. Khi cơ sở dữ liệu của bạn trở nên lớn, mức tăng trưởng 5% sẽ lớn hơn nhiều so với khi cơ sở dữ liệu bắt đầu. 1 MB là quá nhỏ, nhưng bạn nên quyết định tốc độ tăng trưởng MB cố định dựa trên kích thước và mức độ sử dụng cơ sở dữ liệu của bạn.
DCNYAM

1
Autogrow là xấu vì nó phân cụm tệp với nhật ký gia số nhỏ. Có rất nhiều hàm ý tiêu cực. support.microsoft.com/kb/315512 Thay vào đó: đặt các tệp ở kích thước phù hợp, sau đó chạy kiểm tra thường xuyên với báo cáo điền. Hãy chắc chắn rằng họ không phát triển quá mức. 1mb có thể là thủ phạm có thể xảy ra, btw ... nếu nó phải dừng / tăng / dừng / tăng trong khi bảo trì, bạn không muốn biết hiệu suất.
TomTom

1
Autogrow là vô hại miễn là nó hiếm khi xảy ra. Khi nó trở nên tồi tệ là khi nó được sử dụng thay thế cho kích thước phù hợp, điều mà tôi nghi ngờ là TomTom thực sự có nghĩa là gì. Mặt khác bằng mọi cách sử dụng nó.
Maximus Minimus
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.