2012-05-22 4 views
5

J'ai une petite table avec 500 lignes. Cette table comporte 10 colonnes dont une colonne varchar (max).Slow "Sélectionnez" requête avec varchar (max)

Lorsque j'effectue cette requête:

SELECT TOP 36 * 
FROM MyTable 
WHERE (Column1 = Value1) 

Il récupère environ 36 lignes en 3 minutes. Les colonnes varchar (max) contiennent dans chaque ligne 3000 caractères.

Si je tente de récupérer une seule ligne moins:

SELECT TOP 35 * 
FROM MyTable 
WHERE (Column1 = Value1) 

Ensuite, la requête récupère 35 lignes de 0 secondes.

Dans mes statistiques clients, Octets reçus depuis le serveur, j'ai:

95 292 pour la requête de récupération de données en 0 sec

plus de 200 000 000 pour les données de récupération requête en 3 min

Savez-vous que ça vient?

EDIT --- Voici mon code réel:

select top 36 * 
from Snapshots 
where ExamId = 212 

select top 35 * 
from Snapshots 
where ExamId = 212 

EDIT --- Plus d'informations sur les statistiques des clients

Les deux statistiques ayant une grande variation sont:

Octets reçus de serveur: 66 038 Vs Plus de 2 000 000

Paquets TDS reçus du serveur 30 Vs 11000

+0

Non, mais je vous recommande de changer le champ 'varchar' un' Text' terrain et voir si cela résout le isssue de performance. – Emmanuel

+8

[ 'Text' a * long * été dépréciée] (http://msdn.microsoft.com/en-us/library/ms187993.aspx) - Pourquoi recommanderiez-vous? –

+0

Peut-être que c'est un problème de mémoire ou un problème d'échange de disque? – Toc

Répondre

0

Utilisez Index pour ExamId utiliser aussi select field1,field2,etc au lieu de select * ....

+0

Je l'ai essayé. Ne change rien – Toc

0

Je ne sais pas, mais essayez ceci:

select * des instantanés où ExamId = (sélectionner top 36 ExamId des instantanés où ExamId = 212)

+0

J'ai essayé (et remplacé "=" par "in") et il ne change rien – Toc

0

Que diriez-vous d'essayer le top 50, puis top 75, puis top 100, pour voir s'il y a une augmentation plus importante encore, car il semble que ce soit juste cette ligne, ou peut-être juste des lignes spécifiques dans votre table.

+0

Oui, Quand j'augmente le haut, il augmente le temps de réponse, Octets reçus du serveur et des paquets TDS reçus de serveur. – Toc

+0

avec une aussi grande différence que d'aller de 35 à 36 fait? Ou est-ce juste des lignes spécifiques dans votre table qui font un grand bond? –

+0

aucune performance est presque la même entre le top 36 et un top 50. Je pense que ce peut être un problème de taille de paquet ou quelque chose comme ça? – Toc