kardiac God save the kernel | Bonjour,
Tout d'abord je tiens à préciser que je débute en SQL donc mes lignes de codes sont peut-être complètement foireuses et je prend peut-être pas le problème de la bonne façon. Hésitez pas à me le dire
Ceci dit, voici mon problème: j'ai créé une rule pour pouvoir insérer facilement des données en passant par une vue. Sur les différentes tables, j'ai créé des triggers pour vérifier que le champ est bien unique. Le problème c'est que j'insére plusieurs milliers de ligne et je trouve que cela met trop de temps. De l'ordre de 20 minutes pour 1500 inserts. Donc si quelqu'un pouvait m'indiquer comment optimiser tout ca ou me donner une piste.
Voici la vue
Code :
- CREATE VIEW su_view (server, login_account, switched_account, hour, date, count) AS
- SELECT srv.server,
- usr.username,
- susr.username,
- cs.hour,
- dat.date,
- cs.count
- FROM server srv,
- username usr,
- username susr,
- date dat,
- consolidate cs
- WHERE cs.lserver_id = srv.server_id
- AND cs.luser_id = usr.user_id
- AND cs.ruser_id = susr.user_id
- AND cs.date_id = dat.date_id;
|
La rule que j'ai écrit :
Code :
- CREATE OR REPLACE RULE insert_su_view AS ON INSERT
- TO su_view
- DO INSTEAD (
- INSERT INTO server (server) VALUES (NEW.server);
- INSERT INTO username (username) VALUES (NEW.login_account);
- INSERT INTO username (username) VALUES (NEW.switched_account);
- INSERT INTO date (date) VALUES (NEW.date);
- INSERT INTO consolidate (msg_id, lserver_id, date_id, luser_id, ruser_id, hour)
- VALUES ( get_msg_id('su'),
- get_server_id(NEW.server),
- get_date_id(NEW.date),
- get_user_id(NEW.login_account),
- get_user_id(NEW.switched_account),
- NEW.hour);
- UPDATE consolidate SET count = count + 1
- WHERE consolidate.lserver_id = get_server_id(NEW.server)
- AND consolidate.luser_id = get_user_id(NEW.login_account)
- AND consolidate.ruser_id = get_user_id(NEW.switched_account)
- AND consolidate.hour = NEW.hour
- AND consolidate.date_id = get_date_id(NEW.date)
- AND consolidate.msg_id = get_msg_id('su');
- );
|
Ainsi qu'un couple de fonctions et de triggers que j'utilise :
Code :
- CREATE FUNCTION check_server () RETURNS TRIGGER AS '
- DECLARE srv_count INTEGER;
- BEGIN
- SELECT INTO srv_count COUNT(*) FROM server WHERE server = NEW.server;
- IF srv_count > 0 THEN
- RETURN NULL;
- ELSE
- RETURN NEW;
- END IF;
- END;
- ' LANGUAGE 'plpgsql';
- CREATE TRIGGER if_server_exists
- BEFORE INSERT ON server FOR EACH ROW
- EXECUTE PROCEDURE check_server ();
|
J'ai bien pensé à supprimer les triggers en me contentant des clés primaires comme cela ca générerait juste une erreur lors de l'insert dans la table mais ca ne fonctionne pas non plus
J'ai l'impression que la rule s'arrète lorsqu'il y a une erreur. Je me suis aussi renseigné sur la gestion des exceptions mais il parait que c'est pas encore tout à fait au point sous PostgreSQL. Ma base est en 7.3.4. Je suis ouvert à toutes propositions
Merci d'avance,
Kardiac |