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 ...
Nguồn
2014-08-07 14:32:57
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? –
@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
@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 ý. –