Oracle sql столбец с номером типа данных, используя BETWEEN - PullRequest
1 голос
/ 07 января 2011

Ребята, у меня есть таблица, в которой есть столбец st_date , содержащий даты с номером типа данных, и значения будут такими: 20101201 т.е. (01-DEC-2010) .

если я напишу запрос на выборку, используя предложение Между для дат, лежащих между границами, мой вопрос заключается в том, использовать ли оператор между или меньше, или больше, чем оператор, что является эффективным с точки зрения производительности.

 select id, sum(duration), sum(hit_count) 
 from A 
 where st_date between 20101101 AND 20101130 
 group by id

В таблице содержатся миллионы записей, разделенных на st_date. Это лучше, чем ниже, или ниже.

 select id, sum(duration), sum(hit_count) 
 from A 
 where st_date >= 20101101 AND st_date < 20101130 
 group by id

пожалуйста, дайте мне знать ваши ответы.

Ответы [ 3 ]

5 голосов
/ 07 января 2011

Второй более производительный, потому что выбирает меньше данных:)

Внутренне, between переписывается как> = и <=. Это можно увидеть в информационной части предиката плана выполнения. </p>

explain plan for select * from t1 where n between 100 and 200;

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("N">=100 AND "N"<=200)

Кроме того, пока мы на нем:

Не хранить даты в виде чисел.

Oracle знает, что разница между date '2010-12-31' and date '2011-01-01' составляет 1 день. Oracle также знает, что разница между 20101231 и 20110101 составляет 8870.

Подумайте о том, что это делает с оценками мощности.

4 голосов
/ 07 января 2011

BETWEEN включительно.это означает >= нижний И <= верхний.

Так что ваши примеры не совсем совпадают.Если вы исправите ошибку, они сгенерируют тот же план запроса.

Использование BETWEEN несколько понятнее.

1 голос
/ 07 января 2011

Как сказал Митч Уит в своем ответе , после того, как вы зафиксировали 3-ю строку вашего второго запроса как

where st_date >= 20101101 AND st_date <= 20101130 

, тогда ваши два запроса будут давать одинаковые результаты.Не будет также никаких различий с точки зрения времени завершения .

Я лично использую BETWEEN всякий раз, когда мне нужно определить интервалы времени / даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...