LINQ-to-SQL vs stored procedure? [chiuso]


188

Ho dato un'occhiata al post "Guida per principianti a LINQ" qui su StackOverflow ( Guida per principianti a LINQ ), ma domanda di follow-up:

Stiamo per avviare un nuovo progetto in cui quasi tutte le operazioni del nostro database saranno recuperi di dati abbastanza semplici (c'è un altro segmento del progetto che già scrive i dati). La maggior parte dei nostri altri progetti fino ad ora fa uso di stored procedure per tali cose. Tuttavia, vorrei sfruttare LINQ-to-SQL se ha più senso.

Quindi, la domanda è questa: per semplici recuperi di dati, quale approccio è migliore, LINQ-to-SQL o proc memorizzati? Qualche pro o contro specifico?

Grazie.

Risposte:


192

Alcuni vantaggi di LINQ rispetto agli sprocs:

  1. Tipo di sicurezza : penso che tutti lo capiamo.
  2. Astrazione : questo è particolarmente vero con LINQ-to-Entities . Questa astrazione consente inoltre al framework di aggiungere ulteriori miglioramenti di cui puoi facilmente trarre vantaggio. PLINQ è un esempio di aggiunta del supporto multi-threading a LINQ. Le modifiche al codice sono minime per aggiungere questo supporto. Sarebbe MOLTO più difficile eseguire questo codice di accesso ai dati che chiama semplicemente sprocs.
  3. Supporto per il debug : posso utilizzare qualsiasi debugger .NET per eseguire il debug delle query. Con sprocs, non è possibile eseguire facilmente il debug di SQL e tale esperienza è in gran parte legata al fornitore del database (MS SQL Server fornisce un analizzatore di query, ma spesso non è sufficiente).
  4. Fornitore indipendente : LINQ funziona con molti database e il numero di database supportati non farà che aumentare. Gli sproc non sono sempre portabili tra i database, a causa della diversa sintassi o del supporto delle funzionalità (se il database supporta gli sprocs).
  5. Distribuzione : altri lo hanno già menzionato, ma è più semplice distribuire un singolo assembly piuttosto che distribuire una serie di sprocs. Questo si collega anche con il n. 4.
  6. Più facile : non devi imparare T-SQL per eseguire l'accesso ai dati, né devi imparare l'API di accesso ai dati (ad esempio ADO.NET) necessaria per chiamare gli sprocs. Questo è correlato a # 3 e # 4.

Alcuni svantaggi di LINQ vs sprocs:

  1. Traffico di rete : gli sprocs devono solo serializzare i dati di nome sproc e argomento sul cavo mentre LINQ invia l'intera query. Questo può andare davvero male se le query sono molto complesse. Tuttavia, l'astrazione di LINQ consente a Microsoft di migliorare questo nel tempo.
  2. Meno flessibile : Sprocs può sfruttare appieno il set di funzionalità di un database. LINQ tende ad essere più generico nel suo supporto. Questo è comune in qualsiasi tipo di astrazione linguistica (ad es. C # vs assemblatore).
  3. Ricompilazione : se è necessario apportare modifiche al modo in cui si accede ai dati, è necessario ricompilare, versione e ridistribuire l'assembly. Gli sprocs possono talvolta consentire a un DBA di ottimizzare la routine di accesso ai dati senza la necessità di ridistribuire nulla.

Sicurezza e gestibilità sono qualcosa di cui anche la gente discute.

  1. Sicurezza : ad esempio, è possibile proteggere i dati sensibili limitando l'accesso diretto alle tabelle e inserendo ACL negli sprocs. Con LINQ, però, è ancora possibile limitare l'accesso diretto ai tavoli e ACL invece messo sul tavolo aggiornabili viste per raggiungere un fine simile (supponendo vostri supporti di database viste aggiornabili).
  2. Gestibilità : l'utilizzo delle viste offre anche il vantaggio di proteggere l'applicazione senza interruzioni dalle modifiche dello schema (come la normalizzazione della tabella). È possibile aggiornare la vista senza richiedere la modifica del codice di accesso ai dati.

Ero un grande sproc, ma sto iniziando a propendere verso LINQ come alternativa migliore in generale. Se ci sono alcune aree in cui gli sprocs sono chiaramente migliori, probabilmente scriverò comunque uno sproc ma accederò usando LINQ. :)


33
"LINQ funziona con molti database" Ma LINQTOSQL supporta solo SQL Server.
RussellH,

7
LINQ to Entities funziona con Postgres e MySql oltre a MSSQL. Non sono sicuro, ma ho pensato di leggere che c'era qualcosa per Oracle in giro.
bbqchickenrobot,

devart dotConnect ha una cosa Oracle, ma è buggy da morire. Inoltre, non riesco a superare il deficit di prestazioni introdotto dal dover selezionare i dati fuori dal database per aggiornarli (è anche possibile allegare (), ma è piuttosto poopey)
Ed James

5
Non ho visto nessuno qui menzionare il riutilizzo del codice. Non puoi riutilizzare linq in un'app VB6 o asp o file maker pro. Se si inserisce qualcosa nel database, è possibile riutilizzarlo OVUNQUE. Potresti creare una dll con linq all'interno, immagino, ma questo sta diventando un imo eccessivamente complicato e scadente. L'aggiunta di una funzione o di un proc memorizzato che può essere riutilizzato è molto più semplice.
MikeKulls

Parlando di codice Riutilizzare in TSQL (1) buona fortuna cercando di salvare i risultati di una procedura memorizzata in una tabella temporanea senza ricorrere a sql dinamico. (2) Non c'è molto che puoi fare per organizzare tutti i tuoi proc / funzioni; lo spazio dei nomi si riempie rapidamente. (3) Hai scritto una potente istruzione select ma ora vuoi che l'utente sia in grado di scegliere la colonna che viene ordinata - in TSQL potresti dover usare un CTE che fa un row_number su ogni colonna che può essere ordinata; in LINQ può essere risolto con alcune ifaffermazioni in un ripensamento.
sparebytes

77

In genere sono un sostenitore di mettere tutto nelle procedure archiviate, per tutte le ragioni per cui i DBA sono in corso da anni. Nel caso di Linq, è vero che non ci saranno differenze di prestazioni con semplici query CRUD.

Ma tieni a mente alcune cose quando prendi questa decisione: usare qualsiasi ORM ti accoppia strettamente al tuo modello di dati. Un DBA non ha la libertà di apportare modifiche al modello di dati senza forzare la modifica del codice compilato. Con le stored procedure, è possibile nascondere questo tipo di modifiche in una certa misura, poiché l'elenco dei parametri e i set di risultati restituiti da una procedura rappresentano il suo contratto e le parti interne possono essere cambiate, purché il contratto sia ancora rispettato .

Inoltre, se Linq viene utilizzato per query più complesse, l'ottimizzazione del database diventa un'attività molto più difficile. Quando una procedura memorizzata sta funzionando lentamente, il DBA può concentrarsi totalmente sul codice in modo isolato e ha molte opzioni, solo in modo che il contratto sia ancora soddisfatto al termine.

Ho visto molti, molti casi in cui gravi problemi in un'applicazione sono stati risolti da modifiche allo schema e al codice nelle procedure memorizzate senza alcuna modifica al codice distribuito e compilato.

Forse un approccio hybird sarebbe carino con Linq? Naturalmente Linq può essere utilizzato per chiamare le procedure memorizzate.


9
Una caratteristica che hai trascurato è la sicurezza. Con Linq, devi esporre le tabelle direttamente all'applicazione. Con le procedure memorizzate è possibile limitare l'accesso a tali processi e far rispettare i requisiti aziendali.
NotMe,

19
"Un DBA non ha la libertà di apportare modifiche al modello di dati senza forzare la modifica del codice compilato." Perché dovresti difenderlo? Nessuno dovrebbe avere la "libertà" di apportare modifiche, questo è il punto della gestione della configurazione. Le modifiche dovrebbero passare attraverso dev, test, ecc. Prima dell'implementazione a prescindere.
Neil Barnwell,

6
@Neil: Sì, ma non può apportare modifiche nell'ambiente di sviluppo senza forzare lo sviluppatore a modificare il codice.
Adam Robinson,

37
Devo dire che ho visto l'argomento sull'accoppiamento stretto alle basi di dati e non sono sicuro che sia valido. In realtà non ho mai incontrato una situazione (al di là di esempi banali) in cui voglio cambiare il database che non richiede comunque una modifica del codice più in alto. E davvero, in che modo Linq è diverso dai proc memorizzati o dalle query con parametri. Il livello di accesso ai dati deve essere comunque ben separato e astratto indipendentemente dal fatto che si usi un ORM o qualcosa di più semplice. Questo è ciò che ti dà l'accoppiamento libero, non quale tecnologia usi. Solo il mio 2c
Simon P Stevens,

7
Ho visto 199 procedure memorizzate scritte inutilmente per ogni 1 modifica dello schema che era protetta dalle applicazioni tramite la firma dell'SP, ma in modo simile a quanto affermato da Simon P Stevens, i cambiamenti semantici nell'uso degli SP richiedevano cambiamenti dell'applicazione al 100% del tempo comunque. Per non parlare del fatto che l'esistenza stessa degli SP richiede solo ad alcuni sviluppatori o dba futuri di perdere una logica di business nell'SP. Quindi un po 'di più e un po' di più.

64

Linq a Sql.

Il server SQL memorizzerà nella cache i piani di query, quindi non vi è alcun miglioramento delle prestazioni per gli sprocs.

Le tue dichiarazioni linq, d'altra parte, saranno logicamente parte e testate con la tua applicazione. Gli sprocs sono sempre un po 'separati e sono più difficili da mantenere e testare.

Se stavo lavorando su una nuova applicazione da zero in questo momento avrei semplicemente usato Linq, senza sprocs.


8
Non sono d'accordo riguardo ai tuoi commenti su nessun guadagno per gli sprocs. Ho profilato una serie di approcci all'accesso a SQL Server su un sistema prod e l'utilizzo dei proc memorizzati Prepare + ha avuto tra i migliori risultati. Anche attraverso più chiamate della stessa logica. Forse hai ragione su un DB con basso utilizzo, però.
torial

Se sei e sarai lo sviluppatore di query di database più abile, usa ciò che ti è più intimamente familiare. A differenza del codice procedurale, non si può dire "se dà la risposta giusta, spedirlo".
dkretz,

5
@RussellH: Questo era vero per .Net 3.5, che è stato risolto in .Net 4 (sia per L2S che per L2E)
BlueRaja - Danny Pflughoeft

3
@Kieth Non è il caso! Molti più piani di esecuzione vengono creati da Linq rispetto agli SP. I vantaggi esistono con il codice per il debug; ma problemi con la ricompilazione per il ciclo di implementazione dell'azienda; inflessibilità per testare diverse query ACTION, DOVE, ORDINA. La modifica dell'ordine dell'istruzione WHERE può causare l'elaborazione di una query diversa; prelettura; questo non può essere fatto facilmente in Linq. È necessario disporre del livello dati disponibile per la modifica. Gli SP sono più difficili da mantenere e testare? Se non ci sei abituato; ma gli SP sono utili per i corpi e i VLDB, l'alta disponibilità, ecc.! Linq è per piccoli progetti, lavoro solista; Fallo.
SnapJag,

4
@SnapJag - Hai ragione sul fatto che gli sprocs ti offrono un controllo più accurato, ma il fatto è che il 99% delle volte (anche nei grandi sistemi aziendali in cui lavoro) non hai bisogno di ulteriori ottimizzazioni. Gli sprocs sono più difficili da mantenere e testare se ci sei abituato o no - sono molto abituato a loro (ero un DBA prima di essere uno sviluppatore) e assicurando che lo sproc per ogni operazione CRUD per carichi di tabelle diverse sia aggiornato è un dolore. La migliore pratica (IMHO) è programmare nel modo più semplice, quindi eseguire controlli delle prestazioni e ottimizzare solo dove è necessario.
Keith,

40

Per il recupero dei dati di base, sceglierei Linq senza esitazione.

Da quando mi sono trasferito a Linq ho trovato i seguenti vantaggi:

  1. Il debug del mio DAL non è mai stato così facile.
  2. Compilare la sicurezza del tempo quando le modifiche allo schema non hanno prezzo.
  3. La distribuzione è più semplice perché tutto è compilato in DLL. Non più gestione degli script di distribuzione.
  4. Poiché Linq può supportare l'interrogazione di tutto ciò che implementa l'interfaccia IQueryable, sarai in grado di utilizzare la stessa sintassi per interrogare XML, Oggetti e qualsiasi altra origine dati senza dover imparare una nuova sintassi

1
per me compilare il tempo la sicurezza è la chiave!
bbqchickenrobot,

Per la distribuzione, tuttavia, se si fa parte di un team aziendale che dispone di un ciclo di distribuzione ed esiste un bug che deve essere eliminato rapidamente, la distribuzione di DLL tramite QA, ecc., È probabilmente più rigorosa del percorso di distribuzione di un singolo database script. I tuoi vantaggi sembrano rappresentare meglio uno scenario di team / progetto di piccole dimensioni.
SnapJag,

3
La distribuzione di script SQL che non devono passare attraverso il QA, non è necessariamente una buona cosa qui.
liang,

27

LINQ gonfia la cache delle procedure

Se un'applicazione utilizza LINQ to SQL e le query implicano l'uso di stringhe che possono avere una lunghezza molto variabile, la cache delle procedure di SQL Server diventerà gonfia con una versione della query per ogni possibile lunghezza della stringa. Ad esempio, prendere in considerazione le seguenti query molto semplici create nella tabella Person.AddressTypes nel database AdventureWorks2008:

var p = 
    from n in x.AddressTypes 
    where n.Name == "Billing" 
    select n;

var p = 
    from n in x.AddressTypes 
    where n.Name == "Main Office" 
    select n;

Se vengono eseguite entrambe queste query, vedremo due voci nella cache delle procedure di SQL Server: una associata a una NVARCHAR (7) e l'altra a una NVARCHAR (11). Ora immagina se ci fossero centinaia o migliaia di stringhe di input diverse, tutte con lunghezze diverse. La cache delle procedure verrebbe riempita inutilmente di tutti i tipi di piani diversi per la stessa identica query.

Altro qui: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363290


10
Che argomento sciocco: basta usare una variabile e il tuo problema è risolto.
JohnOpincar,

6
@John, non sarebbe utile se tu usassi una stringa validata anziché letterale poiché alla fine stai inviando una stringa letterale al database. potrebbe apparire come una variabile nel codice, ma sarà una stringa nel T-SQL generato che verrà inviata al DB.
kay.one,

15
SQLMenace: in base alla pagina collegata, il problema è risolto in VS2010.
Mark Byers,

8
Questo problema era valido quando la risposta è stata pubblicata, ma da allora è stata risolta in VS2010, quindi non è più un problema.
Brain2000,

17

Penso che l'argomento pro LINQ sembra provenire da persone che non hanno una storia con lo sviluppo del database (in generale).

Soprattutto se si utilizza un prodotto come VS DB Pro o Team Suite, molti degli argomenti qui riportati non si applicano, ad esempio:

Più difficile da mantenere e testare: VS fornisce il controllo completo della sintassi, il controllo dello stile, il controllo referenziale e dei vincoli e altro ancora. Fornisce inoltre funzionalità complete di test unitari e strumenti di refactoring.

LINQ rende impossibile il vero test unitario poiché (nella mia mente) non supera il test ACID.

Il debug è più semplice in LINQ: perché? VS consente il pieno passaggio dal codice gestito e il debug regolare degli SP.

Compilato in una singola DLL anziché in script di distribuzione: Ancora una volta, VS viene in soccorso dove può creare e distribuire database completi o apportare modifiche incrementali sicure per i dati.

Non devi imparare TSQL con LINQ: No, non devi, ma devi imparare LINQ - dov'è il vantaggio?

Davvero non lo vedo come un vantaggio. Essere in grado di cambiare qualcosa in isolamento potrebbe sembrare buono in teoria, ma solo perché i cambiamenti soddisfano un contratto non significa che sta restituendo i risultati corretti. Per essere in grado di determinare quali sono i risultati corretti, è necessario contesto e si ottiene quel contesto dal codice chiamante.

Ehm, le app debolmente accoppiate sono l'obiettivo finale di tutti i bravi programmatori poiché aumentano davvero la flessibilità. Essere in grado di cambiare le cose in isolamento è fantastico, ed è il tuo test unitario che assicurerà che stia ancora restituendo risultati adeguati.

Prima che vi arrabbiate, penso che LINQ abbia il suo posto e abbia un grande futuro. Ma per applicazioni complesse ad alta intensità di dati non penso che sia pronto a sostituire le procedure memorizzate. Questa è stata una visione che ho fatto eco da un MVP alla TechEd quest'anno (rimarranno senza nome).

EDIT: il lato delle procedure memorizzate LINQ to SQL è qualcosa su cui ho ancora bisogno di leggere di più - a seconda di ciò che trovo potrei modificare la mia precedente diatriba;)


4
Imparare LINQ non è un grosso problema: è solo zucchero sintattico. TSQL è un linguaggio completamente diverso. Mele e arance.
Adam Lassek,

3
Il vantaggio dell'apprendimento di LINQ è che non è legato a una singola tecnologia: la semantica dell'interrogazione può essere utilizzata per XML, oggetti e così via, e questo si espanderà nel tempo.
Dave R.,

5
Concordato! Tante persone (sviluppatori) sono alla ricerca di una soluzione "speed-to-market" in piccoli team e progetti. Ma se lo sviluppo viene portato al livello successivo di stile aziendale con più team, database di grandi dimensioni, sistemi distribuiti ad alto volume e alta disponibilità, sarà una storia diversa usare LINQ! Non credo che dovrai modificare la tua opinione per troppo tempo. LINQ non è destinato a progetti / team più grandi e con più persone, più team (Dev e DBA) E con un programma di distribuzione rigoroso.
SnapJag,

17

LINQ è nuovo e ha il suo posto. LINQ non è stato inventato per sostituire la procedura memorizzata.

Qui mi concentrerò su alcuni miti prestazionali e CONS, solo per "LINQ to SQL", ovviamente potrei sbagliarmi totalmente ;-)

(1) Le persone dicono che lo statment LINQ può "cache" nel server SQL, quindi non perde le prestazioni. Parzialmente vero. "LINQ to SQL" è in realtà il runtime che traduce la sintassi LINQ in istruzioni TSQL. Quindi, dal punto di vista delle prestazioni, un'istruzione SQL ADO.NET codificata non ha alcuna differenza rispetto a LINQ.

(2) Dato un esempio, un'interfaccia utente del servizio clienti ha una funzione "trasferimento account". questa stessa funzione potrebbe aggiornare 10 tabelle DB e restituire alcuni messaggi in un colpo solo. Con LINQ, è necessario creare una serie di istruzioni e inviarle come un batch a SQL Server. le prestazioni di questo batch LINQ-> TSQL tradotto difficilmente possono eguagliare la procedura memorizzata. Motivo? poiché è possibile modificare l'unità più piccola dell'istruzione in Stored procedure utilizzando il profiler SQL incorporato e lo strumento del piano di esecuzione, non è possibile farlo in LINQ.

Il punto è che quando si parla di una singola tabella DB e un piccolo set di dati CRUD, LINQ è veloce come SP. Ma per una logica molto più complicata, la procedura memorizzata è più ottimizzabile in termini di prestazioni.

(3) "LINQ to SQL" rende facilmente i neofiti introdurre i maiali delle prestazioni. Qualsiasi tipo TSQL senior può dirti quando non usare CURSOR (in pratica non dovresti usare CURSOR in TSQL nella maggior parte dei casi). Con LINQ e l'affascinante ciclo "foreach" con query, è così facile per un principiante scrivere questo codice:

foreach(Customer c in query)
{
  c.Country = "Wonder Land";
}
ctx.SubmitChanges();

Puoi vedere che questo semplice codice decente è così attraente. Ma sotto il cofano, il runtime .NET lo traduce in un batch di aggiornamento. Se ci sono solo 500 righe, questo è un batch TSQL a 500 righe; Se ci sono milioni di linee, questo è un successo. Naturalmente, l'utente esperto non utilizzerà questo modo per fare questo lavoro, ma il punto è che è così facile cadere in questo modo.


2
è facile fallire con i puntatori in C / C ++ / C # significa che non dovrebbe mai essere usato?
bbqchickenrobot,

1
Quanti programmatori di medio livello gestiscono i puntatori? Linq espone questa capacità a qualsiasi programmatore di livello, il che significa che il rischio di errore aumenta notevolmente.
Jacques,

1
Stai confrontando i neofiti in LINQ con il ragazzo TSQL senior. Non è davvero un confronto equo. Sono d'accordo con il tuo codice, LINQ non è performante per l'aggiornamento / eliminazione batch in generale. Tuttavia, direi che la maggior parte degli argomenti relativi alle prestazioni tra LINQ e SP sono affermazioni, ma non basati su misure
liang

12

Il codice migliore è nessun codice e con le procedure memorizzate devi scrivere almeno un po 'di codice nel database e il codice nell'applicazione per chiamarlo, mentre con LINQ to SQL o LINQ to Entities, non devi scrivere alcun ulteriore oltre ogni altra query LINQ oltre all'istanza di un oggetto di contesto.


10

LINQ ha sicuramente il suo posto nei database specifici dell'applicazione e nelle piccole imprese.

Ma in una grande impresa, in cui i database centrali fungono da hub di dati comuni per molte applicazioni, abbiamo bisogno di astrazione. Dobbiamo gestire centralmente la sicurezza e mostrare la cronologia degli accessi. Dobbiamo essere in grado di eseguire analisi di impatto: se apporto una piccola modifica al modello di dati per soddisfare una nuova esigenza aziendale, quali query devono essere modificate e quali applicazioni devono essere testate nuovamente? Visualizzazioni e procedure memorizzate mi danno questo. Se LINQ può fare tutto ciò e rendere i nostri programmatori più produttivi, lo accolgo con favore: qualcuno ha esperienza nell'usarlo in questo tipo di ambiente?


2
Hai menzionato un buon punto; LINQ non è un'alternativa in questo caso.
Meta-Knight,

1
Le vostre varie applicazioni dovrebbero usare tutti un livello di accesso ai dati comune (ovviamente, non è sempre così). In tal caso, è possibile apportare una singola modifica alla libreria comune e ridistribuire. Puoi anche usare qualcosa come WCF per gestire l'accesso ai dati per te. C'è un bel livello di astrazione che potrebbe tecnicamente usare linq per accedere ai dati dietro le quinte. Immagino che tutto dipende solo da ciò che i tuoi ragazzi escogitano per le tue esigenze in merito all'utilizzo di SPs vs Linq.
bbqchickenrobot,

8

Un DBA non ha la libertà di apportare modifiche al modello di dati senza forzare la modifica del codice compilato. Con le stored procedure, è possibile nascondere questo tipo di modifiche in una certa misura, poiché l'elenco dei parametri e i set di risultati restituiti da una procedura rappresentano il suo contratto e le parti interne possono essere cambiate, purché il contratto sia ancora rispettato .

Davvero non lo vedo come un vantaggio. Essere in grado di cambiare qualcosa in isolamento potrebbe sembrare buono in teoria, ma solo perché i cambiamenti soddisfano un contratto non significa che sta restituendo i risultati corretti. Per essere in grado di determinare quali sono i risultati corretti, è necessario contesto e si ottiene quel contesto dal codice chiamante.


7

IMHO, RAD = LINQ, RUP = Procs memorizzati. Ho lavorato per una grande azienda Fortune 500 per molti anni, a molti livelli, compresa la gestione, e francamente, non avrei mai assunto gli sviluppatori RUP per fare lo sviluppo RAD. Sono così insidiosi che hanno una conoscenza molto limitata di cosa fare ad altri livelli del processo. Con un ambiente silenzioso, ha senso dare ai DBA il controllo sui dati attraverso punti di ingresso molto specifici, perché altri francamente non conoscono i modi migliori per realizzare la gestione dei dati.

Ma le grandi imprese si muovono dolorosamente lente nell'arena dello sviluppo, e questo è estremamente costoso. Ci sono momenti in cui devi muoverti più velocemente per risparmiare tempo e denaro, e LINQ offre questo e molto altro.

A volte penso che i DBA siano di parte nei confronti di LINQ perché ritengono che minacci la sicurezza del loro lavoro. Ma questa è la natura della bestia, signore e signori.


3
Sì, noi DBA siamo seduti in giro tutto il giorno ad aspettare che tu richieda una spinta della Stored Proc alla produzione. Non doverlo fare ci spezzerebbe il cuore!
Sam,

6

Penso che devi andare con i proc per qualsiasi cosa di reale.

A) Scrivere tutta la logica in linq significa che il database è meno utile perché solo l'applicazione può utilizzarlo.

B) Non sono convinto che la modellazione di oggetti sia comunque migliore della modellazione relazionale.

C) Testare e sviluppare una procedura memorizzata in SQL è molto più veloce di un ciclo di modifica della compilazione in qualsiasi ambiente di Visual Studio. Basta modificare, F5 e premere select e si parte per le gare.

D) È più facile gestire e distribuire le procedure memorizzate rispetto agli assiemi .. basta inserire il file sul server e premere F5 ...

E) Linq in sql scrive ancora codice scadente a volte quando non te lo aspetti.

Onestamente, penso che l'ultima cosa sarebbe che MS aumentasse t-sql in modo che possa fare una proiezione di join implicitamente come fa Linq. t-sql dovrebbe sapere se volevi fare order.lineitems.part, per esempio.


5

LINQ non proibisce l'uso di stored procedure. Ho usato la modalità mista con LINQ-SQL e LINQ-storedproc . Personalmente, sono contento di non dover scrivere i proc memorizzati .... pwet-tu.


4

Inoltre, esiste il problema del possibile rollback 2.0. Fidati di me, mi è successo un paio di volte, quindi sono sicuro che sia successo ad altri.

Concordo anche sul fatto che l'astrazione sia la migliore. Insieme al fatto, lo scopo originale di un ORM è far corrispondere bene RDBMS ai concetti OO. Tuttavia, se tutto ha funzionato bene prima di LINQ dovendo deviare un po 'dai concetti di OO, allora fanculo. Concetti e realtà non sempre si adattano bene insieme. Non c'è spazio per i fanatici militanti dell'IT.


3

Suppongo che intendi Linq To Sql

Per qualsiasi comando CRUD è facile profilare le prestazioni di una procedura memorizzata rispetto a qualsiasi tecnologia. In questo caso qualsiasi differenza tra i due sarà trascurabile. Prova a profilare per un oggetto campo 5 (tipi semplici) oltre 100.000 query selezionate per scoprire se c'è una vera differenza.

D'altra parte, il vero affare sarà la domanda se ti senti a tuo agio nel mettere la tua logica aziendale nel tuo database o meno, che è un argomento contro le procedure memorizzate.


1
Dal momento che un numero maggiore di luoghi rispetto all'applicazione può influire sui dati: importazione di dati, altre applicazioni, query dirette, ecc., È sciocco non inserire la logica aziendale nel database. Ma se l'integrità dei dati non ti riguarda, vai avanti.
HLGEM,

3
La logica aziendale non dovrebbe andare nel database. Dovrebbe essere in un linguaggio di programmazione in cui è facilmente eseguibile il debug e la gestione. Può quindi essere condiviso tra le applicazioni come oggetti. Alcune regole potrebbero essere presenti nel database ma non nella logica aziendale.
spazio

3

Secondo i guru, definisco LINQ come moto e SP come auto. Se vuoi fare un breve viaggio e avere solo passeggeri piccoli (in questo caso 2), vai con garbo con LINQ. Ma se vuoi fare un viaggio e avere una grande band, penso che dovresti scegliere SP.

In conclusione, la scelta tra moto o auto dipende dal percorso (attività), dalla durata (tempo) e dai passeggeri (dati).

Spero che sia d'aiuto, potrei sbagliarmi. : D


1
gli amici sono morti in sella a una moto: P
Alex,

2
anche le persone sono morte alla guida di un'auto.
liang,

1
si ti sbagli.
Assad Ali,

3

Tutte queste risposte che si appoggiano a LINQ parlano principalmente di FACILITÀ DI SVILUPPO che è più o meno connessa alla scarsa qualità della codifica o alla pigrizia nella codifica. Sono solo così.

Alcuni vantaggi o Linq, ho letto qui come, facili da testare, facili da eseguire il debug ecc., Ma questi non sono collegati all'output finale o all'utente finale. Ciò causa sempre problemi all'utente finale in termini di prestazioni. Qual è il punto di caricare molte cose in memoria e quindi applicare i filtri nell'uso di LINQ?

Ancora una volta TypeSafety, avverte che "stiamo attenti a evitare la tipografia errata", che di nuovo di scarsa qualità stiamo cercando di migliorare utilizzando Linq. Anche in quel caso, se qualcosa nel database cambia, ad esempio la dimensione della colonna String, allora linq deve essere ricompilato e senza questo non sarebbe un errore di battitura. Ci ho provato.

Anche se abbiamo scoperto che è buono, dolce, interessante ecc. Mentre si lavora con LINQ, ha lo svantaggio di rendere pigro lo sviluppatore :) ed è dimostrato 1000 volte che è cattivo (potrebbe essere il peggiore) in termini di prestazioni rispetto a Stored Procs.

Smetti di essere pigro. Ci sto provando duramente. :)


4
Caricare tutto in memoria e filtrarlo? Linq può inviare il filtro come parte della query al database e restituisce il set di risultati filtrati.
liang

ci sono alcune persone che credono che LINQ carichi tutti i dati e li elabori usando un ciclo foreach. È sbagliato. Viene appena compilato in una query sql e fornisce quasi le stesse prestazioni per la maggior parte delle operazioni CRUD. Ma sì, non è un proiettile d'argento. Ci sono casi in cui l'utilizzo di T-SQL o dei proc memorizzati può rivelarsi migliore.
È una trappola l'

Accetto entrambi gli argomenti contrari. Tuttavia, non è del tutto vero che linq invia tutti i filtri a DBMS per lavorarci sopra. Ci sono alcune cose che funzionano nella memoria, una delle quali è distinta.
Manish,

2

Per semplici operazioni CRUD con un singolo punto di accesso ai dati, direi di utilizzare LINQ se ti senti a tuo agio con la sintassi. Per una logica più complicata penso che gli sprocs siano più efficaci dal punto di vista delle prestazioni se sei bravo con T-SQL e le sue operazioni più avanzate. Hai anche l'aiuto di Tuning Advisor, SQL Server Profiler, debug delle tue query da SSMS ecc.


2

La procedura memorizzata semplifica i test e puoi modificare la query senza toccare il codice dell'applicazione. Anche con linq, ottenere un dato non significa che sia il dato giusto. E testare la correttezza dei dati significa eseguire l'applicazione ma con la procedura memorizzata è facile testare senza toccare l'applicazione.


1

Il risultato può essere sintetizzato come

LinqToSql per piccoli siti e prototipi. Fa davvero risparmiare tempo per il prototipo.

Sps: universale. Sono in grado di ottimizzare le mie query e controllare sempre ActualExecutionPlan / StimatedExecutionPlan.



0

Sia LINQ che SQL hanno il loro posto. Entrambi hanno i loro svantaggi e vantaggi.

A volte per il recupero di dati complessi potrebbe essere necessario un processo memorizzato. E a volte potresti volere che altre persone usino il tuo proc memorizzato in Sql Server Management Studio.

Linq to Entities è ottimo per uno sviluppo CRUD veloce.

Sicuro che puoi creare un'app usando solo l'una o l'altra. Oppure puoi mescolarlo. Tutto dipende dalle tue esigenze. Ma i proc memorizzati SQL non scompariranno presto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.