Come è stato detto, il database è ottimizzato per le operazioni impostate. Gli ingegneri letteralmente si sono seduti e hanno effettuato il debug/tuning di quel database per lunghi periodi di tempo. Le possibilità di ottimizzarle sono piuttosto ridotte. Ci sono tutti i tipi di trucchi divertenti con i quali puoi giocare se hai un set di dati con cui lavorare insieme come letture/scritture di dischi batch, cache, multi-threading. Inoltre, alcune operazioni hanno un costo elevato, ma se lo si fa a un gruppo di dati contemporaneamente il costo per pezzo di dati è basso. Se lavori solo una riga alla volta, molti di questi metodi e operazioni non possono accadere.
Ad esempio, basta osservare il modo in cui il database si unisce. Guardando a spiegare i piani puoi vedere diversi modi di fare join. Molto probabilmente con un cursore si va riga per riga in una tabella e quindi si selezionano i valori necessari da un'altra tabella. Fondamentalmente è come un ciclo annidato solo senza la rigidità del loop (che è molto probabilmente compilato in linguaggio macchina e ottimizzato). SQL Server da solo ha un sacco di modi per unirsi. Se le righe sono ordinate, utilizzerà un qualche tipo di algoritmo di fusione, se una tabella è piccola, può trasformare una tabella in una tabella di ricerca hash e fare il join eseguendo ricerche O (1) da una tabella nella tabella di ricerca. Esistono numerose strategie di join che hanno molti DBMS che ti battono cercando i valori da una tabella in un cursore.
Basta guardare l'esempio della creazione di una tabella di ricerca hash. Per costruire la tabella è probabilmente m operazioni se si uniscono due tabelle una di lunghezza n e una di lunghezza m dove m è la tabella più piccola. Ogni ricerca deve essere costante, quindi sono n operazioni. quindi in pratica l'efficienza di un hash join è intorno a m (setup) + n (lookup). Se lo fai tu stesso e non hai ipotesi di ricerca/indice, per ognuna delle n righe dovrai cercare m record (in media equivale a m/2 ricerche).Quindi in pratica il livello delle operazioni va da m + n (unendo un gruppo di record contemporaneamente) a m * n/2 (facendo ricerche tramite un cursore). Anche le operazioni sono semplificazioni. A seconda del tipo di cursore, il recupero di ogni riga di un cursore può essere lo stesso di un'altra selezione dalla prima tabella.
Anche le serrature ti uccidono. Se si hanno cursori su un tavolo si stanno bloccando le righe (nel server SQL questo è meno grave per i cursori statici e forward_only ... ma la maggior parte del codice del cursore che vedo apre un cursore senza specificare alcuna di queste opzioni). Se esegui l'operazione in un set, le righe saranno comunque bloccate ma per un periodo di tempo minore. Anche l'ottimizzatore può vedere cosa stai facendo e potrebbe decidere che è più efficace bloccare l'intera tabella anziché un mucchio di righe o pagine. Ma se si va linea per linea l'ottimizzatore non ha idea.
L'altra cosa è che ho sentito dire che nel caso di Oracle è super ottimizzato per fare operazioni con il cursore in modo da non avvicinarsi alla stessa penalità per le operazioni basate sui set rispetto ai cursori in Oracle come in SQL Server. Non sono un esperto di Oracle quindi non posso dirlo con certezza. Ma più di una persona Oracle mi ha detto che i cursori sono molto più efficienti in Oracle. Quindi, se hai sacrificato tuo figlio primogenito per Oracle non si può avere a preoccuparsi di cursori, consultare il proprio locale DBA Oracle ben pagati :)
'UPDATE SET clienti AreaCode = AreaCode_Exchange.AreaCode FROM Customer ISCRIVITI ON AreaCode_Exchange SINISTRA (Customer.PhoneNumber, 3) = AreaCode_Exchange.Exchange DOVE Customer.AreaCode IS NULL', si può spiegare questo uno' SINISTRA (Customer.PhoneNumber, 3) 'e la sua funzionalità – Smart003