Come fare il debug di query SQL complicate usando le CTE scrivibili

Documenti analoghi
Database Lezione 2. Sommario. - Progettazione di un database - Join - Valore NULL - Operatori aggregati

Basi di Dati: Corso di laboratorio

Alta disponibilità con repmgr 3.1. Gianni Ciolli Milano giugno 2016

Basi di Dati: Corso di laboratorio

SQL - Structured Query Language

σ data 15/12/2013 data 20/12/2014

Manuale SQL. Manuale SQL - 1 -

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo.

SQL: definizione schema

Stored Procedures. Massimo Mecella Dipartimento di Ingegneria informatica automatica e gestionale Antonio Ruberti Sapienza Università di Roma

Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, SQL

Estensioni del linguaggio SQL per interrogazioni OLAP

Triggers Esercitazione 1

Lezione 8. Metadati, Viste e Trigger

PostgreSQL 8.4. Associazione Italiana PostgreSQL Users Group ConfSL 2009 Speaker's Corner Bologna, 13 Giugno 2009

Esercitazione: Interrogazioni SQL

Anno 1. M.C.D. e m.c.m. fra monomi

Il linguaggio SQL: query innestate

Basi di dati attive. Paolo Atzeni Stefano Ceri. Basi di dati attive

Introduzione al MATLAB c Parte 3 Script e function

Data Management Software. Il linguaggio SQL. Query Innestate. Paolo Avallone Sr Consulting IT Specialist DB2, Data Management 10 Settembre 2003

Eprogram ITIS V anno Unità 4 - Il linguaggio SQL

Esempio di database relazionale con l utilizzo del prodotto MySQL

Caratteristiche dei linguaggi per Database

Interrogazioni nidificate

Esercitazione 3 SQL 2

Laboratorio di Python

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Connessione con MySQL

PROGRAMMAZIONE: Le strutture di controllo

SELECT s.nome, e.data Studenti s, Esami e WHERE e.materia = 'BD' AND e.voto = 30 AND e.matricola = s.matricola

Domande utili alla preparazione dell orale di Informatica all Esame di Stato

Esame Informatica Generale 13/04/2016 Tema A

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013)

Interrogazioni nidificate

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6

Tool. Basi di Dati e Sistemi Informativi Prof. Marco Di Felice Dott.sa Sara Zuppiroli A.A

ESERCITAZIONI ACCESS

Interrogare una base di dati: Algebra relazionale e SQL. Alessandro Bardine Alessandro Ciaramella Vincenzo Galella Rudy Manganelli

SQL: DDL, VI, Aggiornamenti e Viste

The world s most advanced class on PostgreSQL o quasi! 4 Marzo 8 Aprile L'Antipasto 11 Marzo

Interrogazioni in SQL

PROGETTAZIONE DI DATABASE Linguaggio SQL

Cammini minimi fra tutte le coppie

Processo di ottimizzazione. Ottimizzatore di Oracle. Execution plan. Esempio. Albero di esecuzione. Ottimizzatore di Oracle Dicembre 2002

CORSO DI PROGRAMMAZIONE

Basi di dati 8 settembre 2015 Esame Compito A Tempo a disposizione: due ore. Libri chiusi.

Linguaggio SQL seconda parte

Confronto tra stringhe. (modulo) Calcolo della media e della varianza. Ecco un elenco di codici Matlab: - Calcolo valore assoluto (modulo)

Esempi SQL con Access. Orazio Battaglia

Esercizi di Algoritmi e Strutture Dati

<Nome Tabella>.<attributo>

Alessandra Raffaetà. Esercizio: Cinema

S.I.T. PER LA VALUTAZIONE E GESTIONE DEL TERRITORIO Corso di Laurea Magistrale in Scienze Ambientali. Alessandra Raffaetà

Laboratorio di PL/SQL 3 Esercizi svolti e valutati

2011 Politecnico di Torino 1

Capitoli 8 e 9. SQL embedded. Applicazioni tradizionali Applicazioni Internet. Sistemi di basi di dati Raghu Ramakrishnan, Johannes Gehrke

Il linguaggio SQL: viste e tabelle derivate. DB di riferimento per gli esempi

Basi di Dati. Esercitazione Algebra Relazionale e SQL. Ing. Paolo Cappellari. 15 maggio 2006

SQL e linguaggi di programmazione. Cursori. Cursori. L interazione con l ambiente SQL può avvenire in 3 modi:

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO VI.2015

Data warehouse in Oracle

Per poter interagire con un database in rete mediante uno script php bisogna. innanzitutto cerare una connessione. Ciò si ottiene mediante la funzione

SQL - Sottointerrogazioni

La codifica digitale

Tipi di sottoquery SQL

SQL PER LA DEFINIZIONE DI BASI DI DATI

Structured. Language. Basi di Dati. Introduzione. DDL: Data Definition Language. Tipi di dato. Query. Modifica dei Dati

Suggerimenti per lo Sviluppo delle Applicazioni con PL/SQL. Simona Rotolo

Il linguaggio SQL: viste e tabelle derivate

SQL non è solo un linguaggio di interrogazione (Query Language), ma. Un linguaggio per la definizione di basi di dati (Data-definition language (DDL))

ESEMPI DI QUERY SQL. Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 1 di 7

Viste materializzate in Oracle e SQL esteso. Sistemi di gestione di basi di dati. Tania Cerquitelli e Paolo Garza 1.

Transcript:

Come fare il debug di query SQL complicate usando le CTE scrivibili 2ndQuadrant Italia PGDay Italiano 2011 Prato, 25 novembre

Outline 1 Il problema Descrizione Esempi generici Esempio specifico 2 Soluzione con PostgreSQL 9.1 Descrizione Esempio 3 (MCD) 3 Commenti Senza le CTE scrivibili Una soluzione limitata Domande

Descrizione Il problema Consideriamo query SQL che usano sottoquery non correlate in SQL si possono scrivere query molto complicate le sottoquery sono rappresentate da alcuni dei vertici nell albero della query Il risultato di una query può essere inatteso ad esempio, può darsi che la condizione di JOIN sia stata scritta male oppure c è un errore di battitura in un espressione... è difficile localizzare l errore nell albero della query Occorre quindi fare il debug della query EXPLAIN mostra la forma dell albero della query, ma non il contenuto di ogni nodo; questo è l argomento che tratteremo.

Esempi generici Esempio generico 1 Esempio minimale: una sola sottoquery SELECT... FROM ( SELECT... FROM... ) a Se l output non è quello atteso, allora dove è l errore? SQL mette a disposizione l output finale della query, ma non l output delle sottoquery intermedie Potremmo dire: una query SQL è una scatola nera di dati Non diciamo scatola nera e basta, in quanto il codice sorgente è disponibile

Esempi generici Esempio generico 2 Quanto è nera la scatola? SELECT... FROM ( SELECT... FROM ( SELECT... FROM... WHERE... ) b1 LEFT JOIN... ON... ) a1 GROUP BY... Le sottoquery possono annidarsi, combinarsi con dei join, essere raggruppate... le query SQL che rappresentano modelli provenienti dal mondo reale possono essere arbitrariamente complicate è molto difficile capire per quale ragione l output finale non sia quello atteso.

Esempio specifico Esempio 3, ricorsivo Massimo Comun Divisore (á la Euclide) Problem Dati due interi positivi x e y, trovare il più grande intero che divide sia x che y. Soluzione (Euclide di Alessandria, circa 23 secoli fa) Sia z il resto di x diviso per y. Se z = 0, allora y è la soluzione. Altrimenti ripeti dall inizio, sostituendo x con y e y con z.

Descrizione La nostra soluzione 1/2 Panoramica (dalla 9.1 in poi) Idea intercettare i nodi intermedi nell albero della query copiare (logging) l output dei nodi intermedi in apposite tabelle di debug create in precedenza esaminare i contenuti delle tabelle di debug dopo aver eseguito la query Implementazione 9.1: riscrivi le sottoquery come delle CTE, poi aggiungi ulteriori CTE scrivibili che contengono i comandi di logging (8.4 o 9.0: riscriviamo le sottoquery come CTE, poi le modifichiamo leggermente in modo da garantire l esecuzione di apposite funzioni di logging)

Descrizione La nostra soluzione 2/2 Panoramica (dalla 9.1 in poi) Impatto tutte le tecnologie richieste fanno parte di PostgreSQL 9.1 core; non occorre estendere il server nessun impatto sugli effetti della query nessun impatto sul risultato della query impatto variabile sul consumo di risorse, dovuto essenzialmente all esecuzione dei comandi di logging (l impatto dipende dal quantitativo di dati ispezionati)

Descrizione Limitazioni Ogni CTE scrivibile viene eseguita esattamente una volta; pertanto non può fotografare lo stato intermedio della tabella, in caso di query con CTE ricorsive C è un impatto nella definizione originale della query: occorre aggiungere manualmente il codice che implementa il sistema di debug; tuttavia è semplice scrivere tale codice in modo che non si confonda con il codice originale della query Le sottoquery correlate non sono coperte da questa tecnica; sarebbe necessario disporre dei riferimenti circolari nelle CTE ricorsive, che al momento non sono supportati da PostgreSQL (grazie ad Albe Laurenz per avere sollevato il caso in occasione di 2011.pgconf.eu!)

Esempio 3 (MCD) Esempio 3 ricorsivo, con le CTE Massimo Comun Divisore (á la Euclide) WITH RECURSIVE a(x,y) AS ( VALUES (:x,:y) UNION ALL SELECT y, x % y FROM ( SELECT * FROM a WHERE y > 0 ORDER BY x LIMIT 1 ) b WHERE y > 0 ) SELECT x FROM a WHERE y = 0; $ psql -v x=1547 \ -v y=1729 \ -f gcd-1.sql x ---- 91 (1 row)

Esempio 3 (MCD) Esempio 3 ricorsivo + log Massimo Comun Divisore (á la Euclide, spiegato) CREATE TABLE debug_table ( id serial, x numeric, y numeric ); $ psql -v x=1547 \ -v y=1729 \ -f gcd-2.sql CREATE TABLE x ---- 91 (1 row) WITH RECURSIVE a(x,y) AS (... ), debug_a AS ( INSERT INTO debug_table(x,y) SELECT * FROM a ) SELECT x FROM a WHERE y = 0; id x y ----+------+------ 1 1547 1729 2 1729 1547 3 1547 182 4 182 91 5 91 0 (5 rows) TABLE debug_table;

Senza le CTE scrivibili PostgreSQL pre-9.1 Senza le CTE scrivibili Le CTE sono state introdotte in PostgreSQL 8.4, limitatamente a SELECT (sola lettura) PostgreSQL < 8.4: questa tecnica non si può usare Nelle versioni 8.4 e 9.0 è possibile creare delle apposite funzioni di logging che scriveranno le informazioni di logging dietro le scene, ed eseguirle tramite SELECT Tuttavia, il planner parte dal presupposto che tutte le CTE siano in sola lettura, e quindi pensa che non ci siano altri effetti a parte la produzione del loro output; pertanto vengono ignorate le CTE il cui output non sia utilizzato altrove nella query.

Senza le CTE scrivibili Esempio 3 su PostgreSQL 8.4 (non funzionante) CREATE FUNCTION debug_func (i_x numeric, i_y numeric) RETURNS numeric LANGUAGE plpgsql AS $BODY$ BEGIN INSERT INTO debug_table(x,y) VALUES (i_x,i_y); RETURN NULL; END; $BODY$; WITH RECURSIVE a(x,y) AS (... ), debug_a AS ( SELECT debug_func(x,y) FROM a ) SELECT x FROM a WHERE y = 0; Così non funziona, poiché: 1 il planner riesce a calcolare il risultato della query senza utilizzare il contenuto di debug_a 2 PostgreSQL parte dal presupposto che la query contenuta dentro debug_a sia in sola lettura, come dovrebbe essere 3 quindi non c è ragione di eseguire la query in debug_a

Una soluzione limitata Esempio 3 su PostgreSQL 8.4 (hack) It is not a part that we re proud of Soluzione: ingannare il planner. Ossia: riscrivere la query in modo che l output di debug_a sembri indispensabile al planner, pur non essendolo in realtà. Avvertenza 1: ingannare il planner è una cattiva prassi. Va usata con la massima saggezza, ed occorre documentare in dettaglio ogni utilizzo. Avvertenza 2: la query originale subirà delle modifiche che possono facilmente confondersi col testo originale. Prima di procedere, fai una copia del codice originale della query!

Una soluzione limitata Esempio 3 ricorsivo, sulla 8.4 Massimo Comun Divisore (á la Euclide, spiegato, e con un hack) WITH RECURSIVE a(x,y) AS (... ), debug_a AS ( SELECT debug_func(x,y) FROM a ) SELECT x FROM a WHERE y = 0 AND -1!= ( SELECT count(1) FROM debug_a ); $ psql --cluster 8.4/main \ -v x=1547 -v y=1729 \ -f gcd-4.sql x ---- 91 (1 row) id x y ----+------+------ 1 1547 1729 2 1729 1547 3 1547 182 4 182 91 5 91 0 (5 rows)

Domande Domande Ci sono domande?

Domande Grazie per la vostra attenzione!

Domande Licenza Questo documento è distribuito secondo la licenza Creative Commons Attribution-Non commercial-sharealike 3.0 Unported cc-by-nc-sa Una copia della licenza è disponibile alla URL http://creativecommons.org/licenses/by-nc-sa/3.0/ oppure scrivendo a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.