Фильтрация запроса SQL по ряду и по диапазону дат
Вопрос
У меня есть время, индексированное Oracle DB, которое я пытаюсь запрашивать диапазон дат. Я также хочу сделать снижение данных в запросе, чтобы я не перегружен слишком большим количеством данных.
Запрос даты отдельно (2352 ряда в 0,203 с):
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'
Подставка вдоль снижения запроса (1017 в 0,89 с):
select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)
Когда я пытаюсь объединить их, это требуется вечно (48 рядов в 32,547 с):
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)
Очевидно, я делаю что -то в корне не так, но я не знаю, как еще как запросить дату, так и снизить данные.
Решение 4
Благодаря «Нарвесону» и «Нейт С» за указатели, которые я наконец -то понял. Вот (вероятно, Oracle Special) запрос, который я придумал:
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
Этот запрос возвращает 47 строк в 0,031 с. Первоначальный запрос времени имел 2352 ряда, так что это имеет смысл.
А Орафак помог мне добраться до окончательного решения.
Другие советы
Вы оцениваете свою логику сокращения по рядам, которые не находятся в выбранном вами диапазоне дат.
Примените логику сокращения к подзаднечке, содержащему диапазон дат.
Позже: вот что я имел в виду.
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
Избавиться от in
Зачем это использовать?:
select oracle_time from t_ssv_soh_packets0
where (rowid,0) in (select rowid, mod(rownum,50) from t_ssv_soh_packets0)
Ваше единственное состояние - MOD (Rownum, 50)
select * from t where mod(rownum, 50)=0
Последняя строка должна быть AND mod(rownnum,50)=0
Не самообеспечение с in
.
Вы также можете позволить Oracle выбрать случайную выборку из результата, применив ОБРАЗЕЦ() пункт:
SELECT oracle_time FROM t_ssv_soh_packets0 WHERE ... SAMPLE(50)
Вернется случайным образом на 50% процентов рядов