Thread: операция << для типа INET и проверка в IN

Добрый день !

 

есть запрос

 

SELECT count(d_ip)
FROM traf_raw
WHERE (d_ip  << '192.168/16'::inet )

 

нужно '192.168/16'::inet заменить результатом выборки

 

select subnet from network

 

т.о. напрашивается проверка с IN, типа

WHERE (d_ip  IN (select subnet from network) )

вопрос: как сюда вставить "<<"

чтобы была проверка адреса по маске ?

 

обходные варианты

 

SELECT count(d_ip)
FROM traf_raw tr
WHERE (exists (select 1 from network n where tr.d_ip << n.subnet limit 1) )

 

и

 

select count(d_ip)
from network n
left join traf_raw tr on (tr.d_ip << n.subnet)

 

рассматривались, но есть надежда, что запрос с IN будет быстрее :)

 

d_ip и subnet типа inet,

в таблице network 2 записи, в traf_raw несколько миллионов,

PostgreSQL 8.1.1 

стандартное решение здесь WHERE EXISTS
разве оно дает плохой план выполнения запроса?

On 6/27/07, Serik <uge@pochtamt.ru> wrote:
>
>
> Добрый день !
>
>
>
> есть запрос
>
>
>
> SELECT count(d_ip)
> FROM traf_raw
> WHERE (d_ip  << '192.168/16'::inet )
>
>
>
> нужно '192.168/16'::inet заменить результатом выборки
>
>
>
> select subnet from network
>
>
>
> т.о. напрашивается проверка с IN, типа
>
> WHERE (d_ip  IN (select subnet from network) )
>
> вопрос: как сюда вставить "<<"
>
>  чтобы была проверка адреса по маске ?
>
>
>
> обходные варианты
>
>
>
> SELECT count(d_ip)
> FROM traf_raw tr
> WHERE (exists (select 1 from network n where tr.d_ip << n.subnet limit 1) )
>
>
>
>
> и
>
>
>
> select count(d_ip)
> from network n
> left join traf_raw tr on (tr.d_ip << n.subnet)
>
>
>
>
>  рассматривались, но есть надежда, что запрос с IN будет быстрее :)
>
>
>
> d_ip и subnet типа inet,
>
>
> в таблице network 2 записи, в traf_raw несколько миллионов,
>
> PostgreSQL 8.1.1