2015-08-12 21 views
5

Görünümler (annotation @Subselect ve @Synchronize) ile hibernate kullanıyorum ve filtreler. Sorun, hazırda bulunan kapsülleyme sorgusudur (@Subselect ek açıklamasının 'value' özelliğiyle tanımlanır) ve performanslar çok yavaş olur. Ben (yürütmek için fazla 100ms alır etmez) Kendi SQL sorgusu yazma ÖrneğinGörünüm ve filtrelerle hazırda bekletme sorgusu nasıl engellenir?

, bu böyledir: Ben filtreleri ile hazırda bekleme kullanılıyorsa

SELECT id, 
     country_id, 
     firstName, 
     lastName 
FROM client 
WHERE client.country_id IN (2564,2558,1452,3652) 

Ama oluşturulan sorgu olacak :

Bu (iç içe sorguda) 'müşteri' tablosunun tüm satırları yüklenir çünkü hazırda tarafından oluşturulan SQL elle yazılmış benim sql sorgusu daha yavaştır ve filtre işlemi ana sorguda infaz anlamına gelir
SELECT _this.id   AS id1_0_0, 
     _this.country_id AS country_id2_0_0 
     _this.firstName AS firstName3_0_0, 
     _this.lastName AS lastName4_0_0 
FROM (
    SELECT id, 
      country_id, 
      firstName, 
      lastName 
    FROM client 
) _this 
WHERE _this.country_id2_0_0 IN (2564,2558,1452,3652) 

tüm satırları yükledikten sonra, bu aptalca ve çok yavaş performansları (1.7sec vs 100ms daha az). Yani, bunu önlemek için bir yöntem bilen var mı?

+0

Olabilir daha fazla tabloları ilişkin temel bilgi, db sürümü ve açıklamalı sınıfları) sahip olması gerekir için @ Subselect'in tanımını gönderiyor musunuz? –

+0

@Subselect, bir sınıf/alan üzerinde eklenmiş ek açıklamadır (gerçekten uygun bir şekilde adlandırılmıştır). Ancak filtreler iç içe geçmiş sorgu için neden geçerli değildir? – SnakePlissken

+4

Her iyi düzenleyici, dış durumu Türetilmiş Tabloya itmeli, yani 2. sorguyu 1.ye yeniden yazmalıdır. DBMS'niz nedir? – dnoeth

cevap

0

Burada çeşitli sorunlar ve çözümleri görebilirsiniz:

  1. bakış, @Subselect ek açıklama önleyebilirsiniz eğer hiç => Sen istenen verileri döndürür veritabanında bir görünüm oluşturabilirsiniz eğer tüm senaryo ve sonuçları (hazırda bekleme eşlemesi) çok daha kolay hale getirecek (neden hazırda bekletmeli veya bir şeyi optimize etmeli, bu veritabanları gerçekten optimize edilmiş ve tasarlanmalıdır)
  2. Hazırda bekletme, veritabanınız için açıkça optimize edilmiş bir kod üretmez (versiyon) => daha yeni bir Hazırda Bekletme sürümüne geçmeyi veya db'ye özgü ipuçlarını/yapılandırmasını (lehim, satıcı vb.) Etkilemeye çalışın
  3. veritabanı, sorgunuzu optimize etmede iyi bir iş yapmaz (filtre aşağı itilir) ve çok yaygın bir optimizasyon stratejisinde çok zayıf =>Daha yeni bir db sürümüne geçmeyi veya mümkünse DBMS'u değiştirmeyi deneyin (örn. PostgreSQL daha ileride sorunlar burada

beklenen olduğundan, Oracle, ...) (daha spesifik ayrıntılar gerçekten

İlgili konular