Официальный сайт студ.городка НГТУ
Программирование и БД » [SQL] field IN(A..B) versus field>=A AND field <=B 

#1  09.04.06 18:58

[SQL] field IN(A..B) versus field>=A AND field <=B

Что будет работать быстрее?

SELECT * FROM table WHERE field IN (1,2,3,4,5,6,7,8)

или

SELECT * FROM table WHERE field>=1 AND field <=8

?

А если интервал будет больше?

Offline

#2  09.04.06 19:03

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

сам проверь по времени...

Offline

#3  09.04.06 20:40

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

seva написал(а):

SELECT * FROM table WHERE field IN (1,2,3,4,5,6,7,8)

а если SELECT * FROM table WHERE field IN (1,4,6,8) ? :))

Offline

#4  09.04.06 20:48

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

Нет, 100% последовательные числа.. Просто так это одно условие, а с больше-меньше - два.

Offline

#5  09.04.06 21:09

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

where a in (b,c,d) разворачивается в where (a = b) or (a = c) or (a = d)
в итоге, при использовании <=> получается 2 сравнения на каждую запиcь (проверяется принадлежность интервалу, краткая запись =between), при использовании IN от 1(a = b) до 3-х (a not in(b,c,d)) проверок на каждую извлекаемую запись.

а вообще все зависит от реализации sql и нужно делать в соответствии с логикой, остальное пусть делает интерпретатор. для интервалов - between.

Offline

#6  09.04.06 21:11

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

спасибо, Сергей

Offline

#7  09.04.06 23:13

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

За

seva написал(а):

SELECT *

надо сразу руки отрывать, без проверки дальнейших условий.

Исправлено Мерзкий (09.04.06 23:14)

Offline

#8  09.04.06 23:19

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

Охуеть... Я для примера, блядь, написал.

Offline

#9  10.04.06 00:10

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

Мерзкий
Лех, я так думаю если посмотреть в твои исходники (не тестовые, а те, за которые деньги плачены), то ты останешься вообще без выступающих частей тела :)

Offline

#10  10.04.06 11:00

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

Matrim написал(а):

Мерзкий
Лех, я так думаю если посмотреть в твои исходники (не тестовые, а те, за которые деньги плачены), то ты останешься вообще без выступающих частей тела :)

чур не будем переходить на личности

Offline

#11  10.04.06 11:01

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

ctdf написал(а):

Охуеть... Я для примера, блядь, написал.

ну ладно, ладно. я же тоже пошулит
руки не отрывать совсем, только по локоть

Offline

#12  10.04.06 11:01

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

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

Offline

#13  10.04.06 11:36

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

XuMiX написал(а):

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

потому что не факт, что завтра в таблице полей не добавится, зачем тащить лишнее на клиента?

Offline

#14  10.04.06 12:29

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

Если ты уверен, что последовательность  (1,2,3,4,5,6,7,8) всегда начинается с 1, то эффективнее бедет
(field>0 AND field <=8)
т.к. сравнение с 0 обрабатывается быстрее процессором

Offline

#15  10.04.06 15:46

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

Мерзкий, а при чем тут клиент ? :) или у тебя cgi-скрипты на клиенте выполняются  ?:)
Зы эт я к тому, что Сева вряд ли пишет клиент-серверное приложение :)

Offline

#16  10.04.06 15:57

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

Не важно на чем писать. Серверу в любом случае придется делать выборку, зачем ему ненужная работа?

Offline

#17  13.04.06 12:21

Re: [SQL] field IN(A..B) versus field>=A AND field <=B

Matrim написал(а):

where a in (b,c,d) разворачивается в where (a = b) or (a = c) or (a = d)
в итоге, при использовании <=> получается 2 сравнения на каждую запиcь (проверяется принадлежность интервалу, краткая запись =between), при использовании IN от 1(a = b) до 3-х (a not in(b,c,d)) проверок на каждую извлекаемую запись.

а вообще все зависит от реализации sql и нужно делать в соответствии с логикой, остальное пусть делает интерпретатор. для интервалов - between.

Добавлю, что разнича есть в зависимости от того проиндексировано поле на которое накладывается условие или нет.
Пример (под Oracle):

SQL> create table tt as select * from all_objects;

Таблица создана.

Сначала с индексом:

SQL> create index tt_idx on tt(object_id);

Индекс создан.

SQL> set autotrace traceonly
SQL> select count(*) from tt where object_id in (100,101,102,103,104,105);

Затрач.время: 00:00:00.01

План выполнения
----------------------------------------------------------                     
   0      SELECT STATEMENT Optimizer=CHOOSE                                     
   1    0   SORT (AGGREGATE)                                                   
   2    1     CONCATENATION                                                     
   3    2       INDEX (RANGE SCAN) OF 'TT_IDX' (NON-UNIQUE)                     
   4    2       INDEX (RANGE SCAN) OF 'TT_IDX' (NON-UNIQUE)                     
   5    2       INDEX (RANGE SCAN) OF 'TT_IDX' (NON-UNIQUE)                     
   6    2       INDEX (RANGE SCAN) OF 'TT_IDX' (NON-UNIQUE)                     
   7    2       INDEX (RANGE SCAN) OF 'TT_IDX' (NON-UNIQUE)                     
   8    2       INDEX (RANGE SCAN) OF 'TT_IDX' (NON-UNIQUE)                     

Статистика
----------------------------------------------------------                     
          0  recursive calls                                                   
          0  db block gets                                                     
         12  consistent gets                                                   
          0  physical reads                                                     

SQL> select count(*) from tt where object_id between 100 and 105;

Затрач.время: 00:00:00.01

План выполнения
----------------------------------------------------------                     
   0      SELECT STATEMENT Optimizer=CHOOSE                                     
   1    0   SORT (AGGREGATE)                                                   
   2    1     INDEX (RANGE SCAN) OF 'TT_IDX' (NON-UNIQUE)                       


Статистика
----------------------------------------------------------                     
          0  recursive calls                                                   
          0  db block gets                                                     
          2  consistent gets                                                   
          0  physical reads                                                     

Теперь без индекса по этому полю:

SQL> drop index tt_idx;

Индекс удален.

SQL> select count(*) from tt where object_id in (100,101,102,103,104,105);

  COUNT(*)                                                                     
----------                                                                     
         0                                                                     

План выполнения
----------------------------------------------------------                     
   0      SELECT STATEMENT Optimizer=CHOOSE                                     
   1    0   SORT (AGGREGATE)                                                   
   2    1     TABLE ACCESS (FULL) OF 'TT'                                       

Статистика
----------------------------------------------------------                     
          0  recursive calls                                                   
          0  db block gets                                                     
        341  consistent gets                                                   
          0  physical reads                                                     

SQL> select count(*) from tt where object_id between 100 and 105;

  COUNT(*)                                                                     
----------                                                                     
         0                                                                     

План выполнения
----------------------------------------------------------                     
   0      SELECT STATEMENT Optimizer=CHOOSE                                     
   1    0   SORT (AGGREGATE)                                                   
   2    1     TABLE ACCESS (FULL) OF 'TT'                                       

Статистика
----------------------------------------------------------                     
          0  recursive calls                                                   
          0  db block gets                                                     
        341  consistent gets                                                   
          0  physical reads

Offline

Программирование и БД » [SQL] field IN(A..B) versus field>=A AND field <=B 

ФутЕр:)

© Hostel Web Group, 2002-2026.   Сообщить об ошибке

Сгенерировано за 0.489 сек.
Выполнено 14 запросов.