альтернатива union

Роберт

Аналитик
альтернатива union

А есть ли какая-то альтернатива union-запросам , когда надо вытащить одну строчку лежащую в какой-то из нескольких десятков полностью одинаковых таблиц по полностью одинаковому запросу. Чисто из экономии длинны запроса.
Ну типа вместо:
select *
from Arhiv_2009_06
where Login='-' and Tip='x' and Vid=1 and (Dostup='z1' or Prava='z*') and ......... and Karta between 3 and 12
UNION
select *
from Arhiv_2009_05
where Login='-' and Tip='x' and Vid=1 and (Dostup='z1' or Prava='z*') and ......... and Karta between 3 and 12
UNION
select *
from Arhiv_2009_04
where Login='-' and Tip='x' and Vid=1 and (Dostup='z1' or Prava='z*') and ......... and Karta between 3 and 12
UNION
...
UNION
select *
from Arhiv_2007_01
where Login='-' and Tip='x' and Vid=1 and (Dostup='z1' or Prava='z*') and ......... and Karta between 3 and 12

Вот вместо этого чтобы можно было бы использовать что-то вроде:
select *
from TableUnion(Arhiv_2007_01, Arhiv_2007_02, Arhiv_2007_03, ... , Arhiv_2009_06)
where Login='-' and Tip='x' and Vid=1 and (Dostup='z1' or Prava='z*') and ......... and Karta between 3 and 12

Ясное дело никакого TableUnion несуществует , но может есть чтото типа этого чтобы типа указать перечень таблиц в которых искать.
 

DiMA

php.spb.ru
Команда форума
есть 3 инструмента:

union
select (select... )
join

выбирай любой

длина текста sql запроса на скорость выполнения запроса не влияет (т.е. ничтожно мала)
 

findnext

Новичок
Роберт
сделай одну таблицу для всех архивов и расставь индексы
 

Роберт

Аналитик
findnext
Там каждая таблица по несколько десятков гигабайт.
Когда они по месяцу - их удобно потом бекапировать и плюс после того как месяц кончился - меняешь её тип на компрессед и она во много раз меньше. А запросы в ним крайне редко делаются (только если проблемы какие-то надо решать). Тут просто хочется сделать покороче код...
Это не принципиально , но ведь гораздо приятней использовать:
... and Tip in ('3','4','7','9') and ...
чем
... and (Tip='3' or Tip='4' or Tip='7' or Tip='9') and ...

DiMA
Про union - это да...
Про select (select... ) - не понял , ведь во вложенном серекте уже не объединить две таблицы даже через унион.
А про join - это мне кажется вообще не в тему , это ведь для декатрового перемножения таблиц , и для объединения однотипных таблиц в одну ни как не подходит).
 

DiMA

php.spb.ru
Команда форума
все указанные варианты позволяют обратиться к разным таблицам в одном запросе. Если тебе не хватает фантазии сочинить нужный запрос - твоя проблема, изучай доку или задай другой вопрос.

Вообще, идея поиска альтернативы юнион - бредовая: длина текста sql запроса на скорость выполнения запроса не влияет (т.е. ничтожно мала). Если лень писать руками - генери динамически, как подсказали... неужели не догадаться самому?.

Искать замену юнион, если тормозит сам SQL можно, но в общем случае 3 юниона сработают на порядки быстрее, чем пара джойнов или подзапросов (но это не твой случай).
 

Mandor

Новичок
У меня была подобная проблема решил как раз разбивкой одной большой таблицы на относительно маленькие (по месяцам) и делал выборку union'ом. Imho, не надо фантазировать, делать union, запрос генерить динамически, кешировать результат, если запрос долгий.

Автор оригинала: Роберт
Это не принципиально , но ведь гораздо приятней использовать:
... and Tip in ('3','4','7','9') and ...
чем
... and (Tip='3' or Tip='4' or Tip='7' or Tip='9') and ...
Or гораздо приятнее, чем in, он индексы использует.
 
Сверху