El día 11 de febrero de 2009 9:19, David Rodriguez Sanchez <[email protected]> escribió: > Hola, > > Necesito ideas sobre posibles estrategias que puedan mejorar los > tiempos de respuesta. Estoy trabajando en un sistema empotrado y los > tiempos son críticos. > > - El sistema debe ser capaz de insertar 1000 registros en menos de 1 > segundo, con una frecuencia de 1 segundo.(Datos de sensores, el tiempo > es crítico) > - Debe ser capaz de atender a consultas sobre estos datos de forma > concurrente a las inserciones.(El tiempo para estas consultas no es > crítico) > > He conseguido que las inserciones se hagan en un promedio de 630 > milisegundos, de forma estable. Pero el problema es que al realizar > consultas de forma concurrente a las inserciones, éstas sufren una > latencia y se demoran en más de un segundo. > > He considerado usar triggers, de modo que, se inserten 1000 registros > y un trigger, por cada registro insertado lo inserte en otra tabla de > idéntica estructura que actúa de histórico. La idea es que las > consultas se realicen en esta segunda tabla histórico, y dejar la > tabla original actuando como una tabla cache que solo reciba de forma > constante y periódica inserciones. Pero este método crea demasiada > latencia, aprox. 4 segundos, por tanto no es viable, a menos que se > pueda optimizar. > > En este punto es donde necesito ayuda, alguna idea que pueda > solucionar esta latencia. > > Os describo el entorno, y lo siento, pero no puedo dar detalles de > implementacion. > > Cliente: > Se ha desarrollado un programa de testeo, codificado en C++ y uso > unixODBC > > Modelo lógico: > > - Una sola tabla con 62 campos de tipos: long, bool, float, double, > bool[], long[] y float[]. (He preferido usar vectores en vez de tablas > relacionadas por motivo de rendimiento) > - La tabla tiene un indice 'UNIQUE' con dos campos que forman la clave > primaria. He leido que es más flexible y potente usar Index Unique que > una Primary Key. > > Sentencias SQL: > > La secuencia de sentencias que realizo desde C++ es la siguiente: > > /* > //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/ > > > //GLOBAL TRANSACTION +++++++++++++++++++++++++++++++++++++++++++ > START TRANSACTION; > > > //PREPARE STATEMENT > PREPARE test (integer,bigint,integer,double precision,double > precision,real,double precision,real, > "double precision,real,integer,double precision,double > precision,boolean,double precision,boolean,double precision[], > "real[],boolean[],integer,integer[],integer[] ,integer,integer,integer, > > "integer,integer,integer,integer,integer,integer,integer,boolean,boolean, > > "boolean,boolean,boolean,boolean,boolean,integer[],boolean,boolean,boolean, > > "boolean,boolean,boolean,boolean,boolean,boolean,integer,boolean,integer,integer,integer, > "integer,integer,integer,integer,boolean,integer,boolean,integer[]) AS > > INSERT INTO 'TABLA' VALUES > ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15, > > "$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34,$35,$36,$37, > > "$38,$39,$40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$60,$61,$62); > > > > BUCLE ( 125 VECES) > { > > BUCLE( 8 VECES) > { > SQL += "EXECUTE test('….');// Los datos que previamente > se han > generado con el programa de testeo > } > Exe SQL; > SI FALLO > { > ROOLBACK; > } > > //Sumamos el tiempo parcial empleado > } > > //DEALLOCATE PREPARE > DEALLOCATE test; > > > //COMMIT GLOBAL TRANSACTION > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > COMMIT; > > /* > //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
¿Probaste en mandar las 1000 inserciones como un solo comando SQL, separando los inserts por ; ? -- Silvio Quadri -- TIP 10: no uses HTML en tu pregunta, seguro que quien responda no podr� leerlo
