C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

стр.: (2) < 1 [2] >
Embedded Firebird || Access, Декартовы произведения
Konstantine
Отправлено: 08.06.2006, 13:53


Мастер участка

Группа: Модератор
Сообщений: 545



QUOTE
например, сначала декартово произведение по первым двум вьюхам.

в этом что-то есть — нужно подумать о реализации...
правда есть одно НО — параметры встречаются и отрицательные (их мало но они есть)sad.gif
olegenty
Отправлено: 08.06.2006, 14:15


Ветеран

Группа: Модератор
Сообщений: 2412



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

а кто сказал, что всё должно быть легко?
в конце концов — высшее образование у тебя есть smile.gif
avc*
Отправлено: 08.06.2006, 14:25


Не зарегистрирован







Да... Сравнить все со всеми и отобрать нужные... Аналогично вижу только декартово произведение. Сочуствую.
Ни чего другого кроме такого пока в голову не идет
CODE

--Select Count(*) From PARECNT -- 4 400 188
--Select Count(distinct ord) около 200
Select
 t1.ID as ID1
,t2.ID as ID2
,t3.ID as ID3
,(  t1.dolgmonth
  + t2.dolgmonth
  + t3.dolgmonth
 ) as sumdolgmonth
,t1.ord, t2.ord, t3.ord
,t1.dolgmonth, t2.dolgmonth, t3.dolgmonth
From
 PARECNT t1
,PARECNT t2
,PARECNT t3
Where 1 = 1                                   -- только есди все параметры > 0
 and t1.ord = 1 and t1.dolgmonth is not null -- and t1.dolgmonth <= 50
 and t2.ord = 2 and t2.dolgmonth is not null -- and t2.dolgmonth <= 50
 and t3.ord = 2 and t3.dolgmonth is not null -- and t3.dolgmonth <= 50
--
 and (  t1.dolgmonth
      + t2.dolgmonth
      + t3.dolgmonth
     ) between 30 and 50
--
Order by (t1.dolgmonth + t2.dolgmonth + t3.dolgmonth)

при связке t1 и t2 ответ примерно за 2 мин, при добавлении 3 ответа не дождался.
olegenty
Отправлено: 08.06.2006, 14:33


Ветеран

Группа: Модератор
Сообщений: 2412



2 AVC — надо абстрагироваться от множеств и подумать, как определять минимум данных на ранних этапах. с использованием хранимых процедур и временных таблиц в них это не может быть невозможно. я пока только не придумал, что делать с "невыгодным" направлением логической операции и "невыгодным" знаком условия. но и это решаемо, а тогда всё можно свести к декартовым произведениям пар, как я писал выше.
avc*
Отправлено: 08.06.2006, 14:53


Не зарегистрирован







QUOTE (olegenty @ 08/06/2006, 14:33)
2 AVC — надо абстрагироваться от множеств и подумать, как определять минимум данных на ранних этапах

А никак не получается "по шагам". Если данные абсолютно произвольные, то на любом этапе мы можем получить комбинацию, удовлетворяющую условию. Т.е. пока не получищь все ко всем ни чего сказать нельзя.
Я вот пытаюсь подумать о другом способе хранения.
olegenty
Отправлено: 08.06.2006, 15:32


Ветеран

Группа: Модератор
Сообщений: 2412



по шагам на любом не получится — в результирующей выборке все 12 ID, а на любом другом этапе — меньше. зато на ранних этапах отсекутся неудолятворяющие условиям запись.

я тоже пытаюсь. как вариант — можно так.

Таблица 1
ID
TypeID
...

Таблица 2
ID
ParamTypeID (Param1, Param2 и так столько, сколько надо)
Value

щас ещё над запросом подумаю, получится ли при такой структуре
Konstantine
Отправлено: 08.06.2006, 15:34


Мастер участка

Группа: Модератор
Сообщений: 545



да всё примерно так...
кстати — напоминаю — можно использовать и Builder — т.е. не обязательно SQL должен готовый результат вернуть. можно некоторые промежуточные вычисления программно делать — я так и делаю — какие можно условия до декартового — ввожу и получаю минимальные вьюсы T1,T2 ... но и этого не хватает. реально что я получил — это полмиллиона записей на 6 типах (Аксес — 18 сек FireBird 27 сек). в принципе такое время удовлетворяет, но если бы оно было на 12 типах...
Gedeon
Отправлено: 08.06.2006, 15:46


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (olegenty @ 08/06/2006, 13:40)
2 Gedeon — читай мой предыдущий пост. я уже передумал и исправился smile.gif

Как-то я его или не увидел или открыл страницу, а отписался позже.
Gedeon
Отправлено: 08.06.2006, 15:48


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (avc* @ 08/06/2006, 14:53)
Я вот пытаюсь подумать о другом способе хранения.

Мне такая мысль сразу в голову пришла, когда увидел более полное обьяснение константина, но как-то предлагать не стал т.к. может эта таблица не самописная, а внешнее условие.
Konstantine
Отправлено: 08.06.2006, 15:48


Мастер участка

Группа: Модератор
Сообщений: 545



AVC, а что такое "PARECNT" в запросе?

а вот смотрите — может ли получиться такой вариант — делаем 3 декартовых произведения по 4 типа (это недолго по времени) и упорядочиваем по критериям.
дальше для каждого критерия "не меньше" (напр. Param3>30), значит в Dekart1 этот параметр должен быть>30-(Max(Dekart2.Param2))-(Max(Dekart3.Param2))
и так все остальные, ИМХО этим откинется большая часть записей (особенно если условий ограничений много) и потом из них делаем новое декартово — результирующее... wink.gif
Konstantine
Отправлено: 08.06.2006, 15:51


Мастер участка

Группа: Модератор
Сообщений: 545



Gedeon,AVC — таблица самописная, её можно менять, но вот на что? wink.gif
AVC
Отправлено: 08.06.2006, 16:12


Ветеран

Группа: Модератор
Сообщений: 1583



>AVC, а что такое "PARECNT" в запросе?
Существующая у меня на FireBird тестовая таблица, с полями, удовлетворяющими условиям эксперимента и содержащая много много записей.
id это id, ord это ваш type, а dolgmonth аналог param1

QUOTE

а вот смотрите — может ли получиться такой вариант — делаем 3 декартовых произведения по 4 типа (это недолго по времени) и упорядочиваем по критериям.

Нет. Смотрите, допустим в первой четверке получили
(T1.P1 + T2.P1 + T3.P1 + T4.P1) = -200 — отвергли,
но ведь в T5.P1 может стоять 240, значит
(T1.P1 + T2.P1 + T3.P1 + T4.P1 + T5.P1) = 40 — подходит.
Konstantine
Отправлено: 08.06.2006, 16:22


Мастер участка

Группа: Модератор
Сообщений: 545



но ведь вычитается-то как-раз максимальное.
в том примере Dekart1 — это записи, построенные из P1,P2,P3,P4
Dekart2 — это записи, построенные из P5,P6,P7,P8
Dekart3 — это записи, построенные из P9,P10,P11,P12

промежуточные откидывания — это чтоб сократить записи, которые уже не подойдут...
avc*
Отправлено: 08.06.2006, 17:40


Не зарегистрирован







Развивая эту идую дальше можно сказать что у нас Dekart1 сотоит из 3, 2 и, наконец, одного представления => ограничения можно наложить сразу на представления => приходим к варианту, предложенному olegenty (я на него тоже сначала повелся smile.gif ) => мы знаем что вариант ошибочен.

Вопрос сводится к предсказанию результата суммирования при условии, что данные имеют произвольные значения. Пока не получите полного объединения о результате суммирования ни чего сказать нельзя. Вот если бы это было бы произведение то можно было бы предсказать 0 или не 0 и, соответственно, снизить мощность выборок.
Konstantine
Отправлено: 08.06.2006, 22:03


Мастер участка

Группа: Модератор
Сообщений: 545



QUOTE
что у нас Dekart1 сотоит из 3, 2 и, наконец, одного представления
ну почему? из 12 представлений получаем 3 представления (около 100.000 записей каждая — проверил на задаче). Теперь из каждой создаём таблицу (наверно так лучше чтоб по нескольку раз не вычислялись декартовы произведения), но ставим условие отбора, предполагая что в каждой из оставшихся таблиц значения каждого параметра не больше максимального (тоже вычисляется для каждого представления). повторюсь:
QUOTE
дальше для каждого критерия "не меньше" (напр. Param3>30), значит в Dekart1 этот параметр должен быть>30-(Max(Dekart2.Param2))-(Max(Dekart3.Param2))
аналогично с ограничением параметра "меньше" — тогда берём в формуле минимум
и, если получиться снизить количество записей в этих 3-х таблицах меньше 100 — их можно объединить в финальное декартово произведение...

так ещё если поможет в оптимизации — параметры в основном имеют нулевые значения (больше 60% всех значений нулевые)

теперь ещё попутный вопрос. если я имею представление A и использую его в представлениях В и С, а представление В использую в С, то при выборке представления С — сколько раз вычисляется А — 1 или 2 ???

Отредактировано Konstantine — 08/06/2006, 22:22
AVC
Отправлено: 09.06.2006, 10:34


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

дальше для каждого критерия "не меньше" (напр. Param2>30), значит в Dekart1 этот параметр должен быть>30-(Max(Dekart2.Param2))-(Max(Dekart3.Param2))

Убедил. Так получится. Этим методом можно вычеркивать гарантированно непригодные (или оставить только пригодные, как у вас) строки и понижать мощность выборки.
Развивая идею дальше: в первом представлении можно оставить строки у которых P2> критерий — (max(p1)_по_T2 + max(p1)_по_T3 ... )
Эти maxmax(p1)_по_TN можно быстро получить одним запросом, только вот будет ли от этого толк? Надо экспериментировать.

QUOTE

теперь ещё попутный вопрос. если я имею представление A и использую его в представлениях В и С, а представление В использую в С, то при выборке представления С — сколько раз вычисляется А — 1 или 2

Зависит от конкретной реализации сервера. Наверное проще поставить пару эксперимнтов. Возможен вариант когда представления не вычисляться заранее а сервер просто рассчитывает результирующую строку в момент когда её требует курсор.
Konstantine
Отправлено: 13.06.2006, 08:56


Мастер участка

Группа: Модератор
Сообщений: 545



всё равно медленно. а max считает дольше чем само декартово строит sad.gif
стр.: (2) < 1 [2] >
Вернуться в Работа с базами данных в C++Builder