2009-02-27 9 views
44

Je fournis une fonctionnalité de recherche sur mon site Web, lorsque l'utilisateur recherche un enregistrement, puis je souhaite afficher l'heure à laquelle la requête a été effectuée pour obtenir les mêmes résultats que google. Lorsque nous effectuons une recherche, google affiche combien de temps il faut pour obtenir des résultats? Pour cela, j'ai déclaré une variable @start dans mon SP et trouvé la différence à la fin, comme ci-dessous;Calculer le temps d'exécution d'une requête SQL?

DECLARE @start_time DATETIME 

SET @start_time = GETDATE() 

-- my query 
SELECT * FROM @search_temp_table 

SELECT RTRIM(CAST(DATEDIFF(MS, @start_time, GETDATE()) AS CHAR(10))) AS 'TimeTaken' 

est-il un autre moyen facile et rapide, ou une seule ligne de requête avec laquelle nous pouvons trouver le temps une requête prise pour exécuter?

J'utilise SQL Server 2005.

Répondre

18

Nous surveillons cela à partir du code de l'application, juste pour inclure le temps nécessaire pour établir/fermer la connexion et transmettre des données à travers le réseau. Il est assez simple ...

Dim Duration as TimeSpan 
Dim StartTime as DateTime = DateTime.Now 

'Call the database here and execute your SQL statement 

Duration = DateTime.Now.Subtract(StartTime) 
Console.WriteLine(String.Format("Query took {0} seconds", Duration.TotalSeconds.ToString())) 
Console.ReadLine()
+19

on doit utiliser 'System.Diagnostics.StopWatch' pour cela idéalement. – naveen

+5

J'ai annulé votre réponse, car elle ne répond pas à la question. Bien que vous l'ayez résolu en utilisant VB, mais considérez marquer la réponse de faiz comme la bonne réponse –

8

Pourquoi faites-vous dans SQL? Certes, cela montre un "vrai" temps de requête par opposition à l'heure de la requête + temps pris pour mélanger les données dans chaque sens sur le réseau, mais il pollue le code de votre base de données. Je doute que vos utilisateurs se soucieront - en fait, ils plutôt plutôt inclure l'heure du réseau, tout cela contribue au temps nécessaire pour qu'ils voient la page. Pourquoi ne pas faire la synchronisation dans votre code d'application Web? Mis à part toute autre chose, cela signifie que pour les cas où vous voulez voulez faire n'importe quel moment, mais vous voulez exécuter le même proc, vous n'avez pas besoin de déranger avec quelque chose dont vous n'avez pas besoin.

+0

Bien que la durée totale de connexion + requête + transfert de réseau est très pratique, je préfère exclure le temps de transfert du réseau depuis tant de facteurs externes au moteur de recherche peut l'affecter. J'aime aussi l'idée d'avoir des requêtes qui renvoient des métadonnées de performance, afin que l'application puisse se surveiller elle-même. Cela permettrait à une application d'exclure ou de remplacer automatiquement des requêtes lorsque la charge est élevée ou d'avertir le développeur si une requête qui produit une somme, par exemple, commence à dépasser régulièrement un certain seuil à mesure que les tailles de la table cible augmentent. – Triynko

+0

En outre, lorsque vous ajoutez des fonctionnalités incrémentielles, la surcharge supplémentaire de la requête peut être négligeable, tandis que l'heure de la requête elle-même peut ne pas l'être. Par exemple, je souhaite renvoyer un entier supplémentaire à mon client Flash avec une nouvelle requête somme, de sorte que le surdébit peut être considéré comme négligeable (ie * flux de données * existant * n'augmente que de 4 ou 5 octets et la connexion de base de données est déjà ouverte les autres données récupérées), tandis que l'heure d'exécution de la requête peut être significative. – Triynko

86

Eh bien, si vous voulez vraiment faire dans votre base de données il y a une façon plus précise comme indiqué dans MSDN:

SET STATISTICS TIME ON 

Vous pouvez lire ces informations de votre application aussi bien.

+5

Comment cette information peut-elle être lue par l'application? L'article de Microsoft ne mentionne rien à ce sujet. Je leur ai laissé des commentaires demandant si je devais analyser la sortie du message, ou s'il y avait une façon plus structurée d'accéder aux données de synchronisation, en particulier avec les classes de framework .NET. – Triynko

+0

Bon mais un peu détaillé comment il casse le temps pour chaque événement, j'ai juste besoin de temps total entre 2 points – Brent

+4

@Triynko: Les timings peuvent être lus dans le ['SqlConnection.InfoMessage'] (http://msdn.microsoft .com/fr-fr/library/system.data.sqlclient.sqlconnection.infomessage (v = vs.110) .aspx) -event – Grastveit

14
declare @sttime datetime 
set @sttime=getdate() 
print @sttime 
Select * from ProductMaster 
SELECT RTRIM(CAST(DATEDIFF(MS, @sttime, GETDATE()) AS CHAR(10))) AS 'TimeTaken'  
17

S'il vous plaît utiliser

-- turn on statistics IO for IO related 
SET STATISTICS IO ON 
GO 

et pour une utilisation de calcul du temps

SET STATISTICS TIME ON 
GO 

alors il donnera résultat pour chaque requête. Dans la fenêtre des messages près de la fenêtre de saisie de la requête.

24

J'ai trouvé celui plus utile et simple

DECLARE @StartTime datetime,@EndTime datetime 
SELECT @StartTime=GETDATE() 
--Your Query to be run goes here-- 
SELECT @EndTime=GETDATE() 
SELECT DATEDIFF(ms,@StartTime,@EndTime) AS [Duration in milliseconds] 
+0

Il est en millisecondes pas microsecondes DECLARE @StartTime datetime = gETDATE(), @ datetime EndTime SET @ EndTime = getDate() SELECT DATEDIFF (ms, @ StartTime, @EndTime) AS [Durée en millisecondes] – Brent

+1

cela ne fonctionnera pas car ce sont des constantes d'exécution et des valeurs sont assignées lorsque la requête s'exécute pour la première fois, et non lorsqu'elle est exécutée – mark1234

+0

@ mark1234 Je n'ai pas eu ce que tu as dit. Lequel ne fonctionne pas? – Navaneet

0

essayer

DECLARE @StartTime DATETIME 
SET @StartTime = GETDATE() 

    SET @EndTime = GETDATE() 
    PRINT 'StartTime = ' + CONVERT(VARCHAR(30),@StartTime,121) 
    PRINT ' EndTime = ' + CONVERT(VARCHAR(30),@EndTime,121) 
    PRINT ' Duration = ' + CONVERT(VARCHAR(30),@EndTime [email protected],114) 

Si cela ne le fait pas, essayez TIME SET STATISTIQUES SUR

1

Vous pouvez utiliser

SET STATISTICS TIME { ON | OFF } 

Affiche le nombre de millisecondes nécessaires pour analyser, compiler et exécuter chaque instruction

Lorsque l'option STATISTICS TIME est activée, les statistiques temporelles d'une instruction sont affichées. Lorsque OFF, les statistiques de temps ne sont pas affichés

USE AdventureWorks2012; 
GO   
SET STATISTICS TIME ON; 
GO 
SELECT ProductID, StartDate, EndDate, StandardCost 
FROM Production.ProductCostHistory 
WHERE StandardCost < 500.00; 
GO 
SET STATISTICS TIME OFF; 
GO 
Questions connexes