--Exercice 1 CREATE INDEX ix_cl ON CLIENT(id); /* impossible d'inserer cet index parce que id est la clef primaire. et les clef primaire ont deja un index */ --Exercice 2 SET AUTOTRACE ON SELECT * FROM LIGNE_COMMANDE WHERE COMMANDE_ID=46; --observation CREATE INDEX ix_commande_id ON LIGNE_COMMANDE (COMMANDE_ID, PRODUIT_ID) ; SET AUTOTRACE ON SELECT * FROM LIGNE_COMMANDE WHERE COMMANDE_ID=46; --observation: l'index est sur la colonne COMMANDE_ID donc c'est beaucoup plus efficace SELECT PRODUIT_ID FROM LIGNE_COMMANDE WHERE COMMANDE_ID = 46; --observation: l'index est sur la colonne COMMANDE_ID et PRODUIT_ID donc c'est beaucoup plus efficace DROP INDEX ix_commande_id; --Exercice 3 SELECT cl.nom, SUM(lc.prix_total) FROM CLIENT cl INNER JOIN COMMANDE c ON c.client_id = cl.id INNER JOIN LIGNE_COMMANDE lc ON lc.commande_id = c.id GROUP BY cl.nom; SELECT cl.nom, SUM(lc.prix_total) FROM CLIENT cl INNER JOIN COMMANDE c ON c.client_id = cl.id INNER JOIN LIGNE_COMMANDE lc ON lc.commande_id = c.id GROUP BY cl.nom; --on utilise ici des hash join pour les jointures. --les tables sont lu integralement CREATE index test1 on COMMANDE(client_id); CREATE index test2 on LIGNE_COMMANDE(commande_id); DROP INDEX test1; DROP INDEX test2; --Exercice 4 SELECT * FROM LIGNE_COMMANDE WHERE PRODUIT_ID IN (SELECT ID FROM PRODUIT WHERE PRIX_UNITAIRE>100); SELECT L.* FROM LIGNE_COMMANDE L JOIN PRODUIT P ON (L.PRODUIT_ID=P.ID) WHERE P.PRIX_UNITAIRE>100; --parreille 13 de cout et 46 de consistents get SELECT * FROM LIGNE_COMMANDE lc WHERE EXISTS (SELECT * FROM PRODUIT p WHERE p.id=lc.produit_id AND p.prix_unitaire > 100); -- 93 consistent gets --il doit y avoir une erreur quelque part. Mais voici du plus efficace au moins efficace: -- 1) EXISTS / NOT EXISTS -- 2) JOIN ON -- 3) WHERE IN --Exercice 5 CREATE TABLE BIGBITMAP( id NUMBER PRIMARY KEY, nbitmap NUMBER, date_insertion DATE ); BEGIN for id in 0..300000 LOOP INSERT INTO BIGBITMAP VALUES ( id, MOD(id,5) , TO_DATE(sysdate, 'DD/MM/YYYY') ); Commit; END LOOP; dbms_output.put_line ('100000 lignes inserees'); END; CREATE INDEX ix_nbitmap_tree ON BIGBITMAP (nbitmap); DROP INDEX ix_nbitmap_tree; CREATE BITMAP INDEX ix_nbitmap_bitmap ON BIGBITMAP (nbitmap); DROP INDEX ix_nbitmap_bitmap; /* 218 recursive calls 0 db block gets 3741 consistent gets 1568 physical reads 0 redo size 335 bytes sent via SQL*Net to client 41 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 5 sorts (memory) 0 sorts (disk) 1 rows processed */ /* 0 recursive calls 0 db block gets 2558 consistent gets 0 physical reads 0 redo size 335 bytes sent via SQL*Net to client 41 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed */ /* 52 recursive calls 0 db block gets 127 consistent gets 35 physical reads 0 redo size 335 bytes sent via SQL*Net to client 41 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed */