Ukryj Wybierz dane wyjściowe z T-SQL

13

Próbuję uzyskać czas wykonania zapytania, ale chcę również ukryć wynik zapytania. Chcę tylko upływu czasu - brak danych wyjściowych.

Przykład

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]

W tej chwili otrzymuję dane wyjściowe zapytania, a na dole mój czas trwania, co jest jedyną rzeczą, której chcę, jeśli chodzi o dane wyjściowe. Nie byłem w stanie tego zrobić i zastanawiam się, czy ktokolwiek napotkał podobne problemy? To jest coś, co chcę zrobić w T-SQL, a nie Management Studio lub coś podobnego.

Próbuję monitorować czas potrzebny na uruchomienie instrukcji select i zgłoszenie do serwera. Mam zewnętrzny serwer monitorowania, który będzie działał co minutę i odzyskał czas (czas trwania), który wykorzystam z czasem do trendu / linii bazowej. Gdy bieżące zapytanie wyrzuca wybrane wyniki, a mój czas trwania wypacza je, a mój serwer monitorowania się myli. Chciałem tylko kolumny czasu trwania. Zrobię to również dla wstawek, które będą proste, ponieważ nie będą musiały wykonywać wyboru.

Próbuję to zrobić wyłącznie w języku T-SQL . Nie chcę używać DMV, ponieważ chcę uzyskać czas (migawkę) podczas uruchamiania zapytania i sprawdzam, czy zmienia się to w czasie, gdy serwer przechodzi przez różne poziomy obciążenia, ponieważ da mi to dobry pomysł co do zmiany czasu wykonania zapytania.

Gilliam
źródło

Odpowiedzi:

28

Można to zrobić na wiele różnych sposobów.

Zwykle nie zalecam wstawiania do #temptabeli, ponieważ każde obciążenie tempdb lub autogrowth może mieć wpływ na wyniki, i zdecydowanie nie polecam używania @tablezmiennej, ponieważ modyfikacje tych ustawień są wymuszone szeregowe (nie można zastosować planu równoległego), które może zmienić rzeczywiste czasy zapytania.

Zmienne przypisanie

Możesz zadeklarować zmienną i przypisać do niej kolumny, w następujący sposób:

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]

Chociaż może to uniemożliwić optymalizację osadzania niektórych parametrów. Zobacz: Wąchanie parametrów, osadzanie i opcje ZALECAJ w części „Ograniczenie osadzania”.

Pamiętaj, że ta metoda może wywoływać ostrzeżenia planu o niejawnych konwersjach, ale nie są to te, o które musisz się martwić. Zobacz poniższe pytania i odpowiedzi: Jakie czynniki wywołują to ostrzeżenie: Konwersja typu w wyrażeniu może mieć wpływ na „CardinalityEstimate” w wyborze planu zapytań .

W SSMS

Możesz zmienić ustawienia, aby odrzucić wyniki zapytania.

ORZECHY

Stres zapytania SQL

SQL Query Stress to narzędzie typu open source, które pozwala uruchamiać zapytania na SQL Server w celu symulacji obciążenia. Po uruchomieniu żadne wyniki zapytania nie są zwracane do aplikacji.

Możesz przeczytać kilka instrukcji na ten temat tutaj .

ostress (RML Utilities)

ostress to podobne narzędzie publikowane przez Microsoft, które również nie zwraca wyników klientowi, chyba że zdecydujesz się to zrobić.

Tutaj napisałem o tym trochę .

Plan Explorer

SentryOne's Plan Explorer to darmowa alternatywa do przeglądania planów wykonania i zakleszczeń programu SQL Server.

Możesz także użyć go jako klienta do kwerendy SQL Serve:

ORZECHY

Spowoduje to również odrzucenie wyników.

ORZECHY

Mam nadzieję że to pomoże!

Erik Darling
źródło
0

Możesz wykonać zapytanie SET STATISTICS TIME ONi przechwycić komunikat wyjściowy za pomocą aplikacji do monitorowania na zewnętrznym serwerze monitorowania.

Sposób przechwytywania komunikatu wyjściowego za pomocą .Net wyjaśniono w tej odpowiedzi przepełnienia stosu autorstwa AdaTheDev :

Możesz to zrobić, dodając moduł obsługi zdarzeń do zdarzenia InfoMessage w połączeniu.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}
Evandro Muchinski
źródło
0

Czy nie możesz po prostu użyć początkowego wyboru, aby zwrócić @End?

SELECT @ blob_eater = [id], @ blob_eater = [id_bazy_danych], @ blob_eater = [nazwa_procesu], @ blob_eater = [exec_t] z [DB]. [Dbo]. [STAT]

SELECT @ End = GETDATE ()

Staje się

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

Tylko ostatnia wartość byłaby przechowywana w zmiennej.

Patrick Hurst
źródło