2009-05-12 11 views
12

J'ai un accès RO sur une vue SQL. Cette requête ci-dessous expire. Comment éviter cela?Comment éviter Sql Query Timeout

select 
    count(distinct Status) 
from 
    [MyTable] with (NOLOCK) 
where 
    MemberType=6 

Le message d'erreur que je reçois est:

Msg 121, Level 20, State 0, Line 0

A transport-level error has occurred when receiving results from the server (provider: TCP Provider, error: 0 - The semaphore timeout period has expired.)

+0

Combien de temps cela dure-t-il avant que vous obteniez l'erreur? – codeulike

+0

il fonctionne jusqu'à 15-20 min –

+0

Cela fait longtemps. Est-ce que [MyTable] dans votre exemple est au-dessus d'une table ou d'une vue? Si c'est une vue, veuillez poster la définition de la vue et nous pouvons essayer de suggérer des optimisations. – codeulike

Répondre

6

Bien qu'il existe manifestement une sorte d'instabilité du réseau ou quelque chose interférer avec votre connexion (15 minutes est possible que vous pourriez être traverser une frontière NAT ou quelque chose dans votre réseau diminue la session), je pensez-vous que vous voulez une requête si simple?) pour retourner bien dans n'importe quelle timeoue anticipée (comme 1s).

Je voudrais parler à votre administrateur de base de données et obtenir un index créé sur les tables sous-jacentes sur MemberType, Status. S'il n'y a pas une seule table sous-jacente ou si elles sont plus complexes et créées par la vue ou l'UDF et si vous exécutez SQL Server 2005 ou supérieur, demandez-lui d'indexer la vue (matérialisant la vue de manière indexée).

2

Vous pouvez mettre un index sur MemberType.

+0

S'il utilise une vue, comme indiqué, ce sera plutôt difficile ... – MicSim

+0

L'accès au RO est probablement plus un problème, mais pourrait demander à DBA de l'ajouter à la table. – JeffO

1

Avez-vous un index défini sur la colonne Statut et la colonne MemberType?

21

Votre requête est probablement correcte. "La période d'expiration du sémaphore a expiré" est une erreur réseau, pas un délai d'attente SQL Server.

par exemple. voir http://support.microsoft.com/kb/325487

Il existe apparemment un problème de réseau entre vous et le serveur SQL.

edit: Cependant, apparemment la requête dure 15-20 min avant de donner l'erreur réseau. Cela fait très longtemps, donc peut-être que l'erreur de réseau pourrait être liée au temps d'exécution long. L'optimisation de la vue sous-jacente peut aider.

Si [MyTable] dans votre exemple est une vue, pouvez-vous publier la définition de la vue afin que nous puissions l'optimiser?

3

Veuillez consulter votre journal des événements système Windows pour toute erreur spécifique à la "Source de l'événement: Dhcp". C'est très probablement une erreur de mise en réseau liée à DHCP. La durée du bail d'adresse a expiré ou plus. Cela ne devrait pas être un problème lié au SQL Server ou à la requête elle-même. Il suffit de lancer une recherche sur Internet pour savoir si la période d'attente du sémaphore a expiré et vous obtiendrez de nombreuses suggestions pour trouver une solution à votre problème. Malheureusement, il ne semble pas être la solution pour ce problème.

+0

Je sais que c'était il y a cinq ans, mais pourquoi supposeriez-vous qu'il s'agit d'un problème DHCP sur un réseau fixe ...?S'il utilise un serveur de base de données, il a probablement un schéma d'adresse fixe. J'ai l'impression que c'est une non-réponse. –

0

combien d'enregistrements avez-vous? y a-t-il des index sur la table? essayez ceci:

;with a as (
select distinct Status 
from MyTable 
where MemberType=6 
) 
select count(Status) 
from a