2011-03-31 4 views
5

Tengo una función con 1 argumento (fecha) que encapsula 1 consulta comosolución a la implementación de la capa de almacenamiento en caché en PL/SQL

SELECT COUNT(*) 
    FROM tbl 
WHERE some_date_field BETWEEN param_date - INTERVAL '0 1:00:00' DAY TO SECOND 
          AND param_date 

Lo que quiero hacer es almacenar en caché en alguna parte el resultado de esta consulta con TTL = 1 minuto. El resultado almacenado en caché se debe compartir en todas las sesiones, no solo en la actual.

¿Alguna oferta?

PD: Sí, conozco la caché de resultados de la función oracle, pero no cumple los requisitos.
PPS: Sí, podemos crear el segundo argumento artificial con algún valor como date in format of yyyymmddhh24mi, por lo que cambia cada minuto y podemos usar la función de resultados de caché, pero espero que sea una solución que me permita ocultar las dependencias de almacenamiento en caché .

+0

¿Qué hay de almacenarlo en un tipo con la última vez actualizado? – Sathya

+0

@Sathya: ¿y dónde almacenar el tipo en sí? – zerkms

+0

varrays se pueden almacenar en la base de datos, ¿verdad? @zerkms – Sathya

Respuesta

5

Usaría un contexto de aplicación global y un trabajo con un intervalo de actualización de 1 minuto para establecer el contexto.

PS: INTERVALO '1' HORA es más corto y más significativo que INTERVALO '0 01:00:00' DÍA DE SEGUNDO

+0

Uhm, ¿no es un contexto de aplicación global dependiente de la sesión? – zerkms

+0

Debo admitir que me ha Lo usé o lo probé, pero en la documentación dice: "ACCESO GLOBALMENTE" Esta cláusula indica que cualquier contexto de aplicación establecido en el espacio de nombres es accesible en toda la instancia. Esta configuración permite que varias sesiones compartan atributos de la aplicación. "(http: // download .oracle.com/docs/cd/E11882_01/server.112/e17118/statements_5002.htm # SQLRF01202) –

+0

@Rob van Wijk: oops, contexto: -Siento tan tonto, ya los uso)) sí, se comparten en todas las sesiones – zerkms

4

Desea almacenar en caché el resultado de esta consulta y compartir la caché en todas las sesiones. La única forma en que puedo pensar es en envolver la consulta en una llamada a función, almacenar el resultado en una tabla pequeña. La función consultará la tabla pequeña para ver si el recuento ya se ha almacenado en el último minuto y, de ser así, lo devolverá.

Se mantendría pequeña la tabla al ejecutar un trabajo periódicamente para eliminar filas en la "tabla de caché" que tienen más de 1 minuto, o mejor aún, quizás truncarlas.

Sin embargo, solo puedo ver que esto es beneficioso si el original SELECT COUNT (*) es una consulta relativamente costosa.

+2

+1. Además, si la función necesita calcular el resultado, debe asegurarse de que otra sesión no esté calculando el mismo resultado (este es un entorno multiusuario). Podría usar una tabla maestra cuyo pk sería el parámetro. El procedimiento necesitaría un bloqueo en la fila donde pk = parámetro antes de intentar actualizar la tabla de detalles. La tabla maestra podría almacenar el tiempo de cálculo (que sería necesario para el ttl) –

+0

Aunque el resultado en este caso cabría en una fila (por lo tanto, no necesitaría una tabla de detalles aquí) –

+1

Podría necesitar una fila por ' param_date'. –

Cuestiones relacionadas