выборка из заранее неизвестного множества таблиц

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

tss
Сообщения: 5
Зарегистрирован: 21 июн 2005, 21:15

выборка из заранее неизвестного множества таблиц

Сообщение tss » 21 июн 2005, 21:22

Как сделать выборку из заранее неизвестного множества таблиц, притом что формирование динамически SQL не подходит по причине большой длины?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 июн 2005, 22:11

Примерно так же, как пойти туда, не знаю куда, и принести то, не знаю что.

tss
Сообщения: 5
Зарегистрирован: 21 июн 2005, 21:15

Сообщение tss » 22 июн 2005, 11:33

Merlin писал(а):Примерно так же, как пойти туда, не знаю куда, и принести то, не знаю что.
Попробую объяснить иначе: select * from table1,table2,..tableN; таблиц может быть больше чем 255. Можно ли в принципе за один вызов сделать выборку из более чем 255 таблиц?

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 22 июн 2005, 11:43

И зачем надо такое декартово произведение?

Dmitry Beloshistov
Сообщения: 41
Зарегистрирован: 27 окт 2004, 11:06

Сообщение Dmitry Beloshistov » 22 июн 2005, 11:51

Лысый писал(а):И зачем надо такое декартово произведение?
Как зачем? :shock: Чтобы завесить клиентов, загрузить сеть по максимуму, отправить в ступор сервер 8)
Кстати, если я правильно путаю, в SQL запросе не может быть более 255 таблиц.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 июн 2005, 12:48

судя по вопросу, понятно, что структура БД спроектирована ни в дуду.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 22 июн 2005, 12:50

tss писал(а):select * from table1,table2,..tableN; таблиц может быть больше чем 255. Можно ли в принципе за один вызов сделать выборку из более чем 255 таблиц?
Нет

tss
Сообщения: 5
Зарегистрирован: 21 июн 2005, 21:15

Сообщение tss » 22 июн 2005, 15:17

Нет
Хоть один нормальный ответ. А с помощью ХП никак нельзя решить?

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 22 июн 2005, 15:45

Эдак вся моя боевая бд дважды в такой запрос уберется дважды и еще на хватит... :roll:

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 22 июн 2005, 16:43

tss писал(а):А с помощью ХП никак нельзя решить?
Никак. Я не знаю серверов, которые могут объединять более 256 таблиц в запросе и не знаю, зачем это нужно. Даже если представить себе, что такое возможно, я думаю план построения этого запроса будет строится очень долго

В IB\FB есть архитектурное ограничение на 255 контекстов, используемых в одном запросе - неважно, простой это SELECT, или вызов SP.
Контекст - это ссылка на таблицу (persistent или derived), агрегат

tss
Сообщения: 5
Зарегистрирован: 21 июн 2005, 21:15

Сообщение tss » 22 июн 2005, 18:07

hvlad писал(а):
tss писал(а):А с помощью ХП никак нельзя решить?
Никак. Я не знаю серверов, которые могут объединять более 256 таблиц в запросе и не знаю, зачем это нужно. Даже если представить себе, что такое возможно, я думаю план построения этого запроса будет строится очень долго

В IB\FB есть архитектурное ограничение на 255 контекстов, используемых в одном запросе - неважно, простой это SELECT, или вызов SP.
Контекст - это ссылка на таблицу (persistent или derived), агрегат
Если я спрошу иначе: можно ли написать процедуру которая бы выбрала по одной записи из 365 таблиц и вернула результат в виде набора данных?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 22 июн 2005, 20:15

tss писал(а):Если я спрошу иначе: можно ли написать процедуру которая бы выбрала по одной записи из 365 таблиц и вернула результат в виде набора данных?
Одну процедуру - нет, т.к. можно написать только 255 селектов в одной процедуре.
С вызовом вложенных процедур - да.

Klyk
Сообщения: 100
Зарегистрирован: 26 окт 2004, 23:28

Сообщение Klyk » 22 июн 2005, 23:22

tss писал(а):Если я спрошу иначе: можно ли написать процедуру которая бы выбрала по одной записи из 365 таблиц и вернула результат в виде набора данных?
А может всё таки имеет пересмотреть структуру БД?
Что-то, я не могу себе представить как так можно было организовать атк БД чтоб нужно было делать такой Select?

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 22 июн 2005, 23:22

Вот это:
tss писал(а):Если я спрошу иначе: можно ли написать процедуру которая бы выбрала по одной записи из 365 таблиц и вернула результат в виде набора данных?
совсем не равно вот этому:
select * from table1,table2,..tableN;
даже если в каждой таблице по одной записи...

tss
Сообщения: 5
Зарегистрирован: 21 июн 2005, 21:15

Сообщение tss » 23 июн 2005, 11:04

структура БД определена не мной и менять я ее не могу. белее того, ее не нужно менять, не смотря ни на что она правильная. если бы каждый день нужно было сохранять порядка 100тыс. записей как бы кто поступил? то что на каждый день заводится новая таблица, для таких условий - это нормально.

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Сообщение SAMZ » 23 июн 2005, 11:38

tss писал(а):структура БД определена не мной и менять я ее не могу. белее того, ее не нужно менять, не смотря ни на что она правильная. если бы каждый день нужно было сохранять порядка 100тыс. записей как бы кто поступил? то что на каждый день заводится новая таблица, для таких условий - это нормально.
Может тебе Union попробовать

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 23 июн 2005, 12:34

tss писал(а):если бы каждый день нужно было сохранять порядка 100тыс. записей как бы кто поступил? то что на каждый день заводится новая таблица, для таких условий - это нормально.
Глупости (и\или тяжкое наследие времен dbf).
Единственное оправдание - лимит на р-р таблицы, но вы не его имели в виду, когда строили такую стр-ру.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 23 июн 2005, 14:14

За год-то может и многовато будет, но на каждый день по таблице... Напомнило баянчик:

Если взрослого мыша
взять и, бережно держа,
напихать в него иголок
Вы получите ежа.
Если этого ежа,
нос заткнув, чтоб не дышал,
Где поглубже, бросить в речку
Вы получите ерша.
Если этого ерша,
головой в тисках зажав,
посильней тянуть за хвост то
Вы получите ужа.
Если этого ужа,
приготовив два ножа...
Впрочем, он наверно сдохнет,
Hо идея хороша!

Данилов Юрий
Сообщения: 31
Зарегистрирован: 27 окт 2004, 11:56

Сообщение Данилов Юрий » 23 июн 2005, 14:37

Согласен с предыдущими ораторами.
Но поскольку с точки зрения теории музыки и законов гармонии хуже уже дальше некуда, а Буха (не путать с Бахом) все устраивает то выкручиваться, собирая сначала за квартал, для чего пишется ХП Quarter(Quarter_No), а потом её уже дергать 4 раза из итожащей ХП.
IMHO на 92 таблицы контекстов хватит?

Slava Ekimov
Сообщения: 44
Зарегистрирован: 26 окт 2004, 14:30

Сообщение Slava Ekimov » 23 июн 2005, 14:39

tss писал(а):структура БД определена не мной и менять я ее не могу. белее того, ее не нужно менять, не смотря ни на что она правильная. если бы каждый день нужно было сохранять порядка 100тыс. записей как бы кто поступил? то что на каждый день заводится новая таблица, для таких условий - это нормально.
Ну вот у меня в небольшой базульке около 3 млн в одной таблице и чо?

Ответить