2010-09-20 4 views
0

J'utilise SQL2008 et .NET 4.SQL Server 2008 - Mise à jour Délai de requête

Voici UPDATE requête provoque des erreurs de délai d'attente.

Tableau Les pages ont 600 000 enregistrements.

Erreur:

System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

Requête:

UPDATE Pages 
SET Checked = 1 , LastChecked = GETDATE() 
OUTPUT Inserted.ID, Inserted.Title INTO @Updated 
WHERE ID in 
(SELECT TOP (@Count) ID 
    FROM Pages 
    WHERE Checked = 0 and FileID = @FileID 
    ORDER BY ID) 

SELECT * FROM @Updated 
END 

Sur un autre thread I Insérer des enregistrements à Pages table, cela va sans cesse (une page est ajoutée toutes les 1 sec ou moins).

INSERT INTO Pages (Title ,.......) 
VALUES (@Title , .......) 

Pourquoi est-ce que j'obtiens l'erreur de délai d'attente et comment puis-je la résoudre?

SQL ne pas attendre indéfiniment sur la situation de blocage?

Répondre

2

C'est votre commande/client qui expire, plutôt que SQL Server lui-même.

Ajustez votre SqlCommand.CommandTimeout à une valeur supérieure?

myCmd.CommandTimeout = 360; //seconds 

Mises à jour:

Êtes-vous sûr que votre deuxième déclaration UPDATE 1 est celui qui est bloqué/temporiser? Peut-être qu'il y a quelque chose d'autre qui vient d'être exécuté?

Avez-vous regardé SSMS pour déterminer ce qui est bloqué/bloqué? Cliquez avec le bouton droit sur votre serveur, sélectionnez "Moniteur d'activité". alt text

Qu'est-ce que SQL Profiler vous montre comme étant en cours d'exécution? Comme le dit (+1) p.campbell, le timeout vient de .NET, pas de SQL.

+0

thx. Je pense que l'ajustement du délai d'attente n'est pas vraiment une solution. – RuSh

+0

Il est tout simplement trop facile de prolonger le timeout à chaque fois que la requête ralentit. Je pense que je devrais enquêter complètement s'il y a quelque chose à améliorer. – RuSh

+0

"Avez-vous regardé SSMS pour déterminer ce qui est bloqué/bloqué?" , pouvez-vous s'il vous plaît expliquer comment faire cela? – RuSh

0

Quelle indexation avez-vous en place? Sans une couverture appropriée des colonnes "Vérifié" et/ou "ID", votre sous-requête (SELECT TOP ...) devra lire chaque page de la table, pour obtenir tout d'abord où Checked = 0 et ensuite les trier par ID. S'il est grand et régulièrement mis à jour, cela pourrait le retarder.

S'il n'est pas nécessaire de les trier par ID, la suppression de ORDER BY peut entraîner la lecture des lignes uniquement jusqu'à ce que @Count leur soit associé.

Si vous avez SQL 2008, une requête filtrée (... WHERE Checked = 0) pourrait accélérer les choses.

+0

L'exécution de la requête à partir de SQL Server Management Studio prend 1 seconde et utilise un index non clustérisé (coût 100%). – RuSh

+0

On dirait que vous avez de bons index en place. –

+0

Oui cela correct, mais je reçois toujours le temps d'attente .... :( – RuSh

Questions connexes