Ẩn Chọn đầu ra từ T-SQL


13

Tôi đang cố gắng để có được thời gian thực hiện truy vấn, nhưng tôi cũng muốn ẩn đầu ra truy vấn. Tôi chỉ muốn thời gian trôi qua - không có đầu ra.

Thí dụ

DECLARE @Start datetime
DECLARE @End datetime

SELECT @StartTimeWA=GETDATE() 

SELECT 
       [id] 
      ,[database_id]
      ,[proc_name]
      ,[exec_t] from
  [DB].[dbo].[STAT] 

SELECT @End=GETDATE()

SELECT DATEDIFF(MS,@Start,@End) AS [Duration]

Hiện tại, tôi nhận được đầu ra truy vấn ở dưới cùng thời lượng của tôi, đó là điều duy nhất tôi muốn cho đến khi đầu ra đi. Tôi đã không thể làm điều này và tự hỏi liệu có ai khác gặp phải vấn đề tương tự không? Đây là điều tôi muốn làm trong T-SQL chứ không phải Management Studio hay bất cứ điều gì tương tự.

Tôi đang cố gắng theo dõi thời gian cần thiết để chạy câu lệnh chọn và báo cáo lại cho máy chủ. Tôi có một máy chủ giám sát bên ngoài sẽ chạy mỗi phút và lấy lại thời gian (thời gian cần thiết) mà tôi sẽ sử dụng theo thời gian để xu hướng / đường cơ sở. Khi truy vấn hiện tại xuất ra các kết quả được chọn và thời lượng của tôi, nó sẽ làm lệch nó và máy chủ màn hình của tôi bị lẫn lộn. Tôi chỉ muốn cột thời lượng. Tôi cũng sẽ làm điều này để chèn, điều này sẽ đơn giản vì nó sẽ không cần phải thực hiện một lựa chọn.

Tôi đang cố gắng làm điều này hoàn toàn trong T-SQL . Tôi không muốn sử dụng DMV vì tôi muốn có được thời gian (ảnh chụp nhanh) khi tôi chạy truy vấn và kiểm tra xem điều này có thay đổi theo thời gian khi máy chủ trải qua các mức tải khác nhau không vì điều này sẽ cho tôi một ý tưởng hay như liệu thời gian thực hiện truy vấn thay đổi.

Câu trả lời:


28

Có rất nhiều cách khác nhau để làm điều này.

Tôi thường không khuyên bạn nên chèn vào #tempbảng, vì bất kỳ tải tempdb hoặc tự động tăng tốc nào cũng có thể ảnh hưởng đến kết quả và tôi chắc chắn không khuyên bạn nên sử dụng một @tablebiến, vì các sửa đổi đối với các chuỗi đó là bắt buộc (không thể sử dụng kế hoạch song song) có thể thay đổi thời gian truy vấn thực tế.

Bài tập biến

Bạn có thể khai báo một biến và gán các cột của bạn cho nó, như thế này:

DECLARE @Start datetime
DECLARE @End datetime
DECLARE @blob_eater SQL_VARIANT;

SELECT @StartTimeWA=GETDATE() 

SELECT 
       @blob_eater = [id] 
      ,@blob_eater = [database_id]
      ,@blob_eater = [proc_name]
      ,@blob_eater = [exec_t] from
  [DB].[dbo].[STAT] 

SELECT @End=GETDATE()

SELECT DATEDIFF(MS,@Start,@End) AS [Duration]

Mặc dù làm điều này có thể ngăn chặn một số tham số nhúng tối ưu hóa. Xem Thông số Đánh hơi, Nhúng và Tùy chọn RECOMPILE trong phần "Hạn chế nhúng".

Lưu ý rằng phương pháp này có thể kích hoạt các cảnh báo kế hoạch về chuyển đổi ngầm, nhưng chúng không phải là loại bạn phải lo lắng. Xem phần Hỏi & Đáp này để biết thông tin cơ bản: Điều gì kích hoạt Cảnh báo này: Chuyển đổi loại trong biểu hiện có thể ảnh hưởng đến CardinalityEstimate Cá trong lựa chọn kế hoạch truy vấn .

Trong SSMS

Bạn có thể thay đổi cài đặt để loại bỏ kết quả truy vấn.

QUẢ HẠCH

Căng thẳng truy vấn SQL

Căng thẳng truy vấn SQL là một công cụ nguồn mở cho phép bạn chạy các truy vấn đối với Máy chủ SQL để mô phỏng tải. Không có kết quả truy vấn nào được trả về ứng dụng khi chúng chạy.

Bạn có thể đọc một số hướng dẫn về nó ở đây .

địa chỉ (tiện ích RML)

Ostress là một công cụ tương tự, được xuất bản bởi Microsoft, cũng không trả lại kết quả cho khách hàng, trừ khi bạn chọn làm điều đó.

Tôi đã viết một số về nó ở đây .

Kế hoạch thám hiểm

Plan Explorer của SentryOne là một giải pháp thay thế miễn phí để xem các kế hoạch thực thi và bế tắc của SQL Server.

Bạn cũng có thể sử dụng nó như một ứng dụng khách để truy vấn SQL Phục vụ ở một mức độ nào đó:

QUẢ HẠCH

Điều này cũng sẽ loại bỏ kết quả.

QUẢ HẠCH

Hi vọng điêu nay co ich!


0

Bạn có thể thực hiện truy vấn của mình với SET STATISTICS TIME ONvà nắm bắt thông điệp đầu ra bằng cách sử dụng ứng dụng giám sát của bạn trên máy chủ giám sát bên ngoài.

Một cách để nắm bắt thông điệp đầu ra với .Net được giải thích trong câu trả lời Stack Overflow này của AdaTheDev :

Bạn có thể làm điều này bằng cách thêm một trình xử lý sự kiện vào sự kiện InfoMessage trên kết nối.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}

0

Bạn có thể không chỉ sử dụng lựa chọn ban đầu để trả về @End của mình không?

CHỌN @blob_eater = [id], @ blob_eater = [cơ sở dữ liệu], @ blob_eater = [Proc_name], @ blob_eater = [exec_t] từ [DB]. [Dbo]. [STAT]

CHỌN @ Kết thúc = GETDATE ()

Trở thành

CHỌN @ End = GETDATE () TỪ [DB]. [Dbo]. [STAT]

Chỉ giá trị cuối cùng sẽ được lưu trữ trong biến.

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.