Pregunta

Me es indexada base de datos Oracle, que estoy tratando de consulta por rango de fechas. También quiero hacer la reducción de datos en la consulta, así que no se dejen confundir con demasiados datos.

La consulta independiente fecha (2352 filas en 0.203s):

select oracle_time from t_ssv_soh_packets0
where oracle_time >= TIMESTAMP '2009-01-01 00:00:00' 
AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00' 

El stand junto consulta reducción (1.017 en 0.89s):

select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)

Cuando intento de combinarlos que se necesita para siempre (48 filas en 32.547s):

select oracle_time from t_ssv_soh_packets0
where oracle_time >= TIMESTAMP '2009-01-01 00:00:00' 
AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00' 
AND (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)

Es obvio que estoy haciendo algo fundamentalmente equivocado aquí, pero no sé de qué otra manera tanto consulta por fecha y reducir los datos.

¿Fue útil?

Solución 4

Gracias a los dos 'Narveson' y 'c Nate' para los punteros, finalmente, lo he descubierto. Aquí está el (probablemente Oracle específica) consulta que se me ocurrió:

select oracle_time from t_ssv_soh_packets0 where oracle_time >= TIMESTAMP '2009-01-01 00:00:00' AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00' group by oracle_time, rownum having mod(rownum, 50)=0

Esta consulta devuelve 47 filas en 0.031s. El tiempo de consulta original tenía 2352 filas por lo que tiene sentido.

El ORAFAQ me ayudó a llegar a la solución final.

Otros consejos

Se está evaluando la lógica de reducción frente a las filas que no están en el intervalo de fechas seleccionado.

Aplicar la lógica reducción a una sub consulta que contiene el intervalo de fechas.

A MÁS: Esto es lo que quería decir.

select oracle_time from (
  select oracle_time, rownum as limited_row_num
  from t_ssv_soh_packets0 
  where oracle_time >= TIMESTAMP '2009-01-01 00:00:00'  
  AND oracle_time <= TIMESTAMP '2009-01-31 00:00:00'  
) as time_range
where mod(limited_row_num,50) =  0

deshacerse de los in

¿Por qué utilizar esto:?

select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)

Su única condición es mod (rownum, 50)

select * from t where mod(rownum, 50)=0

última línea debe ser AND mod(rownnum,50)=0 no unirse a un auto con un in.

También puede dejar que Oracle elegir una muestra aleatoria de los resultados mediante la aplicación de la muestra () cláusula :

SELECT oracle_time 
FROM t_ssv_soh_packets0
WHERE ...
SAMPLE(50)

Volveremos al azar 50% por ciento de las filas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top