SlideShare a Scribd company logo
OTTIMIZZARE LE QUERY
WORKFLOW QUERY
Metodi dei Dao
Query HQL/JPQL
Query SQL
Database
ResultSet
Entities
Spring Data JPA
Hibernate
JDBC
Hibernate
1
2
3
1: OTTIMIZZARE LE QUERY
HQL
• Servono tutti i dati che la query HQL richiede?
• Basta un count(*)?
• Bastano delle entity più piccole? Dei singoli field?
• Si fanno manipolazioni sul risultato, che sarebbe
più semplice far eseguire a Hibernate?
1: OTTIMIZZARE LE QUERY
HQL
• Passaggio di Entity alla query: usare getReference().
Place p = placeImplDao.get(id);
placeBO.doSomething(p, …);
Place p = entityManager.getReference(PlaceImpl.class, id);
2: MIGLIORARE LA
TRADUZIONE IN SQL
• Le entity hanno collezioni eager che non servono?
• Le entity hanno riferimenti eager ad altre entity?
3: CAMBIARE I COSTRUTTI
SQL
• Code Smell in SQL:
• Subquery (invece che join): 

where x in (select y from…)
• Clausole or (possono invalidare gli indici)
@Query("select distinct(i.id) from InletPlaceStrategy i, PlaceConnection pc" +
" where i.visible = ?1" +
" and ((i.id = pc.fromPlace and pc.toPlace in (?2)” +
“ and pc.type.name = ?3 “ +
“ and pc.distance = ?4)” +
" or (i.id = pc.toPlace “ and pc.fromPlace in (?2) “ +
“ and pc.type.name = ?3 “ +
“ and pc.distance = ?4)” +
”)")
Stream<Long> findByVisibleAndConnected(boolean b, List<Long> connectedIds,
String type, long distance);
#11345
@Query("select distinct(i.id) from InletPlaceStrategy i, PlaceConnection pc" +
" where i.visible = ?1" +
" and i.id = pc.fromPlace" +
" and pc.toPlace = ?2" +
" and pc.type.name = ?3" +
" and pc.distance = ?4")
Stream<Long> findByVisibleAndConnectedByFrom(boolean b, Long connectedId,
String type, long distance);
@Query("select distinct(i.id) from InletPlaceStrategy i, PlaceConnection pc" +
" where i.visible = ?1" +
" and i.id = pc.toPlace" +
" and pc.fromPlace = ?2" +
" and pc.type.name = ?3" +
" and pc.distance = ?4")
Stream<Long> findByVisibleAndConnectedByTo(boolean b, Long connectedId,
String type, long distance);
USARE GLI INDICI
• Gli indici vengono usati se:
• Non ci sono clausole SQL or
• Esiste un indice sui campi specificati nella clausola
where, elencati nello stesso ordine.
• A volte, solo se si esprime un ordine sui suddetti
campi.
COME CONOSCERE LA
QUERY SQL
• spring.jpa.properties.hibernate.show_sql=true
• Con l’esperienza.
• Usando XRebel.
COME CAPIRE SE LA QUERY
USA GLI INDICI
• Con explain select …
• Con explain analyze select…

More Related Content

More from Federico Russo

23 Sicurezza in BBox
23 Sicurezza in BBox23 Sicurezza in BBox
23 Sicurezza in BBox
Federico Russo
 
21 Buzzwords
21 Buzzwords21 Buzzwords
21 Buzzwords
Federico Russo
 
18 - InfluxDB
18 - InfluxDB18 - InfluxDB
18 - InfluxDB
Federico Russo
 
19 - The Highlander Project
19 - The Highlander Project19 - The Highlander Project
19 - The Highlander Project
Federico Russo
 
22 - Better Coding
22 - Better Coding22 - Better Coding
22 - Better Coding
Federico Russo
 
17 - Web Application Threats
17 - Web Application Threats17 - Web Application Threats
17 - Web Application Threats
Federico Russo
 
16 - Project Lombok
16 - Project Lombok16 - Project Lombok
16 - Project Lombok
Federico Russo
 
15 - Java 8
15 - Java 815 - Java 8
15 - Java 8
Federico Russo
 
14 - Atom
14 - Atom14 - Atom
14 - Atom
Federico Russo
 
Slides functionalities 0.26-r16
Slides   functionalities 0.26-r16Slides   functionalities 0.26-r16
Slides functionalities 0.26-r16Federico Russo
 
BBox e vaadin7
BBox e vaadin7BBox e vaadin7
BBox e vaadin7
Federico Russo
 
Box Functionalities 0.20
Box Functionalities 0.20Box Functionalities 0.20
Box Functionalities 0.20
Federico Russo
 
Tile server
Tile serverTile server
Tile server
Federico Russo
 
Vaadin7
Vaadin7Vaadin7
08 Workflow e strumenti web
08 Workflow e strumenti web08 Workflow e strumenti web
08 Workflow e strumenti webFederico Russo
 

More from Federico Russo (20)

23 Sicurezza in BBox
23 Sicurezza in BBox23 Sicurezza in BBox
23 Sicurezza in BBox
 
21 Buzzwords
21 Buzzwords21 Buzzwords
21 Buzzwords
 
18 - InfluxDB
18 - InfluxDB18 - InfluxDB
18 - InfluxDB
 
19 - The Highlander Project
19 - The Highlander Project19 - The Highlander Project
19 - The Highlander Project
 
22 - Better Coding
22 - Better Coding22 - Better Coding
22 - Better Coding
 
17 - Web Application Threats
17 - Web Application Threats17 - Web Application Threats
17 - Web Application Threats
 
16 - Project Lombok
16 - Project Lombok16 - Project Lombok
16 - Project Lombok
 
15 - Java 8
15 - Java 815 - Java 8
15 - Java 8
 
14 - Atom
14 - Atom14 - Atom
14 - Atom
 
Slides functionalities 0.26-r16
Slides   functionalities 0.26-r16Slides   functionalities 0.26-r16
Slides functionalities 0.26-r16
 
BBox e vaadin7
BBox e vaadin7BBox e vaadin7
BBox e vaadin7
 
Box Functionalities 0.20
Box Functionalities 0.20Box Functionalities 0.20
Box Functionalities 0.20
 
Tile server
Tile serverTile server
Tile server
 
Vaadin7
Vaadin7Vaadin7
Vaadin7
 
12 java modifiers
12 java modifiers12 java modifiers
12 java modifiers
 
10 Data caching
10 Data caching10 Data caching
10 Data caching
 
11 Java 7
11 Java 711 Java 7
11 Java 7
 
08 Workflow e strumenti web
08 Workflow e strumenti web08 Workflow e strumenti web
08 Workflow e strumenti web
 
06 Refactoring
06 Refactoring06 Refactoring
06 Refactoring
 
09 Transactions
09 Transactions09 Transactions
09 Transactions
 

Recently uploaded

onvegno SPEKTRA da A2A - 28 maggio 2024 | COLLA Simone
onvegno SPEKTRA da A2A - 28 maggio 2024 | COLLA Simoneonvegno SPEKTRA da A2A - 28 maggio 2024 | COLLA Simone
onvegno SPEKTRA da A2A - 28 maggio 2024 | COLLA Simone
Servizi a rete
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | TROIANO Luigia
Convegno SPEKTRA da A2A - 28 maggio 2024 | TROIANO LuigiaConvegno SPEKTRA da A2A - 28 maggio 2024 | TROIANO Luigia
Convegno SPEKTRA da A2A - 28 maggio 2024 | TROIANO Luigia
Servizi a rete
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | UBERTI FOPPA Bianca
Convegno SPEKTRA da A2A - 28 maggio 2024 | UBERTI FOPPA BiancaConvegno SPEKTRA da A2A - 28 maggio 2024 | UBERTI FOPPA Bianca
Convegno SPEKTRA da A2A - 28 maggio 2024 | UBERTI FOPPA Bianca
Servizi a rete
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | VEIRANA Francesco
Convegno SPEKTRA da A2A - 28 maggio 2024 | VEIRANA FrancescoConvegno SPEKTRA da A2A - 28 maggio 2024 | VEIRANA Francesco
Convegno SPEKTRA da A2A - 28 maggio 2024 | VEIRANA Francesco
Servizi a rete
 
BIM obblighi e opportunità (nicolafurcolo.it) R.pdf
BIM obblighi e opportunità (nicolafurcolo.it) R.pdfBIM obblighi e opportunità (nicolafurcolo.it) R.pdf
BIM obblighi e opportunità (nicolafurcolo.it) R.pdf
Nicola Furcolo
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | NERELLI Andrea
Convegno SPEKTRA da A2A - 28 maggio 2024 | NERELLI AndreaConvegno SPEKTRA da A2A - 28 maggio 2024 | NERELLI Andrea
Convegno SPEKTRA da A2A - 28 maggio 2024 | NERELLI Andrea
Servizi a rete
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | RUGGIERI Alfredo
Convegno SPEKTRA da A2A - 28 maggio 2024 | RUGGIERI AlfredoConvegno SPEKTRA da A2A - 28 maggio 2024 | RUGGIERI Alfredo
Convegno SPEKTRA da A2A - 28 maggio 2024 | RUGGIERI Alfredo
Servizi a rete
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | CARNI Marco
Convegno SPEKTRA da A2A - 28 maggio 2024 | CARNI MarcoConvegno SPEKTRA da A2A - 28 maggio 2024 | CARNI Marco
Convegno SPEKTRA da A2A - 28 maggio 2024 | CARNI Marco
Servizi a rete
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | BERTELLA Alessio
Convegno SPEKTRA da A2A - 28 maggio 2024 | BERTELLA AlessioConvegno SPEKTRA da A2A - 28 maggio 2024 | BERTELLA Alessio
Convegno SPEKTRA da A2A - 28 maggio 2024 | BERTELLA Alessio
Servizi a rete
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | ORSENIGO Tiziano
Convegno SPEKTRA da A2A - 28 maggio 2024 | ORSENIGO TizianoConvegno SPEKTRA da A2A - 28 maggio 2024 | ORSENIGO Tiziano
Convegno SPEKTRA da A2A - 28 maggio 2024 | ORSENIGO Tiziano
Servizi a rete
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | ALESIANO Yuri
Convegno SPEKTRA da A2A - 28 maggio 2024 | ALESIANO YuriConvegno SPEKTRA da A2A - 28 maggio 2024 | ALESIANO Yuri
Convegno SPEKTRA da A2A - 28 maggio 2024 | ALESIANO Yuri
Servizi a rete
 

Recently uploaded (11)

onvegno SPEKTRA da A2A - 28 maggio 2024 | COLLA Simone
onvegno SPEKTRA da A2A - 28 maggio 2024 | COLLA Simoneonvegno SPEKTRA da A2A - 28 maggio 2024 | COLLA Simone
onvegno SPEKTRA da A2A - 28 maggio 2024 | COLLA Simone
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | TROIANO Luigia
Convegno SPEKTRA da A2A - 28 maggio 2024 | TROIANO LuigiaConvegno SPEKTRA da A2A - 28 maggio 2024 | TROIANO Luigia
Convegno SPEKTRA da A2A - 28 maggio 2024 | TROIANO Luigia
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | UBERTI FOPPA Bianca
Convegno SPEKTRA da A2A - 28 maggio 2024 | UBERTI FOPPA BiancaConvegno SPEKTRA da A2A - 28 maggio 2024 | UBERTI FOPPA Bianca
Convegno SPEKTRA da A2A - 28 maggio 2024 | UBERTI FOPPA Bianca
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | VEIRANA Francesco
Convegno SPEKTRA da A2A - 28 maggio 2024 | VEIRANA FrancescoConvegno SPEKTRA da A2A - 28 maggio 2024 | VEIRANA Francesco
Convegno SPEKTRA da A2A - 28 maggio 2024 | VEIRANA Francesco
 
BIM obblighi e opportunità (nicolafurcolo.it) R.pdf
BIM obblighi e opportunità (nicolafurcolo.it) R.pdfBIM obblighi e opportunità (nicolafurcolo.it) R.pdf
BIM obblighi e opportunità (nicolafurcolo.it) R.pdf
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | NERELLI Andrea
Convegno SPEKTRA da A2A - 28 maggio 2024 | NERELLI AndreaConvegno SPEKTRA da A2A - 28 maggio 2024 | NERELLI Andrea
Convegno SPEKTRA da A2A - 28 maggio 2024 | NERELLI Andrea
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | RUGGIERI Alfredo
Convegno SPEKTRA da A2A - 28 maggio 2024 | RUGGIERI AlfredoConvegno SPEKTRA da A2A - 28 maggio 2024 | RUGGIERI Alfredo
Convegno SPEKTRA da A2A - 28 maggio 2024 | RUGGIERI Alfredo
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | CARNI Marco
Convegno SPEKTRA da A2A - 28 maggio 2024 | CARNI MarcoConvegno SPEKTRA da A2A - 28 maggio 2024 | CARNI Marco
Convegno SPEKTRA da A2A - 28 maggio 2024 | CARNI Marco
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | BERTELLA Alessio
Convegno SPEKTRA da A2A - 28 maggio 2024 | BERTELLA AlessioConvegno SPEKTRA da A2A - 28 maggio 2024 | BERTELLA Alessio
Convegno SPEKTRA da A2A - 28 maggio 2024 | BERTELLA Alessio
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | ORSENIGO Tiziano
Convegno SPEKTRA da A2A - 28 maggio 2024 | ORSENIGO TizianoConvegno SPEKTRA da A2A - 28 maggio 2024 | ORSENIGO Tiziano
Convegno SPEKTRA da A2A - 28 maggio 2024 | ORSENIGO Tiziano
 
Convegno SPEKTRA da A2A - 28 maggio 2024 | ALESIANO Yuri
Convegno SPEKTRA da A2A - 28 maggio 2024 | ALESIANO YuriConvegno SPEKTRA da A2A - 28 maggio 2024 | ALESIANO Yuri
Convegno SPEKTRA da A2A - 28 maggio 2024 | ALESIANO Yuri
 

20 - Ottimizzare le query

  • 2. WORKFLOW QUERY Metodi dei Dao Query HQL/JPQL Query SQL Database ResultSet Entities Spring Data JPA Hibernate JDBC Hibernate 1 2 3
  • 3. 1: OTTIMIZZARE LE QUERY HQL • Servono tutti i dati che la query HQL richiede? • Basta un count(*)? • Bastano delle entity più piccole? Dei singoli field? • Si fanno manipolazioni sul risultato, che sarebbe più semplice far eseguire a Hibernate?
  • 4. 1: OTTIMIZZARE LE QUERY HQL • Passaggio di Entity alla query: usare getReference(). Place p = placeImplDao.get(id); placeBO.doSomething(p, …); Place p = entityManager.getReference(PlaceImpl.class, id);
  • 5. 2: MIGLIORARE LA TRADUZIONE IN SQL • Le entity hanno collezioni eager che non servono? • Le entity hanno riferimenti eager ad altre entity?
  • 6. 3: CAMBIARE I COSTRUTTI SQL • Code Smell in SQL: • Subquery (invece che join): 
 where x in (select y from…) • Clausole or (possono invalidare gli indici)
  • 7. @Query("select distinct(i.id) from InletPlaceStrategy i, PlaceConnection pc" + " where i.visible = ?1" + " and ((i.id = pc.fromPlace and pc.toPlace in (?2)” + “ and pc.type.name = ?3 “ + “ and pc.distance = ?4)” + " or (i.id = pc.toPlace “ and pc.fromPlace in (?2) “ + “ and pc.type.name = ?3 “ + “ and pc.distance = ?4)” + ”)") Stream<Long> findByVisibleAndConnected(boolean b, List<Long> connectedIds, String type, long distance); #11345
  • 8. @Query("select distinct(i.id) from InletPlaceStrategy i, PlaceConnection pc" + " where i.visible = ?1" + " and i.id = pc.fromPlace" + " and pc.toPlace = ?2" + " and pc.type.name = ?3" + " and pc.distance = ?4") Stream<Long> findByVisibleAndConnectedByFrom(boolean b, Long connectedId, String type, long distance); @Query("select distinct(i.id) from InletPlaceStrategy i, PlaceConnection pc" + " where i.visible = ?1" + " and i.id = pc.toPlace" + " and pc.fromPlace = ?2" + " and pc.type.name = ?3" + " and pc.distance = ?4") Stream<Long> findByVisibleAndConnectedByTo(boolean b, Long connectedId, String type, long distance);
  • 9. USARE GLI INDICI • Gli indici vengono usati se: • Non ci sono clausole SQL or • Esiste un indice sui campi specificati nella clausola where, elencati nello stesso ordine. • A volte, solo se si esprime un ordine sui suddetti campi.
  • 10. COME CONOSCERE LA QUERY SQL • spring.jpa.properties.hibernate.show_sql=true • Con l’esperienza. • Usando XRebel.
  • 11. COME CAPIRE SE LA QUERY USA GLI INDICI • Con explain select … • Con explain analyze select…