2010-12-09 26 views
57

Bazı ıstıraplar okuyorum, ama hala kafam karıştı. Niye ya? çünkü bahsettiğiniz farklılıklar performansla ilgili değil. Kolay kullanımla ilgilidirler. (Objetc (ölçütler) ve SQL (hql)). Ama "kriterler" in bir nedenden dolayı hql'den daha yavaş olup olmadığını bilmek isterim.Hibernate Criteria vs HQL: hangisi daha hızlı?

başka anwers

bu okuma "HQL ve criteriaQuery, sen criteriaQuery kullanarak bir sorgu ateş her şey arasındaki performans açısından bir fark yoktur, içeri yansıtmamaktadır tablo adı için yeni ad oluşturur Herhangi bir DB için son sorgulanmış önbellek, bu, oluşturulan SQL'in derlenmesini sağlamak için daha fazla zaman harcar. Varun Mehta tarafından.

Bu çok yakın AMA! Başka bir web sitesinde okudum (http://gary-rowe.com/agilestack/tag/hibernate/) Bu artık Hibernate 3.3 ve üstü ile ilgili bir durum değil (lütfen şunu okuyun: 9) Hazırda olduğu için SQL tarafından oluşturulan hazırda yavaştır. Kriterler arabirimi tutarlı değil)

Farklılıkları bulmaya çalışırken bazı testler yaptım, ancak her ikisi de qry'leri oluşturuyor ve takma ad tablosunu değiştirmiyor.

Çok kafam karıştı. Eğer birisi ana sebebi bilirse, bize yardım edebilir misiniz? Teşekkürler

cevap

2

Çoğunlukla dinamik sorgular için Ölçüt Sorgularını tercih ediyorum. Örneğin, bir takım değişkenleri dinamik olarak eklemek veya bazı parametrelere bağlı olarak bazı parçaları (örneğin, kısıtlamaları) dışarıda bırakmak çok daha kolaydır.

Diğer yandan, HQL'yi anlamak/okumak daha kolay olduğundan statik ve karmaşık sorgular için HQL kullanıyorum. Ayrıca, HQL biraz daha güçlü, bence, örn. farklı birleştirme türleri için.

JPA and Hibernate - Criteria vs. JPQL or HQL

+2

Kriterler, HQL'nin yapabileceği birleştirme türlerinin çoğunu yapabilir, ancak bazen biraz garip veya anlaşılması zor olsa da (en azından benim düşüncemde). HQL'nin okunması daha kolay! –

+1

BTW, cevabınıza oy verdim ... ama kcobuntu'nun sorusuna gerçekten cevap vermediniz. –

+23

Başka birinin cevabını kopyalayacaksanız, en azından bundan bahsetmelisiniz. Orijinal cevaba bağlantı: http://stackoverflow.com/a/197496/980103 –

124

2004 yılında geri hazırda 3 sorgu tercüman yazan adam değilim, bu yüzden bunun nasıl yapıldığı hakkında bir şeyler biliyorum. Kriterler, teoride, bir HQL sorgusundan daha az tepegözüne sahip olmalıdır (alacağım adlandırılmış sorguları hariç). Bunun nedeni, Kriterleri hiçbir şeyi ayrıştırmak zorunda değil. HQL sorguları bir ANTLR tabanlı çözümleyici ile ayrıştırılır ve sonuçta ortaya çıkan AST, SQL'e dönüştürülür. Ancak, HQL/JPAQL ile, SessionFactory başlatıldığında SQL'in oluşturulduğu adlandırılmış sorguları tanımlayabilirsiniz. Teoride, adlandırılmış sorguların Kriterlere göre daha az başı vardır.

Yani, SQL nesil yükü bakımından elimizdeki:

HQL/JPAQL Sorgu Named
  1. - SQL üretimi sadece bir kez olur.
  2. Kriterler - Oluşturmadan önce ayrıştırmaya gerek yoktur.
  3. (adlandırılmamış) HQL/JPAQL Sorgu - Ayrıştırma, sonra üret. ayrıştırma ve SQL nesil yükü göre sorgu tekniğini seçerken
  4. söyledi

, muhtemelen Bence bir hata olduğunu. Gerçek verilerle gerçek bir veri tabanı sunucusunda gerçek bir sorgulamanın yapılmasıyla karşılaştırıldığında, bu yük genellikle çok küçüktür. Uygulamanın profilini görüntülerken bu ek yük gerçekten görünürse, belki de adlandırılmış bir sorguya geçmelisiniz.İşte

Kriterleri ve HQL/JPAQL arasında karar verirken bunu göz önünde şeylerdir:

  • Öncelikle, içinde hazırda-tescilli API üzerinde bağımlılık sahip Tamam iseniz karar vermek zorunda senin kodun. JPA’da Kriterler yok.
  • Kriterler, çok parametreli bir 'arama formu' olan tipik bir web sayfasında bulabileceğiniz gibi birçok isteğe bağlı arama parametresi'u işlemede gerçekten iyidir. HQL ile, geliştiriciler StringBuilder (bunu önlemek için!) ile yan tümce ifadelerinin nerede olduğunu anlama eğilimindedir. Ölçütlerle, bunu yapmanız gerekmez. Hardik benzer görüşler yayınladı.
  • HQL/JPAQL diğer birçok şey için kullanılabilir, çünkü kod geliştiricilerin anlaması için daha küçük ve daha kolay olma eğilimindedir.
  • HQL kullanıyorsanız, sık sık sorgular adlandırılmış sorgulara dönüştürülebilir. Bunu bir profil yaptıktan sonra yapmayı tercih ederim.
+0

'JPA kriterlere sahip değil? – destan

+3

@destan JPA 2.x'ten itibaren, öyle. IIRC, JPA 1.x değil. –

+0

@JoshuaDavis Mükemmel açıklama. Sadece HQL'yi oluşturmak için StringBuilder'ı kullanmaktan kaçınmamız gerektiğini bilmek istiyorum. Örneğin isteğe bağlı parametrelerle ne yapmalı? –

6

Milyonlarca kayıt üzerinde çalışıyorum. HQL'nin Kriterler'den çok daha hızlı olduğunu gördüm. Kriterler performansta çok şey çekiyor.

Çok fazla veri ile uğraşıyorsanız, HQL'ye gidin.

+2

Bu bana pek bir şey ifade etmiyor.Gerçekten büyük bir veri kümeniz varsa, çoğu zaman veritabanının sorguyu işleyebilmesi için beklenir. SQL'in HQL'den veya Kriterlerden üretilmesi için gereken süre bu durumda önemli değildir. JPAQL adlı sorguları kullanan tek zaman vs 'straight' JPAQL vs Criteria aynı sorguyu yaptığınız zamandır * çok kez *. Veri kümesinin boyutu hiç önemli değil. –

+1

Ölçütleri doğru şekilde kullanmadınız mı? Veya milyonlarca kaydınızın her biri için yeni bir Kriterler Sorgusu nesnesi oluşturdunuz mu? – vinodn

3

Diğer Avantajları ben HQL üzerinde Kriterleri için düşünüyorum:

Yazma HQL kod dağınık hale getirir. Artık Nesne Yönelimli Kod yazımı gibi görünmüyor.

Kriterler Sorguları yazarken, IDE bize Intellisense önerir, bu nedenle çift tırnak içinde değişken adlar gibi bir şey yazdığımız zamanlar dışında hata yapma şansımız daha az olur.

1

Haklısınız ve değilsiniz. Sonuç listesi, veritabanı veya önbellekten org.hibernate.loader.Loader sınıfı ile alınır. Önbellek etkinleştirilmediğinde, hazırlanan deyim SessionFactoryImp'te oluşturulan Dialect nesnesi kullanılarak oluşturulur. Yani, liste başına çağrı başlatılır. Ayrıca, düşük düzeyli sorgu otomatik olarak oluşturulur. Temel olarak, bu bir yardımdır, ancak belirli bir sorgu elle yazıldığında daha etkili olduğunda bir durum olabilir.