Domanda

C'è un modo per migliorare questo tipo di prestazioni di query SQL:

INSERT
INTO ...
WHERE NOT EXISTS(Validation...)

Il problema è quando ho molti dati in mio tavolo (come milioni di righe), l'esecuzione della clausola WHERE NOT EXISTS se molto lento. Devo fare questa verifica perché non riesco a inserire i dati duplicati.

Io uso SQLServer 2005

thx

È stato utile?

Soluzione

Assicurarsi che si sta cercando su colonne indicizzate, senza alcuna manipolazione dei dati all'interno di tali colonne (come sottostringa, ecc.)

Altri suggerimenti

Al largo della parte superiore della mia testa, si potrebbe provare qualcosa di simile:

 TRUNCATE temptable
 INSERT INTO temptable ...
 INSERT INTO temptable ... 
 ...
 INSERT INTO realtable
 SELECT temptable.* FROM temptable
 LEFT JOIN realtable on realtable.key = temptable.key
 WHERE realtable.key is null

Prova a sostituire il non esiste con un join esterno sinistro, a volte si comporta meglio in grandi insiemi di dati.

Attenzione alla altra risposta per quanto riguarda l'indicizzazione. NON esiste è in genere abbastanza veloce se si dispone di buoni indici.

Ma sono ha avuto problemi di prestazioni con dichiarazioni come si descrive. Un metodo che ho usato per aggirare questo è quello di utilizzare una tabella temporanea per i valori candidati, eseguire un DELETE FROM ... dove esiste (...), e quindi inserire ciecamente il resto. All'interno di una transazione, naturalmente, al fine di evitare condizioni di gara. Frazionamento a volte le query consente l'ottimizzatore di fare il suo lavoro senza confondersi.

Se si può affatto ridurre il problema di spazio, allora otterrai cumuli di prestazioni. Sei assolutamente sicuro che ogni uno di quei righe nella tabella che deve essere controllato?

L'altra cosa che si potrebbe desiderare di provare è un DELETE InsertTable FROM InsertTable INNER JOIN ExistingTable ON <Validation criteria> prima del vostro inserto. Tuttavia, la tua situazione potrebbe essere diversa

insert into customers 
select * 
from newcustomers 
where customerid not in (select customerid 
                         from customers)

.. può essere più efficiente. Come altri hanno detto, fare gli indici in modo di avere su tutti i campi di ricerca.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top