FETCH ... BULK COLLECT INTO ... [LIMIT rows]
Тем менее, приведенный выша алгоритм благополучно работает.Автор оригинала: romutis
Что-то тема начала напоминать конкурс извращенцев...![]()
Ok, показываю на примере. Пусть есть сущность goods, разложенная на две таблицы: goods_head (id) и goods_body(id,title,price). Строим запрос для извлечения всех id товаров дешевле 100:Автор оригинала: romutis
А если запрос идет не по первичному ключу, а по альтернативному индексу, например, битовому индексу? Для значений битового ключа тоже делать отдельную таблицу?
select goods_head.id
from goods_head, goods_body
where( goods_head.id = goods_body.id)
and( goods_body.price < 100 )
Радость в том, что подавлябщая часть контента исключена из TableScan'а. Т.е. мы читаем в 10-100 раз меньше информации.Автор оригинала: romutis
И, кстати, какая радость в дублировании id? В твоем примере кол-во ID в heads = кол-ву ID в body. И если ассортимент большой - то те же balls - full-scan большой таблицы (которая heads).
При чем здесь телефоны? Они у тебя сделаны первичными ключами?Дублируем, например, телефоны в отдельной таблице и фуллсканим эти несчастные 5 млн. телефонов? Никаких ощутимых бенефитов - 100 пудов.
Слушай, если мы будем делать select только id из большой таблицы - мы считаем ровно такой же объем инфы. Или ты про block_read?Автор оригинала: Crazy
Радость в том, что подавлябщая часть контента исключена из TableScan'а. Т.е. мы читаем в 10-100 раз меньше информации.
Нет, но, к примеру, 30% запросов составляет поиск персоны/персон по номеру/маске телефона. Что тут делать бум?Автор оригинала: Crazy
При чем здесь телефоны? Они у тебя сделаны первичными ключами?
Это зависит от конкретной СУБД. В общем случае запись читается с диска целиком -- прочитается не только id, но и все остальные поля. Та или иная СУБД может оптимизировать процесс (вплоть до того, что может не обращаться к таблице, если есть индекс по данному полю).Автор оригинала: romutis
Слушай, если мы будем делать select только id из большой таблицы - мы считаем ровно такой же объем инфы. Или ты про block_read?
Делать индекс по этому полю -- как всегда.Нет, но, к примеру, 30% запросов составляет поиск персоны/персон по номеру/маске телефона. Что тут делать бум?
Прости, я не понял ни этой фразы, ни приведенного выше примера.И вообще - что делать, если primary key не участвует в выборке или выборка по нему не является оптимально с точки зрения performance (см. вышеприведенный пример про телефоны)?
А я думал что мы в Оракловском форуме находимся и обсуждаем именно Оракл а не "сферических коней в вакууме"...Автор оригинала: Crazy
Это зависит от конкретной СУБД.
Индекс по полю "телефон", который не является первичным индексом (бо глупо делать из номера телефона первичный признак человека) и не вынесен в отдельную таблицу - не вписывается в написанное тобой решение. Но вписывается в то, что написал я - причем мой вариант будет почти всегда работать быстрее, за счет отсутствия full-сканов и join'ов (для какой бы то ни было таблицы).Автор оригинала: Crazy
Делать индекс по этому полю -- как всегда.
Прости, я не понял ни этой фразы, ни приведенного выше примера.
Т.е. ты хочешьс казать, что Oracle умеет при tablescan делать выборочную загрузку указанных полей?Автор оригинала: romutis
А я думал что мы в Оракловском форуме находимся и обсуждаем именно Оракл а не "сферических коней в вакууме"...![]()
Почему goods_body.price вписывается, в phone -- не вписывается?Индекс по полю "телефон", который не является первичным индексом (бо глупо делать из номера телефона первичный признак человека) и не вынесен в отдельную таблицу - не вписывается в написанное тобой решение.
Как и в любой СУБД.Автор оригинала: romutis
Crazy, для Оракла критичным является кол-во считанных блоков.
В данном случае нас интересует то, как хранятся записи: поля записей последовательно, запись за записью? Или вначале все поля A, потом все поля B и т.п.?А что там содержится - одно поле или вся запись целиком - это уже вопрос номер 16.
Лично я с удовольствием послушаю.Но здесь мы отклоняемся в админскую область, о которой девелоперам знать не обязательно.![]()
Шеф, ты последовательно уводишь обсуждение в сторону от темы. Вернемся к началу:Про телефоны
Прекрасно. Пусть у нас будет таблица phones_body, в которой есть целочисленное поле id, являющееся первичным ключом и поле phone типа char(20), по которому построен индекс. И еще пусть там жу будет штук 20 полей foobar1..foobar20 типа char(100) со всяким мусором. И будет у нас таблица phones_head с единственным целочисленным полем id, которое является первичным индексом.P.S. Я даже готов сделать реальные таблицы для такой структуры, набить их всяким <beep> и предоставить тебе результаты EXPLAIN PLAN для разных вариантов выборок.
select phones_head.id
from phones_body, phones_head
where( phones_body.phone > '111111')
and( phones_body.phone < '22222')
and( phones_body.id = phones_head.id )