Visualizzare le query SQL

Per visualizzare le query SQL che vengono inviate al serverDB, si può utilizzare P6Spy:

  1. Scaricare da:
    1. sito ufficiale
    2. sourceforge
  2. Scompattare il file p6spy-install.jar, come se fosse un file zip (individuare i file p6spy.jar e spy.properties)
  3. Mettere il file p6spy.jar tra le dipendenze del progeto
    1. Netbeans: Tasto destro sul progetto -> Properties -> Libraries -> Add JAR/Folder -> selezionare il file
  4. Nel file hibernate.cfg.xlm sostituire:
    1. MySql ->
      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> con
      <property name="hibernate.connection.driver_class">com.p6spy.engine.spy.P6SpyDriver</property>
  5. Copiare il file spy.properties nel progetto e metterlo nella classpath
    1. Netbeans: Tasto destro sul progetto -> Properties -> Libraries -> Add JAR/Folder -> selezionare il file
  6. Modificare la voce realdriver col driver usato (è quello che era scritto nel file hibernate.cfg.xml)
    1. MySql -> realdriver=com.mysql.jdbc.Driver
  7. Sempre nel file spy.properties modificare la voce logfile:
  8. logfile = c:/spy.log (nel caso di Windows)
  9. logfile = /srv/log/spy.log (nel caso di Linux)

tratto da:

http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/

 

Partizionamento

Se ho una tabella con molti record, e quindi un grosso file, posso decidere di dividere il file in n più piccoli e, in base alla query, ottenere prestazioni migliori.

Un ottimo punto da cui iniziare è: StarData

al quale possiamo aggiungere:

  • Per sapere dove sono saltati i file delle tabelle:

show variables like ‘datadir’

  • Per avere informazioni sullo stato attuale

SELECT DISTINCT PARTITION_EXPRESSION
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA=’nomeSchema’ AND TABLE_NAME=’nomeTabella’

SELECT PARTITION_ORDINAL_POSITION, TABLE_ROWS, PARTITION_METHOD
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = ‘nomeSchema’ AND TABLE_NAME = ‘nomeTabella’

  • Per sapere quali file legge una determinata query

EXPLAIN partitions SELECT * FROM tabella WHERE id=1234

  • Per inizializzare

ALTER TABLE nomeTabella
PARTITION BY LIST COLUMNS (idCheVoglioUsare) (
PARTITION P111 VALUES IN (‘111’),
PARTITION P222 VALUES IN (‘222’)
)

  • Per aggiungere altre partizioni

ALTER TABLE nomeTabella
ADD PARTITION (
PARTITION a61714 VALUES IN (‘61714’)
)

  • Per cancellare tutte le partizioni e riavere un solo file per la tabella indicata

ALTER TABLE nomeTabella REMOVE PARTITIONING

  • Per cancellare solo una partizione

ALTER TABLE eventdata2 DROP PARTITION a61714

 

MySql joins

Ottimo link: http://www.mrwebmaster.it/mysql/join_6812.html

FROM tab_a left join tab_b ON tab_a.id = tab_b.id

tab_a e’ a sx… il primo che trovi, tab_b e’ a dx della dichiarazione. In sostanza: vengono presi TUTTI i record di tab_a e confrontati con tutti i record id della tab_b. se c’e’ corrispondenza bene, altrimenti tab_b rende NULL.

RIGHT join invece avrebbe preso TUTTI i record di tab_b e chi renderebbe un eventuale NULL sarebbe la tab_a.

 

HQL Editor

Scaricare e scompattare:

  1. JBoss Developer Studio o installare Hibernate Tools nell’Eclipse
  2. Il driver del database
    1. MySql il connector, scaricare il file per tutte le piattaforme in modo da avere uno zip all’interno del quale c’è il .jar
  3. Hibernate Core

Da Eclipse o JBoss Developer Studio:

  1. Creare un nuovo progetto “JPA Project”
    1. In “JPA Implementation” selezionare “User Library”
    2. Manager Libraries -> New -> Indicare un nome (hibernate) e inserire i .jar del driver e di hibernate core
    3. Selezionare una connessione esistente o crearne una nuova
  2. tasto DX sul progetto -> new -> hibernate mapping

NetBeans

  1. Tasto destro del mouse sul file hibernate.cfg.xml -> Run HQL Query
  2. Commentare tutta la sessione relativa a C3P0

 

Concatenare risultati di una query

Per unire i risultati di tutti i record in un solo campo, separati da virgola:

ORACLE

  • select WM_CONCAT(campoTabella) non ufficiale
  • select LISTAGG(campoTabella, ‘,’) WITHIN GROUP (ORDER BY campoTabella)  dalla 11.2
  • select rtrim(xmlagg(xmlelement(s, campoTabella, ‘,’).extract(‘//text()’) order by campoTabella),’,’)

MySQL

  • GROUP_CONCAT()

 

Esempio

 

Name    Mark
——- ——
ABC     10
DEF     10
GHI     10
JKL     20
MNO     20
PQR     30

select
   mark,
   count(*),
   wm_concat(name)
from
   test_test
group by
   mark;

 

mark count     names
—-      —–     ———–

10       3     ABC,DEF,GHI
20       2     JKL,MNO
30       1     PQR

 

 

PL/SQL [Oracle]

  • Le istruzioni si concludono con un “;”
  • I commenti:
    • su linea “–“
    • su più linee  “/* … */”
  • Assegnazione variabile “:=”
  • Tipi di variabili: VARCHAR2, INTEGER, NUMBER, DATE, BOOLEAN, LONG, LONG RAW, CLOB, BINARY_INTEGER
  • Dichiarazione oggetto (si usa spesso per dichiarare una tabella):

CREATE OR REPLACE TYPE type_nomeOggetto AS OBJECT
(
nomeCampo  tipoNomeCampo,
ns NUMBER(2),
evento DATE
);

  • Dichiarazione tabella (si usa spesso come ritorno di una funzione):
    • CREATE OR REPLACE TYPE typ_nomeTabella AS TABLE OF type_nomeOggetto;
  • Dichiarazione tabella esistente:
    • rec_nomeVariabile TABELLA%ROWTYPE;
  • creazione funzione
    • create or replace function NOME_FUNZIONE(Variabile1 tipo_Variabile1, Variabile2 tipo_Variabile2) return tipo_variabile_ritorno is

ELENCO_VARIABILI_USATE_NELLA_FUNZIONI

begin

………

end NOME_FUNZIONE;

  • creazione procedura
    • create or replace procedure NOME_PROCEDURA(Variabile1 tipo_Variabile1, Variabile2 tipo_Variabile2)  is

ELENCO_VARIABILI_USATE_NELLA_PROCEDURA

begin

………

end NOME_PROCEDURA;

  • costrutto IF

IF condizione THEN
istruzioni;
END IF;

  • costrutto IF ELSE

IF condizione THEN
istruzioni;
ELSE
istruzioni;
END IF;

  • Condizioni: =, <, >, <>, IS NULL, IS NOT NULL
  • Cicli FOR

    FOR i IN 1..tbl_CicloVaccinale.count LOOP
dbms_output.put_line(tbl_CicloVaccinale(i).ns || ‘ ‘ ||
tbl_CicloVaccinale(i).min || ‘ ‘ ||
tbl_CicloVaccinale(i).max || ‘ ‘ ||
tbl_CicloVaccinale(i).vacc);
END LOOP;

  • Esecuzione singola query

strQuery:=’SELECT count(*) FROM tabella WHERE idtabella1 = :1 AND idtabella2 = :2′;
BEGIN
EXECUTE IMMEDIATE strQuery
INTO tmpNumber
USING xId1, xId2;
EXCEPTION
WHEN no_data_found THEN
RETURN ‘-‘;
END;

  • Cursori
    • Dichiarazione

CURSOR cur_elencoCicli(idAnagrafica_In number, idvacMalattia_In number) IS
SELECT vcp.idciclo, vc.codice, vc.descrizione,
FROM vacciclipaziente vcp, vaccicli vc, vacdaeseguire vde
WHERE vcp.idciclo = vc.idcicli
AND   vde.idvacciclo = vcp.idciclo
AND   vde.idanagrafica = vcp.idanagrafica
AND   vcp.idanagrafica = idAnagrafica_In
AND   vcp.idvacmalattia = idvacMalattia_In
AND   vcp.statociclo IN (0,1,2,6,7);
rec_elencoCicli cur_elencoCicli%ROWTYPE;

Apertura

OPEN cur_elencoCicli(rec_elencoPazienti.idanagrafica, malattieDaPrenotare(i).Idvacmalattie);

LOOP
FETCH cur_elencoCicli INTO rec_elencoCicli;
EXIT WHEN cur_elencoCicli%NOTFOUND;
totRec_elencoCicli:=totRec_elencoCicli + 1;
END LOOP;

Per velocizzare il tempo di esecuzione [Oracle]

Ci sono alcune direttive per cercare di velocizzare i tempi d’esecuzione di una query, le direttive sono parole che si inseriscono tra /*+  e */, sembrano commenti e per le versioni del DB che non le contemplano lo sono, per le ultime versioni trattano in maniera diversa l’esecuzione della query

  • SELECT /*+ PARALLEL(10) */
    • la query viene eseguita in 10 thrend paralleli