Domanda

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

Stiamo per rampa di lancio di un nuovo progetto, in cui quasi tutti i nostri database op sarà abbastanza semplice dati i recuperi (c'è un altro segmento del progetto che già scrive i dati).La maggior parte degli altri progetti fino a questo punto di fare uso di stored procedure per queste cose.Tuttavia, mi piacerebbe sfruttare LINQ-to-SQL se ha più senso.

Così, la domanda è questa:Per il semplice dati i recuperi, l'approccio migliore, LINQ-to-SQL o stored procedure?Specifici pro o i contro?

Grazie.

È stato utile?

Soluzione

Alcuni vantaggi di LINQ oltre sprocs:

  1. Tipo di sicurezza:Credo che tutti siamo consapevoli di questo.
  2. Astrazione:Questo è vero soprattutto con LINQ-to-Entities.Questa astrazione consente anche di un quadro per aggiungere ulteriori miglioramenti che si possono facilmente trarre vantaggio. PLINQ è un esempio di aggiunta di supporto multi-threading per LINQ.Codice cambiamenti sono minimi per aggiungere questo supporto.Sarebbe MOLTO più difficile fare questo codice di accesso ai dati che chiama semplicemente sprocs.
  3. Il supporto per il debug:Posso usare qualsiasi .NET debugger per eseguire il debug delle query.Con sprocs, si può facilmente eseguire il debug di SQL e che l'esperienza è in gran parte legata al vostro fornitore di database (MS SQL Server fornisce una query analyzer, ma spesso questo non è sufficiente).
  4. Indipendente dal fornitore:LINQ funziona con un sacco di basi di dati e il numero di database supportati potrà solo aumentare.Sprocs non sono sempre portatile tra le banche dati, sia a causa di varie sintassi o la funzione di supporto (se il database supporta sprocs a tutti).
  5. Distribuzione:Altri hanno già detto, ma è più facile distribuire una sola assemblea di distribuire un set di sprocs.Questo anche legami con il #4.
  6. Più facile:Non hai per saperne di T-SQL per effettuare l'accesso ai dati, né è necessario imparare le API di accesso ai dati (ad es.ADO.NET), che è necessario per chiamare il sprocs.Questo è collegato con la #3 e #4.

Alcuni svantaggi di LINQ vs sprocs:

  1. Il traffico di rete:sprocs bisogno solo di serializzare stored procedure-il nome e l'argomento di dati su cavo mentre LINQ invia l'intera query.Questo può diventare davvero male, se le query sono molto complesse.Tuttavia, LINQ dell'astrazione consente a Microsoft di migliorare questo nel corso del tempo.
  2. Meno flessibile:Sprocs può prendere pieno vantaggio di un database featureset.LINQ tende ad essere più generica di supporto.Questo è comune in ogni tipo di linguaggio di astrazione (ad es.C# vs assembler).
  3. La ricompilazione:Se è necessario apportare modifiche al modo in cui si esegue l'accesso ai dati, è necessario ricompilare, versione, e ridistribuire la vostra assemblea.Sprocs può a volte consentire a un amministratore di database per ottimizzare l'accesso ai dati di routine, senza la necessità di ridistribuire nulla.

Sicurezza e facilità di gestione sono qualcosa che la gente discutere troppo.

  1. Sicurezza:Ad esempio, è possibile proteggere i vostri dati sensibili, limitando l'accesso alle tabelle direttamente, e mettere le Acl sul sprocs.Con LINQ, tuttavia, è ancora possibile limitare l'accesso diretto alle tabelle e invece di mettere le Acl su aggiornabile tabella vista per ottenere un simile fine (supponendo che il database supporta le viste aggiornabili).
  2. Gestibilità:Utilizzando la vista ti dà anche il vantaggio di proteggere la vostra applicazione non rompere le modifiche dello schema (come tabella di normalizzazione).È possibile aggiornare la vista senza richiedere il codice di accesso di dati di cambiare.

Ho usato per essere un grande stored procedure ragazzo, ma sto iniziando a propendere per LINQ come un'alternativa migliore in generale.Se ci sono alcune aree in cui sprocs sono nettamente migliori, quindi io probabilmente ancora scrivere una stored procedure, ma l'accesso utilizzando LINQ.:)

Altri suggerimenti

Io sono generalmente un sostenitore di mettere tutto in stored procedure, per tutti i motivi amministratori di database sono stati insistere per anni e anni.In caso di Linq, è vero che non ci sarà alcuna differenza di prestazioni con semplici CRUD query.

Ma tenere un paio di cose in mente quando si effettua questa decisione:utilizzando qualsiasi ORM coppie è strettamente per il vostro modello di dati.Un DBA non ha libertà di apportare modifiche al modello di dati senza costringervi a cambiare il codice compilato.Con stored procedure, è possibile nascondere questi tipi di cambiamenti in una certa misura, dal momento che l'elenco di parametri e set di risultati(s) restituito da una procedura di rappresentare il suo contratto, e le interiora può essere cambiato tutto, a patto che il contratto è ancora incontrato.

E anche, se Linq è utilizzato per le query più complesse, messa a punto del database diventa un compito molto più difficile.Quando una stored procedure è in esecuzione lenta, l'amministratore può completamente concentrarsi sul codice in isolamento, e ha un sacco di opzioni, in modo che il contratto è ancora soddisfatto quando lui/lei ha fatto.

Ho visto molti, molti casi in cui gravi problemi in un'applicazione sono stati affrontati da modifiche allo schema di codice e nelle stored procedure, senza alcuna modifica, distribuiti, il codice compilato.

Forse un hybird approccio sarebbe bello con Linq?Linq, naturalmente, può essere utilizzato per chiamare la stored procedure.

Linq to Sql.

Sql server memorizza nella cache i piani di query, quindi non c'è nessun guadagno in termini di prestazioni per sprocs.

Le vostre dichiarazioni di linq, invece, sarà logicamente parte e testato con la vostra applicazione.Sprocs sono sempre un po ' separati e sono più difficili da mantenere e da testare.

Se stavo lavorando su una nuova applicazione da zero e adesso vorrei solo utilizzare Linq, non sprocs.

Per la base di dati di recupero sarei andato per Linq senza esitazione.

Da quando si è trasferito a Linq ho trovato i seguenti vantaggi:

  1. Il debug DAL non è mai stato così facile.
  2. Compilazione di sicurezza quando il tuo modifiche dello schema è impagabile.
  3. La distribuzione è più facile, perché tutto ciò che viene compilato in DLL.Non più la gestione di script di distribuzione.
  4. Linq in grado di supportare l'esecuzione di query nulla che implementa il IQueryable interfaccia, si sarà in grado di utilizzare la stessa sintassi di query XML, Oggetti e qualsiasi altra origine dati, senza dover imparare una nuova sintassi

LINQ sarà gonfiare la procedura di cache

Se un'applicazione sta utilizzando LINQ to SQL e query comportano l'uso di stringhe che possono essere molto variabili in lunghezza, la procedura di SQL Server cache diventerà gonfio con una versione di query per ogni stringa di lunghezza.Per esempio, consideriamo la seguente molto semplice query creata contro la Persona.AddressTypes tabella 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 entrambe le query vengono eseguite, vedremo due voci nella cache procedure di SQL Server:Uno legato con un tipo NVARCHAR(7), e l'altro con una di tipo NVARCHAR(11).Ora immaginate se ci fossero centinaia o migliaia di diverse stringhe di input, tutti con diverse lunghezze.La procedura di cache sarebbe diventato inutilmente riempito con tutti i tipi di piani diversi per esattamente la stessa query.

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

Penso che il pro LINQ argomento sembra provenire da persone che non hanno una storia di sviluppo di database (in generale).

Soprattutto se si utilizza un prodotto come il VS DB Pro o Team Suite, molte delle argomentazioni presentate qui non si applica, per esempio:

Più difficile da mantenere e da Testare:VS fornisce il pieno controllo della sintassi, stile di controllo, referenziale e il controllo dei vincoli e di più.E ' anche fornire unità piena capacità di analisi e strumenti di refactoring.

LINQ rende vero test di unità impossibile (nella mia mente) non è l'ACID test.

Il debug è più semplice in LINQ:Perché?VS permette il passaggio da codice gestito e regolare il debug di SPs.

Compilato in un unico DLL piuttosto che gli script di distribuzione:Ancora una volta, VS viene in soccorso dove è possibile creare e distribuire intero database o fare di dati di sicurezza modifiche incrementali.

Non devono imparare TSQL con LINQ:No, non c'è, ma devi imparare a LINQ - dove è il vantaggio?

Io davvero non vedere questo come un vantaggio.Essere in grado di cambiare qualcosa in isolamento potrebbe sembrare buona in teoria, ma solo perché le modifiche adempimento di un contratto non significa restituire i risultati corretti.Per essere in grado di determinare che cosa i risultati corretti sono il necessario contesto e si ottiene che il contesto dal codice chiamante.

Um, loosely coupled apps sono l'obiettivo finale di tutti i buoni programmatori come in realtà fanno aumentare la flessibilità.Essere in grado di cambiare le cose in isolamento è fantastico, ed è l'unità di test per garantire ancora la restituzione di risultati adeguati.

Prima di tutti si arrabbiano, penso LINQ ha il suo posto e ha un grande futuro.Ma per complesse applicazioni data-intensive, io non penso che è pronto a prendere il posto di stored procedure.Questo era anche il parere avevo ripreso da un MVP al TechEd di quest'anno (che rimarrà senza nome).

EDIT:LINQ to SQL, Stored Procedure lato delle cose, è qualcosa che ho ancora bisogno di saperne di più a seconda di quello che trovo io possa modificare il mio sopra diatriba ;)

LINQ è nuovo e ha il suo posto.LINQ non è inventato per sostituire stored procedure.

Qui mi concentrerò su alcune prestazioni miti & CONTRO, solo per "LINQ to SQL", naturalmente potrei essere completamente sbagliato ;-)

(1)la Gente dice LINQ statment in grado di "cache" in SQL server, in modo da non perdere prestazioni.Parzialmente vero."LINQ to SQL" in realtà è il runtime traduzione di sintassi LINQ TSQL istruzione.Quindi, dal punto di vista delle prestazioni,un hard coded ADO.NET istruzione SQL non ha alcuna differenza rispetto a LINQ.

(2)Dato un esempio, un servizio di assistenza UI ha un "conto" di trasferimento di funzione.questa funzione potrebbe aggiornamento 10 tabelle di DB e tornare un po ' di messaggi in un solo colpo.Con LINQ, è necessario costruire una serie di affermazioni e di inviarli come una partita di SQL server.le prestazioni di questo si è tradotto LINQ->batch TSQL che possa uguagliare stored procedure.Motivo?perché è possibile modificare l'unità più piccola della dichiarazione Memorizzati procedue utilizzando il built-in SQL profiler e piano di esecuzione strumento, non si può fare questo in LINQ.

Il punto è che, quando si parla singola tabella DB e piccolo insieme di dati CRUD, LINQ è veloce come SP.Ma è molto più complicato di logica, stored procedure è più prestazioni tweakable.

(3)"LINQ to SQL" rende facilmente i neofiti di introdurre prestazioni maiali.Qualsiasi senior TSQL ragazzo può dire quando non usare il CURSORE (in pratica non si dovrebbe usare il CURSORE in TSQL nella maggior parte dei casi).Con LINQ e l'affascinante "foreach" loop con la query, È così facile per un principiante di scrivere questo codice:

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

Si può vedere questo facile decente codice è così attraente.Ma sotto il cofano .NET runtime just tradurre questo per un aggiornamento batch.Se ci sono solo 500 linee, questo è il 500 linea batch TSQL;Se ci sono milioni di linee, questo è un successo.Naturalmente, con esperienza utente di non utilizzare questo modo per fare questo lavoro, ma il punto è che è così facile cadere in questo modo.

Il miglior codice nessun codice, e con le stored procedure è necessario scrivere almeno un po ' di codice nel database e codice dell'applicazione per chiamare , mentre con LINQ to SQL o LINQ to Entities, non è necessario scrivere alcun codice di là di ogni altra query LINQ da parte di istanziare un oggetto di contesto.

LINQ sicuramente ha il suo posto nell'applicazione di database specifici e nelle piccole imprese.

Ma in una grande azienda, dove un database centralizzato servire come un hub di dati comune per molte applicazioni, abbiamo bisogno di astrazione.Abbiamo bisogno di gestire centralmente la sicurezza e la mostra di accesso storie.Abbiamo bisogno di essere in grado di fare analisi di impatto:se posso fare una piccola modifica al modello di dati per servire una nuova esigenza di business, quali query bisogno di essere cambiato e quali applicazioni hanno bisogno di essere ri-testato?Viste e Stored Procedure che mi danno.Se LINQ può fare tutto, e rendere i nostri programmatori più produttivi, ti accolgono -- qualcuno ha esperienza di utilizzo in questo tipo di ambiente?

Un DBA non ha libertà di fare modifiche per il modello di dati senza forzare per modificare il codice compilato.Con le stored procedure, è possibile nascondere questi i tipi di modifiche in una certa misura, dal momento che l'elenco dei parametri e set di risultati(s) tornato da una procedura di rappresentare il suo contratto, e le interiora può essere è cambiato tutto, a patto che il contratto è ancora incontrato.

Io davvero non vedere questo come un vantaggio.Essere in grado di cambiare qualcosa in isolamento potrebbe sembrare buona in teoria, ma solo perché le modifiche adempimento di un contratto non significa restituire i risultati corretti.Per essere in grado di determinare che cosa i risultati corretti sono il necessario contesto e si ottiene che il contesto dal codice chiamante.

IMHO, RAD = LINQ, RUP = Stored Procedure.Ho lavorato per una grande azienda di Fortuna 500 per molti anni, a molti livelli, tra cui la gestione, e francamente, non avrei mai assumere RUP sviluppatori a fare RAD sviluppo.Sono così isolati che hanno una conoscenza molto limitata di ciò che succede in altri livelli del processo.Con un silos ambiente, ha senso dare Dba controllo dei dati attraverso specifici punti di entrata, perché gli altri francamente non conoscere il modo migliore per realizzare la gestione dei dati.

Ma le grandi imprese spostare dolorosamente lento nello sviluppo arena, e questo è estremamente costoso.Ci sono momenti in cui avete bisogno di muoversi più velocemente per risparmiare tempo e denaro, e LINQ prevede che e più in picche.

A volte penso che gli amministratori di database sono prevenuto nei confronti di LINQ, perché pensano di non minaccia la loro sicurezza del lavoro.Ma questa è la natura della bestia, signore e signori.

Penso che avete bisogno di andare con le procedure per qualcosa di reale.

A) la Scrittura di tutta la vostra logica in linq significa che il database è meno utile, perché solo la vostra applicazione può consumare.

B) io non sono convinto che la modellazione degli oggetti è meglio di modellazione relazionale comunque.

C) la Sperimentazione e lo sviluppo di una stored procedure in SQL è un inferno di molto più veloce di una compilazione di modifica del ciclo in qualsiasi ambiente Visual Studio.Si modifica, F5 e premere selezionare e tu sei fuori per le gare.

D) È più facile da gestire e distribuire le stored procedure di assemblee..basta mettere i file sul server e premere F5...

E) Linq to sql ancora scrive di merda codice a volte, quando non ce l'aspettiamo.

Onestamente, penso che l'ultima cosa sarebbe per MS per aumentare di t-sql in modo che si può fare un join proiezione impliclitly il modo linq fa.t-sql dovrebbe sapere se si voleva fare ordine.per determinate partite singole.parte, per esempio.

LINQ non vietare l'uso di stored procedure.Ho usato la modalità mista con LINQ-SQL e LINQ-storedproc.Personalmente, sono contento che non devo scrivere stored procedure....pwet-tu.

Inoltre, c'è la questione della possibile 2.0 rollback.Fidati di me è capitato a me un paio di volte, quindi sono sicuro che è accaduto ad altri.

Sono anche d'accordo che l'astrazione è il migliore.Insieme con il fatto, lo scopo originale di un ORM è quello di rendere RDBMS partita bene per le OO concetti.Tuttavia, se tutto ha funzionato bene prima di LINQ da dover discostano un po ' dalle OO concetti poi la vite di 'em.I concetti e la realtà non sempre si adattano bene insieme.Non c'è spazio per i militanti fanatici in ESSO.

Sto assumendo che si intende Linq To Sql

Per qualsiasi CRUD comando è facile per un profilo delle prestazioni di una stored procedure vs.qualsiasi tecnologia.In questo caso l'eventuale differenza tra i due sarà trascurabile.Tenta di profilatura per un 5 (di tipo semplice) oggetto del campo di oltre 100.000 query di selezione per scoprire se c'è una reale differenza.

D'altra parte il vero affare-breaker sarà la domanda che ci si sente confortevole, mettendo a vostra logica di business sul database o non, che è un argomento contro le stored procedure.

Secondo il guru, posso definire la LINQ come moto e SP auto.Se si vuole andare per un breve viaggio e solo di piccoli passeggeri(in questo caso 2), andare con grazia, con LINQ.Ma se si vuole andare per un viaggio e dispongono di una grande band, penso che si dovrebbe scegliere SP.

In conclusione, la scelta tra moto o auto è dipende dal vostro itinerario (business), lunghezza (il tempo) e passeggeri (dati).

Speranza che aiuta, I può essere sbagliato.:D

Tutte queste risposte, pendente verso LINQ sono principalmente parlando di FACILITÀ di SVILUPPO, che è più o meno legati alla scarsa qualità della codificazione o la pigrizia nel codice.Io sono solo.

Alcuni vantaggi o Linq, ho letto qui , facile da testare, per facilitare il debug ecc, ma queste non sono collegate all'output Finale o utente finale.Questo è sempre andando a causare problemi con l'utente finale in termini di prestazioni.Che cosa è il punto di caricamento molte cose in memoria e quindi l'applicazione di filtri usando LINQ?

Di nuovo TypeSafety, è la cautela che "stiamo attenti per evitare di sbagliato typecasting" che, di nuovo, di scarsa qualità, stiamo cercando di migliorare utilizzando linq.Anche in quel caso, se non altro in modifiche al database, ad esempiodimensione della Stringa di colonna, quindi linq ha bisogno di essere ri-compilato e non sarebbe typesafe senza che ..Ho provato.

Anche se, abbiamo scoperto che è buona, dolce, interessante, ecc mentre si lavora con LINQ, ha taglio svantaggio di rendere sviluppatore pigro :) e si è dimostrato 1000 volte che non è male (può essere peggiore) di prestazioni rispetto a Stored Procedure.

Smettere di essere pigro.Sto cercando di.:)

Stored Procedure vs Codice (Discussione precedente)

Per semplici operazioni CRUD con un unico punto di accesso ai dati, direi andare per LINQ se ti trovi bene con la sintassi.Per di più complicato di logica penso sprocs sono più vicinanza a mezzi pubblici prestazioni-saggio, se siete bravi a T-SQL e le sue operazioni più avanzate.Hai anche l'aiuto da parte di Ottimizzazione guidata di SQL Server Profiler, il debug di query di sql server management studio, ecc.

Stored procedure rende il test più facile e si può modificare la query senza toccare il codice dell'applicazione.Anche con linq, la possibilità di ottenere dati non significa che i dati giusti.E testare la correttezza dei dati comporta l'esecuzione dell'applicazione, ma con stored procedure è facile di testare senza toccare l'applicazione.

Il risultato può essere riassunto come

LinqToSql per siti di piccole dimensioni, e prototipi.È davvero risparmiare tempo per la creazione di prototipi.

Sps :Universale.Posso ottimizzare la mia query e controllare sempre ActualExecutionPlan / EstimatedExecutionPlan.

Create PROCEDURE userInfoProcedure
    -- Add the parameters for the stored procedure here
    @FirstName varchar,
    @LastName varchar
AS
BEGIN

    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT FirstName  , LastName,Age from UserInfo where FirstName=@FirstName
    and LastName=@FirstName
END
GO

http://www.totaldotnet.com/Article/ShowArticle121_StoreProcBasic.aspx

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

A volte complessi per il recupero dei dati potrebbe essere necessario stored procedure.E a volte si desidera che altre persone a utilizzare il stored procedure in Sql Server Management Studio.

Linq to Entities è grande per una rapida CRUD di sviluppo.

Certo che si può creare un'applicazione utilizzando solo uno o l'altro.Oppure si può mescolare.Tutto si riduce alle vostre esigenze.Ma SQL stored procedure non andare via in qualunque momento presto.

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