Domanda

Ho una query elimina che richiede molto tempo. Guardando il piano di esecuzione, vedo che la maggior parte del costo stimato nella query elimina si trova in una sezione del modello di dati che aveva molti dati (diciamo, 400k righe) che sembravano a posto, ma non capisco una cosa .

Vista ridotta del modello di dati:

table ParentObject 
      int parentObjectId (PK)

table Child
      int childId (PK)
      int parentId (FK)
      <stuff>

table GrandChild
      int grandChildId (PK)
      int childId (FK)
      <more stuff>

Laddove un oggetto genitore potrebbe avere 200.000 figli e un figlio ha circa 2 nipoti. Sono interessato a sintonizzare le prestazioni di:

DELETE FROM ParentObject WHERE parentObjectId = %d;

Sul nipote, c'è un indice non cluster extra su (Childid, + altre due colonne) e l'indice della chiave primaria. Su figlio c'è un indice univoco non cluster extra (genitore, + altre due colonne).

La cosa che ho visto nel piano di query è che durante l'eliminazione degli oggetti del nipote, c'erano due costose operazioni di smistamento mescolate alle eliminazioni e non capisco perché siano lì.

Cosa dovrei guardare per aiutare questa operazione di eliminazione a diventare più veloce? Deve ordinare? Aiuterebbe se denormalizzassi gli ID e aggiungessi un ID genitore al tavolo del nipote? Ho costruito stupidamente il mio indice?

Il Il piano di esecuzione completo è qui.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top