Pourquoi suis-je “Le fichier journal de base de données " base de données tempdb est pleine”

Laissez-nous avoir une table de paiements de 35 colonnes de la clé primaire (autoinc bigint) et 3 non mis en cluster, non unique indices (chacun sur une colonne int).

Entre les colonnes de la table, nous avons deux champs de type dateheure:

  1. payment_date datetime NOT NULL

  2. edit_date datetime NULL

La table a environ 1 200 000 lignes.
Seulement ~1000 de lignes ont edit_date colonne = null.
9000 de lignes ont edit_date pas nul et n'est pas égal à payment_date
D'autres ont edit_date=payment_date

Lorsque nous exécutons requête 1:

select top 1 *
from payments
where edit_date is not null and (payment_date=edit_date or payment_date<>edit_date)
order by payment_date desc

Pourquoi suis-je “Le fichier journal de base de données

serveur a besoin d'un couple de secondes pour le faire. Mais si nous courons requête 2:

select top 1 *
from payments
where edit_date is not null
order by payment_date desc

Pourquoi suis-je “Le fichier journal de base de données

l'exécution se termine avec Le fichier journal de base de données " base de données tempdb est pleine. Sauvegarder le journal des transactions de la base de données afin de libérer de l'espace du journal.

Si nous remplaçons * avec une certaine colonne, voir requête 3

select top 1 payment_date
from payments
where edit_date is not null
order by payment_date desc

Pourquoi suis-je “Le fichier journal de base de données

il termine dans un couple de secondes.

Où est la magie?

MODIFIER
J'ai modifié la requête de 1, de sorte qu'il fonctionne sur exactement le même nombre de lignes que la 2ème requête. Et encore, il retourne en une seconde, alors que la requête 2 remplit la base de données tempdb.

RÉPONSE
J'ai suivi les conseils pour ajouter un index, l'a fait pour les deux champs de date - tout a commencé un travail rapide, comme prévu. Cependant, la question était de savoir - pourquoi, dans cette situation exacte de sql server se comportent différemment sur des requêtes (requête 1 vs requête 2); je voulais comprendre la logique de l'optimisation du serveur. Je suis d'accord si les deux requêtes n'a utilisé la base de données tempdb de la même manière, mais ils n'ont pas....

À la fin il me marque que la réponse à la première, où j'ai vu le doivent-être les symptômes de mon problème et la première, ainsi, des pensées sur la façon d'éviter cela (c'est à dire indices)

Avez-vous songé à la suite de l'avis de la message d'erreur? Certaines requêtes nécessitera l'utilisation de la base de données tempdb, et si le fichier journal est plein, aucune autre transaction ne peut être effectuée.
Je n'ai pas..mais ce que je suis en train de le savoir est pourquoi presque similaire, les requêtes sont exécutées d'une manière complètement différente...et comment suis-je à la construction de requêtes pour éviter ce genre de behaivour..
N'utilisez pas de * pour sélectionner toutes les colonnes, pour commencer. Et ce journal des transactions.
avez-vous essayé ceci, comme vous le rencontrez 35*(90,000) documents générés???? select top 1 payment_date de paiements, où edit_date n'est pas null et payment_date=edit_date commande par payment_date desc
Les requêtes de 1,3 sont exécutés instantanément; seulement la 2ème requête manque de la taille de tempdb

OriginalL'auteur horgh | 2012-08-09