2011-08-16 60 views
7

Tôi đang thực hiện một thủ tục được lưu trữ bằng cách sử dụng SQL Server Agent Job trong SQL Server 2005.Tác nhân SQL Server Agent Chạy chậm

Công việc này đã chạy nhanh cho đến ngày hôm qua. Kể từ hôm qua, công việc này mất hơn 1 giờ thay vì 2 phút.

Tôi đã thực hiện quy trình được lưu trữ trong SSMS, chỉ mất chưa đầy 1 phút để thực thi.

Tôi không thể tìm ra lý do tại sao phải mất hơn 1 giờ khi được thực thi dưới dạng tác vụ Đại lý máy chủ SQL?

+1

Nếu bạn thực thi cùng một SP trong SSMS và nó hoạt động, có thể một cài đặt của Công việc đã thay đổi, ví dụ: nó được thực thi trên databse sai. Nếu không, hãy kiểm tra Hoạt động Giám sát tác nhân đang làm gì hoặc bắt đầu một dấu vết để nhận các lệnh được thực hiện. có thể có vấn đề về khóa. Vấn đề vẫn xảy ra nếu bạn tự thực hiện công việc? –

+0

@Bernhard, Cảm ơn bạn đã phản hồi. Tôi đã kiểm tra công việc và tạo lại nó. Vẫn còn cùng một vấn đề. Có nếu tôi tự thực hiện công việc vẫn mất rất nhiều thời gian – Prateek

+0

@Preteek bạn có thể đăng các cài đặt của công việc không? Lý do duy nhất cho hành vi này tôi có thể nghĩ đến, là một sự thực thi khác nhau của SP. Vì các tham số vv giống như khi được thực hiện bằng tay, nên SQLServer nên sử dụng cùng một kế hoạch thực hiện, vv có lẽ bạn có thể xem Nhật ký SQL - có thể điều này sẽ cho chúng ta một gợi ý. –

Trả lời

4

Sau một thời gian cho ý kiến ​​và giả định rằng các SP thực hiện với các thông số đầu vào tương tự và dữ liệu tốt khi thực hiện trong SSMS, tôi finnaly nghĩ tôi có thể cung cấp cho một mẹo cuối cùng:

Tùy thuộc vào những hành động được thực hiện trong phạm vi SP (ví dụ: chèn/cập nhật/xóa nhiều dữ liệu trong vòng lặp hoặc con trỏ), bạn nên đặt nocount ở đầu mã của mình.

set nocount on 

Nếu đây không phải là trường hợp hay không giúp đỡ, xin vui lòng bổ sung thêm thông tin, đã được đề cập trong các ý kiến ​​(ví dụ như tất cả các thiết lập của công việc và mỗi Jobstep, những gì đã được ghi lại, những gì có trong Jobhistory, kiểm tra SQLerrorlog, eventlog, ....). Ngoài ra hãy xem "Nhật ký Máy chủ SQL" có thể bạn có thể thu thập một số thông tin tại đây. Ngoài ra một cái nhìn vào Applicationlo System/Systemlo của Databaseserver luôn luôn là một ý tưởng tốt. Để có được một cái nhìn tổng quan cơ bản, bạn có thể sử dụng Activitymonitor trong SSMS, bằng cách chọn Databaseserver và chọn "Activity monitor" từ contextmenu và tìm kiếm tác nhân sql.

Lần thử cuối cùng của tôi là thử chạy theo dõi sql cho tác nhân. Trong trường hợp này, bạn sẽ bắt đầu một dấu vết và bộ lọc, ví dụ: bởi người dùng rằng dịch vụ SQLAgent chạy. Có rất nhiều tùy chọn bạn có thể đặt cho các dấu vết, vì vậy tôi muốn giới thiệu cho google cho nó, tìm kiếm trên MSDN hoặc đặt một câu hỏi khác ở đây trên stackoverflow.

+0

"SET NOCOUNT ON" đã thực hiện thủ thuật cho tôi. –

2

Tôi nhận thấy rằng tác vụ SQL Agent bỏ qua cài đặt MAXDOP của máy chủ và chạy mọi thứ với MAXDOP của 1. Nếu tôi chạy một thủ tục được lưu trữ trong cửa sổ truy vấn, nó tuân theo cài đặt máy chủ và sử dụng 4 quy trình. Nếu tôi sử dụng SQL Agent, bất kỳ thủ tục lưu sẵn nào mà tôi chạy chỉ sử dụng một quy trình.

1

Tôi gặp sự cố tương tự với tập lệnh gọi một số UDF mà tôi đã tạo. Bản thân UDF thường chạy dưới giây dưới SSMS. Tương tự như vậy, việc chạy các báo cáo tôi tạo ra với chúng có thể chịu được dưới SSMS (dữ liệu 30d trong 8 giây, dữ liệu 365d trong 22 giây). Tôi luôn thực hiện NOCOUNT ON với các tác vụ SQL Agent vì chúng thường tạo ra các tệp văn bản cho các quy trình khác hoặc Excel và tôi không muốn thêm dữ liệu ở cuối, vì vậy nó không phải là giải pháp cho tôi.

Trong trường hợp này, khi chúng tôi chạy cùng một tập lệnh chính xác trong Tác nhân SQL dưới dạng công việc, thời gian của tôi tăng theo cấp số nhân. Kịch bản 8s của tôi mất 2 phút 30 giây và tập lệnh 22 của tôi mất 2h20m. Điều này là giống nhau cho dù tôi chạy vào giữa trưa với hoạt động và công việc của người dùng khác hoặc sau giờ làm việc không có hoạt động của người dùng, cũng không phải công việc hoặc sao lưu đang chạy. Máy chủ của chúng tôi là nhàn rỗi và tốt nhất tôi nhận được một trong 8 lõi được sử dụng khi chạy. DB chỉ khoảng 10GB chạy trên SSD với một thẻ RAID được lưu trong bộ nhớ cache và 16 trong số 32GB RAM là miễn phí. Kể từ khi SQL của tôi chạy hiệu quả trong SSMS, tôi khá tốt của niềm tin rằng tôi đang nhấn một giới hạn luồng của một số loại. Tôi đã nghiên cứu và thử điều chỉnh MAXDOP ngay trước các kịch bản trong SQL Agent mà không có may mắn.

Vì đây là hoạt động tôi muốn lên lịch, nên cần phải tự động hóa theo cách này hay cách khác. Tôi có thể để các kịch bản này mất nhiều giờ mà họ cần để chạy như các bước SQL trong các công việc của SQL Agent, nhưng tôi quyết định chạy từ dòng lệnh thay vào đó và tôi nhận được cùng một hiệu suất mà tôi thấy trong SSMS.

sqlcmd -S SQLSRVRHost -i "C:\My Script Loc With Spaces.sql" -v MyVar="VarValue" >"C:\MyOutputFile.txt" 

Vì vậy, tôi đã tạo tập lệnh theo lô với công việc SQL chạy từ sqlcmd. Sau đó, tôi chạy tập lệnh batch từ một tác vụ SQL Agent, vì vậy tôi vẫn có cùng một quản lý và kiểm soát tại chỗ. 4 công việc SQL của tôi đã mất hơn 3 giờ để chạy hoàn thành trong 1 phút và một vài giây từ một tập lệnh batch được thực thi bởi SQL Agent.

Tôi hy vọng điều này sẽ giúp ...

1

Chúng tôi có một proc lớn chạy trong 88 giây trong SSMS và 30-45 phút trong SQL Server Agent. Tôi đã thêm dbo. tiền tố trên tất cả các tên bảng và bây giờ nó chạy nhanh như SSMS.

Các vấn đề liên quan