Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.08.18;
Скачать: [xml.tar.bz2];

Вниз

firebird IN   Найти похожие ветки 

 
d_oleg   (2003-07-21 15:55) [0]

вопрос к знатокам: почему при использовании IN в запрсе не происходит использование индекса по этому полю?

пример:
select NO from SAMPLE_TABLE where NO=1
select NO from SAMPLE_TABLE where NO between 1 and 10
в этих запросах нормально ипользуется индекс и происходит 10 чтений из БД

select NO from SAMPLE_TABLE where NO in (1,2,3,4)
а при таком запросе происходит чтение _всех_ записей из БД.

поле NO проиндексировано


 
Alexandr   (2003-07-21 15:56) [1]

потомучто.
Так сделано.


 
d_oleg   (2003-07-21 16:08) [2]

ответ исчерпывающий :-(


 
Johnmen   (2003-07-21 16:34) [3]

>при использовании IN в запрсе не происходит использование
>индекса по этому полю

Где это видно ?

>и происходит 10 чтений из БД

Как это проверено ?

>происходит чтение _всех_ записей из БД.

Откуда известно ?


 
d_oleg   (2003-07-21 17:40) [4]

статистика в IBExpert. Насчёт "не используется индекс" я наверное не совсем правильно выразился - чтения показываются как индексированные, но кол-во чтений равно кол-ву записей в таблице.


 
Sergey13   (2003-07-21 17:42) [5]

2d_oleg © (21.07.03 15:55)
Когда ты указываешь конкретное значение поля БД ищет это значение в индексе, находит и читает в таблице нужную строку. Когда ты указываешь несколько значений - БД не может сопоставить этот набор значений и значение в индексе. Так что все логично - IN дорогая операция.


 
d_oleg   (2003-07-21 17:48) [6]

ну видимо так оно и есть... но как-то не логично получается - неужели нельзя делать отработку запроса в несколько проходов?


 
Sergey13   (2003-07-21 17:56) [7]

2d_oleg © (21.07.03 17:48)
>ну видимо так оно и есть... но как-то не логично получается - неужели нельзя делать отработку запроса в несколько проходов?
"В несколько" это во сколько. Там иногда может быть подзапрос который возвращает кучу записей - ни одного сервака не хватит.


 
Johnmen   (2003-07-21 18:14) [8]

>d_oleg © (21.07.03 17:40)

Да, индекс используется в обоих случаях.

>... кол-во чтений равно кол-ву записей в таблице.

Чтений чего ?

>неужели нельзя делать отработку запроса в несколько проходов?

В смысле ?


 
Alexandr   (2003-07-22 07:19) [9]

запихай свой список в in во временную таблицу.
И сджойни с ней твой запрос.
Такой скорости ты еще никогда не видел!


 
d_oleg   (2003-07-22 10:40) [10]

да нафига, проще наверное сделать UNION, на несколько запросов разбив...


 
Alexandr   (2003-07-22 10:43) [11]

а не будет ли это по скорости как и in


 
d_oleg   (2003-07-22 13:39) [12]

нет, ведб тогда нормально запрос отрабатывает, по индексу


 
Alexandr   (2003-07-22 14:00) [13]

но запросов то много. Ну и что что каждый по индексу...
union то много.


А вообще список значений для in откуда идет?


 
d_oleg   (2003-07-22 15:49) [14]

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


 
Alexandr   (2003-07-23 10:22) [15]

вот и пусть юзер в таблицу свои значения и вносит.
И теряться ничего не будет при перезагрузке программы. Удобно.
Юзеры тебе за это только спасибо скажут.


 
d_oleg   (2003-07-23 11:00) [16]

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


 
Alexandr   (2003-07-23 11:09) [17]

ну-ну...
жизнь покажет...
давайте не будем базу засорять и пользовательскими документами и справочниками заодно... Метаданными? тоже пожалуй лучше не засорять ибо толку от них нету...
Вот это будет в корне правильный подход...


 
d_oleg   (2003-07-23 12:48) [18]

ну зачем же так категорично? Данные в базе должны быть, но вот такие структуры, типа временных таблиц, не всегда оправданы. Условия выборки хранить в базе? Ну давайте тогда и запросы все туда засунем. А запросы на выборку запросов? С ними как? Утрирую конечно. Но к примеру, если есть справочник из нескольких сот наименований и пользователю захотелось получить инф. по десятку из них - стоит ли пихать в базу эту инфу? Она будет накапливаться с ростом кол-ва пользователей, доп. проверки при управлении пользователями (удаление к примеру), удаления при смене параметров запроса, накопление т.о. мусорных страниц и всяческий подобный геморой. Оно того стоит?


 
Alexandr   (2003-07-23 12:55) [19]

надуманные проблемы.


 
Sandman25   (2003-07-23 13:01) [20]

d_oleg © (23.07.03 12:48)

У нас у одних из клиентов неожиданно свет выключают, поэтому при работе в кассе сразу после выбора товара он записывается в БД. После набора всех товаров покупки происходит осуществление проводки и удаление этих товаров из "временной" таблицы. И ничего, никаких проблем не возникало :)


 
d_oleg   (2003-07-23 13:30) [21]

ну одно дело, когда с покупками работаешь (тут, естественно, всё должно фиксироваться в БД, кстати совсем не обязательно потом покупки из заказа удалять, просто можно ставить флаг оплаченности заказа, потом эти данные пригодятся), совсем другое - статистику снимаешь. Нужны тогда такие вещи? Ну спорить далее не буду, просто бывают разные ситуации.


 
Sandman25   (2003-07-23 13:34) [22]

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


 
d_oleg   (2003-07-23 13:37) [23]

да в том-то и дело, что не ускоряет оно, ни значительно, ни как


 
Sandman25   (2003-07-23 13:38) [24]

Понятно. Просто мне показалось, что Вы старались добиться использования индекса для ускорения.


 
d_oleg   (2003-07-23 13:38) [25]

связывание таблиц - в любом случае дело небесплатное, в аспекте ресурсов сервера.


 
d_oleg   (2003-07-23 13:40) [26]

Естественно пытался. In это делать не позволяет, а UNION - пожалуйста, отрабатывай несколько запросов - и дело с концом.


 
Sandman25   (2003-07-23 13:43) [27]

Убедили.
Все же надеюсь, что Вам не понадобится
select A.*
from A, B
where A.type in (1,2,3,4)
( 5,6,7,8) Убедили.
Все же надеюсь, что Вам не понадобится
select A.*
from A, B
where A.type in (1,2,3,4)
and B.type in (5,6,7,8)
and A.id = B.id
А то слишком много UNION получается


 
d_oleg   (2003-07-23 13:45) [28]

Ну не бывает универсальных решений :-(
Да, к сожеалению и такой аспект имеет место быть.


 
d_oleg   (2003-07-23 13:47) [29]

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


 
Johnmen   (2003-07-23 13:53) [30]

По-моему, Alexandr © просто прикололся...:)

>d_oleg ©

Чем же не устраивает IN ?


 
Alexandr   (2003-07-23 14:01) [31]

кто я прикололся?
нет...
Чистая правда.
И настаиваю что это будет самый быстрый способ.
И самый универсальный.
И самый безглючный...
А почему тебе так показалось?


 
Sandman25   (2003-07-23 15:42) [32]

Johnmen © (23.07.03 13:53)

У меня был случай, что надо было один долгий SELECT ускорить.
НаибОльшая скорость оказалась, когда я засунул 3 параметра во временную таблицу (назовем ее T), а потом использовал связку
where A.date1 = T.date1
and B.date2 = T.date2
and C.type = T.type
Так что всякое в жизни бывает :)


 
Johnmen   (2003-07-23 18:04) [33]

>Alexandr © (23.07.03 14:01)

>...настаиваю что это будет самый быстрый способ.

Не факт ! Зависит от многих факторов.

>..самый универсальный.

В чем универсальность ? В выполнении нескольких запросов (в т.ч. и на запись) вместо одного ?

>...самый безглючный...

Чем меньше кода, чем меньше запросов, тем меньше глюков. И ошибок...

>Sandman25 © (23.07.03 15:42)

Не возражаю. Бывают редкие случаи, когда в угоду скорости приносится в жертву всё остальное. Естественно, это м.б. оправдано...


 
Sandman25   (2003-07-23 18:23) [34]

Johnmen © (23.07.03 18:04)

>Чем меньше кода, чем меньше запросов, тем меньше глюков. И ошибок...

Не согласен. Когда-нибудь пытались разобраться в чужом коротком коде на С, написанном "настоящим сишником"?


 
Johnmen   (2003-07-23 18:33) [35]

>Sandman25 © (23.07.03 18:23)

Не знаю, как там у "сишников", я сказал об общем критерии. Справедливом не только в программировании :)


 
Sandman25   (2003-07-23 18:39) [36]

Johnmen

Не будем углубляться в философию, но "меньше" не всегда значит "проще" и тем более "надежнее".


 
Johnmen   (2003-07-23 18:51) [37]

>Sandman25 © (23.07.03 18:39)

Наверное, бывают исключения...:) Но я их не знаю...


 
Alexandr   (2003-07-24 08:17) [38]

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



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.08.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.004 c
14-58391
Kocmoc
2003-08-04 14:47
2003.08.18
Сортировка StringGrid


14-58439
syte_ser78
2003-07-31 15:47
2003.08.18
Удаление записи из ДБ


14-58404
Puke Zero
2002-12-14 16:35
2003.08.18
Font.FontStyle


14-58473
XanderMan
2003-07-23 16:41
2003.08.18
Неотменяемая транзакция внутри сохраненной процедуры


14-58382
gyv
2002-11-28 13:51
2003.08.18
Проблема с KOLmdvXLGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский