Sembunyikan Pilih Output dari T-SQL

13

Saya mencoba untuk mendapatkan waktu eksekusi permintaan, tetapi saya juga ingin menyembunyikan output permintaan. Saya hanya ingin waktu yang telah berlalu - tidak ada output.

Contoh

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]

Saat ini, saya mendapatkan output query dan di bagian bawah durasi saya, yang merupakan satu-satunya yang saya inginkan sejauh output berjalan. Saya belum bisa melakukan ini dan bertanya-tanya apakah ada orang lain yang mengalami masalah serupa? Ini adalah sesuatu yang ingin saya lakukan di T-SQL bukan Management Studio atau semacamnya.

Saya mencoba memantau waktu yang diperlukan untuk menjalankan pernyataan pilih dan melaporkan kembali ke server. Saya memiliki server monitor eksternal yang akan menjalankannya setiap menit dan mendapatkan waktu kembali (durasi yang diperlukan) yang akan saya gunakan dari waktu ke waktu untuk tren / baseline. Saat kueri saat ini memuntahkan hasil pilih dan durasi saya memelintirnya, dan server monitor saya menjadi bingung. Saya hanya ingin kolom durasi. Saya juga akan melakukan ini untuk menyisipkan, yang akan langsung karena tidak perlu melakukan pemilihan.

Saya mencoba melakukan ini murni di T-SQL . Saya tidak ingin menggunakan DMV karena saya ingin mendapatkan waktu yang diperlukan (snapshot) ketika saya menjalankan kueri dan memeriksa apakah ini berubah seiring waktu ketika server melewati berbagai tingkat beban karena ini akan memberi saya ide yang baik apakah waktu eksekusi permintaan berubah.

Gilliam
sumber

Jawaban:

28

Ada banyak cara berbeda untuk melakukan ini.

Saya biasanya tidak merekomendasikan memasukkan ke dalam #temptabel, karena setiap beban tempdb atau autogrowth dapat mempengaruhi hasil, dan saya pasti tidak merekomendasikan menggunakan @tablevariabel, karena modifikasi yang dipaksakan serial (tidak ada rencana paralel dapat digunakan), yang dapat mengubah waktu permintaan aktual.

Penugasan Variabel

Anda dapat mendeklarasikan variabel dan menetapkan kolom Anda ke dalamnya, seperti ini:

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]

Meskipun melakukan ini dapat mencegah beberapa optimasi penyematan parameter. Lihat Parameter Mengendus, Menanamkan, dan Opsi YANG DAPATKAN di bawah "Pembatasan Penanaman".

Perhatikan bahwa metode ini dapat memicu peringatan rencana tentang konversi tersirat, tetapi itu bukan jenis yang harus Anda khawatirkan. Lihat T&J ini sebagai latar belakang: Apa yang Memicu Peringatan Ini: Jenis Konversi dalam Ekspresi Dapat Mempengaruhi "Kardinalitas" dalam Pilihan Rencana Kueri .

Dalam SSMS

Anda dapat mengubah pengaturan untuk membuang hasil kueri.

GILA

SQL Query Stress

SQL Query Stress adalah alat sumber terbuka yang memungkinkan Anda menjalankan kueri terhadap SQL Server untuk mensimulasikan beban. Tidak ada hasil kueri yang dikembalikan ke aplikasi saat dijalankan.

Anda dapat membaca beberapa instruksi di sini .

ostress (Utilitas RML)

ostress adalah alat serupa, yang diterbitkan oleh Microsoft, yang juga tidak mengembalikan hasil kepada klien, kecuali jika Anda memilih untuk melakukannya.

Saya sudah menulis beberapa di sini .

Plan Explorer

SentryOne's Plan Explorer adalah alternatif gratis untuk melihat rencana eksekusi dan kebuntuan dengan SQL Server.

Anda juga dapat menggunakannya sebagai klien untuk meminta SQL Serve sampai tingkat tertentu:

GILA

Ini juga akan membuang hasil.

GILA

Semoga ini membantu!

Erik Darling
sumber
0

Anda dapat menjalankan kueri Anda dengan SET STATISTICS TIME ONdan menangkap pesan keluaran dengan menggunakan aplikasi pemantauan Anda di server monitor eksternal Anda.

Cara untuk menangkap pesan keluaran dengan .Net dijelaskan dalam jawaban Stack Overflow oleh AdaTheDev :

Anda bisa melakukan ini dengan menambahkan event handler ke acara InfoMessage di koneksi.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

Tidak bisakah Anda hanya menggunakan pilih awal untuk mengembalikan @End Anda?

SELECT @blob_eater = [id], @ blob_eater = [database_id], @ blob_eater = [proc_name], @ blob_eater = [exec_t] dari [DB]. [Dbo]. [STAT]

SELECT @ End = GETDATE ()

Menjadi

SELECT @ End = GETDATE () DARI [DB]. [Dbo]. [STAT]

Hanya nilai terakhir yang akan disimpan dalam variabel.

Patrick Hurst
sumber