Domanda

Quali sono le differenze Performance tra HQL e criteriapi e QUERYOVER?Ci sono situazioni in cui uno è più veloce o più lento dell'altro?

Modifica: ho esteso la domanda con QUERYOVER e LINQ.

=============================================

.

Bene, non sono sicuro di quale risposta al contrassegno come risposta, quindi segnerò i post con la maggior parte dei votaup.Non lo so.Questa è in realtà più discussione di una domanda.

È stato utile?

Soluzione

Le caratteristiche delle prestazioni tra ICriteria e HQL variano da poco (non so di querover) per una semplice ragione.

Le query ICRITERIA saranno per impostazione predefinita, prova a implementare le tue strategie di recupero come definito nella tua mappatura mentre HQL di default considera tutto pigro e dipende dalle dichiarazioni di joul all'interno della tua query per definire ciò che è accattivante o no.

Inoltre, iCriteria dipende dalla mappatura per il parametro che passa mentre HQL consente i tipi di parametri espliciti E.G. Iquery.setint32 ("foopram", 5);

Ciò che conta davvero è la plugtà delle query ICRITERI (vedi ICRITERIA.Createcrediteria (). Createcrediteria () ecc.) Dove il motore NH dovrà risolvere l'iCriteria e provare a generare il più valido SQL.

Nel lato opposto è probabilmente più facile da prevedere se una query HQL produrrà risultati coerenti e come tale rende più facile l'utilizzo della queryscache.

In entrambi i casi la configurazione viene generata una volta con le definizioni di creazione e mappatura della creazione di IessionFactory e cosa non sono in memoria, quindi le prestazioni sono buone.

La generazione di SQL effettiva viene resa in modo diverso tra i due e questa è la ragione per cui un'utilità per iCriteria -> HQL non esiste.

Alla fine, la mia esperienza mi ha mostrato che le prestazioni tra il 2 sono probabilmente lo stesso dare o prendere alcuni millisecondi.

Come nota laterale, dichiarando il più possibile nella mappatura comporterà la generazione di SQL più concisa e il funzionamento NHIBERNate, ad esempio per le proprietà della stringa che la mappatura del Length nel .hbm.xml si tradurrà in lunghezze di stringa di Norbio prima di andare al database.

Altri suggerimenti

Per quanto riguarda il queryover, ci aspetterei che le prestazioni siano identiche al criterio API, poiché è costruito come un'estensione di quell'aPI.Quindi per query equivalenti nelle due API che mi aspetterei che la stessa query del database venga generata.L'unica differenza che ho notato tra le interfacce di queryover e criteri è che trovo l'interfaccia di queryover per essere "pulitore" e più piacevole da lavorare con.

Nella mia esperienza il criterio API ha ricevuto più "amore" rispetto all'interfaccia HQL.Ho incontrato casi in cui ho potuto esprimere determinate domande con l'interfaccia dei criteri che non ho potuto trovare un modo equivalente per esprimere nell'interfaccia HQL.

Per quanto riguarda le prestazioni, trovo il modo in cui la query è "richiesta" ha più il cuscinetto sulle prestazioni rispetto alla selezione di criteri API contro HQL rispetto a QUERYOVER.Userei l'interfaccia che ti fornisce la vestibilità più naturale al tuo pensiero.

QUERYOVER è un'ottima sostituzione dei criteri per molti aspetti a causa della sintassi migliorata e della sicurezza del tipo. Tuttavia, va notato che l'elaborazione delle espressioni lambda nel questover può essere costoso (e immagino che la stessa cosa si applicherebbe per le query LINQ). Quindi, mentre esegue la query SQL finale non richiede più di altri metodi (ICRITERIA, HQL), convertendo l'oggetto query sulla query SQL appropriata richiede più a lungo.

Ad esempio, abbiamo sviluppato un'applicazione che esegueva in esecuzione centinaia di query di query di domande al secondo (usando il supporto di batching ADO.NET) e abbiamo trovato la conversione delle query in ICRITERIA quasi raddoppiata la nostra capacità di eseguire le query e l'utilizzo di CPU dimezzato . Immagino che il sovraccarico sia coinvolto nell'elaborazione dell'espressione di lambda possa essere ridotta se si utilizza la cache di secondo livello e la cache della query; Ma poiché questo non è adatto per la nostra applicazione, non l'ho fatto io stesso.

Per quanto riguarda la tua domanda più generale su cui è più veloce: dipende davvero. L'unico modo di raccogliere il fuoco sicuro è eseguire uno strumento di profilazione (NHProf funziona meraviglie per scenari come questo). Ma in generale, HQL è il più vicino a SQL e quindi il più flessibile, consentendo un po 'più di portata di ottimizzare le tue domande. Tuttavia, per la stragrande maggioranza delle query di complessità semplice alle intermediali, c'è poco alcuna differenza tra iCriteria e HQL. E le query iCriteria sono molto più facili da lavorare se le tue query sono costruite dinamicamente.

Devo ancora trovare alcuna differenza tra i due.Detto questo - HQL ha funzionalità che non è disponibile nei criteri-API.

Principalmente è una questione di stile e preferenza personale se usi il primo o il secondo.E la traduzione dalla tua query a SQL non spiega molto quando si tratta di interrogare.

Dalle persone che conoscono più di me: http://ayende.com/blog/Archive/2009/06/01/NARIBERNATE-QUERIES-NDASH-SHOURD-IUSE-HQL-OR-CRITERIA.aspx

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