SQL Server mode « Dry Run »? des tampons de données de charge, sans tenir serrures ou de modifier des données

StackOverflow https://stackoverflow.com/questions/2374457

Question

Je vais courir des requêtes sur une base de données SQL Server, suivie d'une suppression. Idéalement tout cela se passe dans une transaction (par exemple atomique).

Mais en pratique, parce que les données ont depuis longtemps été purgé des tampons, SQL Server devra effectuer un grand nombre de IO physique afin de compléter le T-SQL traitées. Cela peut être un problème, parce que si le lot entier prend plus de 30 secondes pour exécuter, les utilisateurs connaîtront des problèmes de délai d'attente.

i remarqué que si je cours mes selects en morceaux, chaque fois que l'exécution de plus en plus de SQL finale, laissant SQL Server remplir les tampons avec de plus en plus des données requises. par exemple:.

run Première :

 BEGIN TRANSACTION
 SELECT ... WHERE ...
 ROLLBACK

Deuxième run :

 BEGIN TRANSACTION
 SELECT ... WHERE ...
 SELECT ... WHERE ...
 ROLLBACK

...

run n-ième :

BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
ROLLBACK

Et au moment où j'atteins la course finale :

BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
DELETE FROM ... WHERE ...
COMMIT

court vite, le lot entier étant donné que les tampons sont pré-remplies.

Y at-il un mode de SQL Server (à savoir SET NOEXEC ON) qui provoquerait SQL Server pour ne pas effectuer toutes les modifications de données réelles, et non pas prendre des serrures, mais remplir les tampons avec les données nécessaires? par exemple.

SET NOEXEC ON
EXECUTE ThatThingYouDo

SET NOEXEC OFF
EXECUTE ThatThingYouDo

ou

SET DRYRUN ON
EXECUTE ThatThingYouDo

SET DRYRUN OFF
EXECUTE ThatThingYouDo
Était-ce utile?

La solution

Non.
Disons que vous avez suivi INSERT UPDATE sur les lignes insérées. Vous ne serez jamais en mesure d'imiter la mise à jour car les lignes insérées n'existent pas. Maintenant, dans ce cas, pourquoi vos sélections dans une transaction? Par défaut (à savoir, sauf si vous utilisez HOLDLOCK ou similaire), vous n'êtes pas le verrouillage des lignes pour la durée de la transaction.

Si vous pensez que le pool de mémoire tampon (le cache de a.k.a. données) est « complète », alors vous avez besoin de plus de RAM ou d'une autre mise à niveau / échelle.

Autres conseils

J'ai trouvé que chaque fois que vous essayez de faire quelque chose d'extrêmement hors de la normale pour résoudre un problème, que vous la conception de base est très probablement le problème. Cela est extrêmement hors de la normale.

Peut-être que vous pourriez fournir plus d'informations sur la SUPPRIMER (taille de la table, l'activité, l'indice, les lignes à supprimer, d'autres processus en cours d'exécution, etc.) qui prend tant de temps et il y aura une solution classique, en utilisant un indice ou verrouillage, etc. pour y remédier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top