Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вхождение в диапазон  [new]
Ё-МАЙО
Member

Откуда: Москва. Сокол.
Сообщений: 24
Коллеги, поделитесь опытом

Есть исходная таблица, для двух полей которой необходимо проверять их вхождение в диапазон.
За одну итерацию, просматривается до 1.5 млн записей испходной таблицы.
Непересекающихся диапазонов ~5000

Запрос, с использованием between весьма ресурсоемкий
Суррогатная таблица, заполненная числами будет содежать до 1010-1 записей

Правильно я понимаю, что использование таблицы с числами даст максимальных выигрышь в скорости проверки вхождения в диапазон?
Есть другие варианты решения?
6 июн 11, 10:17    [10767555]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ё-МАЙО
Правильно я понимаю, что использование таблицы с числами даст максимальных выигрышь в скорости проверки вхождения в диапазон?
Есть другие варианты решения?

А при таблице between исчезнет разве ?
6 июн 11, 10:20    [10767574]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
Ё-МАЙО
Member

Откуда: Москва. Сокол.
Сообщений: 24
Предполагается, что она будет содержать проверяемое значение и смысловую часть.
Т.е. LEFT JOIN даст требуемый результат
6 июн 11, 10:24    [10767596]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ё-МАЙО
Предполагается, что она будет содержать проверяемое значение и смысловую часть.
Т.е. LEFT JOIN даст требуемый результат

Вы хотите сказать, что JOIN ... BETWEEN f1 and f2 будет быстрее WHERE BETWEEN const1 and const2 ?
6 июн 11, 10:26    [10767607]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
Ё-МАЙО
Member

Откуда: Москва. Сокол.
Сообщений: 24
Я хочу сказать, что LEFT JOIN ... val будет быстрее чем LEFT JOIN ... between val1 and val2
6 июн 11, 10:31    [10767657]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
aleks2
Guest
Ё-МАЙО
Есть другие варианты решения?


1. Есть.
2. Перекрыть мутный поток сознания и изложить задачу ВНЯТНО... т.е. с ПРИМЕРОМ данных.
6 июн 11, 10:34    [10767686]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
Glory
Member

Откуда:
Сообщений: 104751
LEFT JOIN ... val - здесь вообще то должно быть логическое выражение
6 июн 11, 10:34    [10767689]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
Что-то типа этого ?

Delcare @Cnt
SELECT @Cnt=count(*) FROM BigTable WHERE field1 >= @MinVal AND field1 <= @MaxVal
6 июн 11, 10:51    [10767860]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
Ё-МАЙО
Member

Откуда: Москва. Сокол.
Сообщений: 24
--исходная таблица
declare @traffic table (reg_time datetime, src varchar(21), dest varchar(21))

--диапазоны
declare @ranges table (start_range varchar(21), end_range varchar(21), flag varchar(10))

--если в лоб
select 
	  a.reg_time
	, a.src
	, b.flag as src_flag
	, a.dest
	, c.flag as dest_flag
from @traffic a
left join @ranges b on a.src between b.start_range and b.end_range
left join @ranges c on a.dest between c.start_range and c.end_range


Можно создать суррогатную таблицу, и заполнить ее значениями из диапазонов
Тогда запрпос будет следующий:
declare @tmbl_ranges table (val varchar(21), flag varchar(10))

select 
	  a.reg_time
	, a.src
	, b.flag as src_flag
	, a.dest
	, c.flag as dest_flag
from @traffic a
left join @tmbl_ranges b on a.src = b.val
left join @tmbl_ranges c on a.dest = c.val
Вообще, значения которые сопоставляются это числа, так что можно перейти к bigint
Всего в шаблонной таблице будет до 1010. записей, что смущает, поскольку есть ограничения по дисковому пространству
6 июн 11, 10:55    [10767913]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
aleks2
Guest
1. Ты не поверишь, но
select 
	  a.reg_time
	, a.src
	, b.flag as src_flag
	, a.dest
	, c.flag as dest_flag
from @traffic a
left join @ranges b on a.src between b.start_range and b.end_range
left join @ranges c on a.dest between c.start_range and c.end_range

это лучший вариант. Только индексы бы нада...
6 июн 11, 11:01    [10767983]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
aleks2
Guest
Ой, блин... просмотрел

УЧИСЬ ПИСАТЬ ДАТУ как DATETIME или DATE.
6 июн 11, 11:04    [10768018]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
Jaffar
Member

Откуда:
Сообщений: 633
aleks2
Ой, блин... просмотрел

УЧИСЬ ПИСАТЬ ДАТУ как DATETIME или DATE.


все правильно datetime + индексы и будет все хорошо
6 июн 11, 11:48    [10768467]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
Ё-МАЙО
Member

Откуда: Москва. Сокол.
Сообщений: 24
aleks2
Ой, блин... просмотрел
УЧИСЬ ПИСАТЬ ДАТУ как DATETIME или DATE.
не уловил о чем речь
6 июн 11, 12:36    [10768863]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
DATETIME
Guest
Ё-МАЙО
aleks2
Ой, блин... просмотрел
УЧИСЬ ПИСАТЬ ДАТУ как DATETIME или DATE.
не уловил о чем речь


об этом
start_range varchar(21), end_range varchar(21)
6 июн 11, 12:46    [10768955]     Ответить | Цитировать Сообщить модератору
 Re: Вхождение в диапазон  [new]
Ё-МАЙО
Member

Откуда: Москва. Сокол.
Сообщений: 24
так там не даты
Ё-МАЙО
Вообще, значения которые сопоставляются это числа, так что можно перейти к bigint
6 июн 11, 12:49    [10768979]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить