Как обойти The maximum number of tables in a query (260) ...

Здесь обсуждаем систему TDM/PDM/Workflow Lotsia PDM PLUS (PartY PLUS).
Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

я так понимаю, Продукты, Клиенты и Контакты - это все разные типы объектов (в случае с Продуктами - несколько типов сразу), которые между собой как-то связаны.. а можно узнать, КАК ИМЕННО они между собой связаны? я успел догадаться (и то не факт, что правильно), что у Продукта есть ИД клиента и ИД контакта.. а больше - пока не могу врубиться..
и еще хотелось бы посмотреть на таблицу, которая должна в итоге получиться, какие атрибуты (и от каких объектов) должны быть в этой таблице...
можно?
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

Да это объекты разных типов НИКАК НЕ СВЯЗАННЫЕ между собой средствами SQL , для связи используется прямая адресация через 'адресные' атрибуты (атрибуты содержащие id объектов)
в двух словах схема такая (обрезанная только суть)

Код: Выделить всё

Объект (несколько разных типов, например Soft Hard и т.д)  
  Продукт 
     набор атрибутов полностью описывающих продукт
       +
     атрибут 'id Клиента'
       +
     атрибут 'id Контакта'

Объект
  Клиент 
     набор атрибутов полностью описывающих Клиента

Объект
  Контакт 
     набор атрибутов полностью описывающих Контактное лицо
В результате нужно получить одну таблицу из атрибутов 3х объектов разного типа, в виде (например)

Код: Выделить всё

prod_Name(атрибут продукта) | prod_Status(атрибут продукта) | id_Client(атрибут продукта) | id_Contact(атрибут продукта) | client_Name(атрибут клиента) | Client_Id(системный id клиента) | Client_Status(атрибут клиента) | Contact_Name(атрибут контакта) | Contact_Id(системный id контакта) | Contact_email(атрибут контакта)
т.е. по точкам входа выхода объектов собрать всю информацию из несвязанных объектов разного типа и вывести результаты в виде одной таблицы

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

а фильтрация делается по "таблице" Продукты?
какое условие для фильтра?
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

а фильтра вообще нет (если ты имеешь в виду фильтр Лоции) работаю по всем объектам отбираемым в запросе
1.Нахожу все продукты с признаком >0
2.Нахожу всех клиентов системный id которых = атрибут id Клиента в найденных продуктах
3.Нахожу все контакты системный id которых = атрибут id Контакта в найденных продуктах

Объединяю все 3 таблицы в одну, и тут получаю полный Облом в Лоции (многократное дублирование, причем на разных запросах разное - подробно не разбирался)
в QA запрос выполняется .5 сек а из Лоции 4 минуты (примерно)

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

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

самое интересное - вытащить определенный атрибут объекта, на который есть ссылка в попавшемся нам объекте..

у меня совсем другая структура данных, но вот такой запрос работает адекватно:

Код: Выделить всё

select obj.description
,(select vs.value
from
lsdbo.attrib_value_view av
,lsdbo.value_string_view vs
where
av.value_id = vs.id
and
av.attrib_id = 100004870800458
-- это ИД атрибута, который нам нужно вытащить у связанного объекта, например, у Клиента
and
av.object_id in
	(select vs.value
	from 
	lsdbo.attrib_value_view av
	,lsdbo.value_string_view vs
	where
	av.object_id = obj.id
	and
	av.value_id = vs.id
	and
	av.attrib_id = 100001164300000
-- это ИД атрибута, который содержит ссылку на связанный объект, например, на Клиента 
	)
)
from
lsdbo.object_reference_view obj
where
obj.type_id = 100001104000000
-- это ИД типа объектов, которые мы отбираем, например, Продукт
and
obj.id in
(select av.object_id
from 
lsdbo.attrib_value_view av
,lsdbo.value_string_view vs
where
av.value_id = vs.id
and
av.attrib_id = 100001164300000
-- это ИД атрибута, который содержит ссылку на связанный объект, например, на Клиента
)
конечно, фильтрацию в главном WHERE можно сделать и другую
но смысл такой, что таким же способом можно вытащить и другие атрибуты связанного объекта... или объектов..
а кстати, зачем у Продукта две ссылки - на Клиента и на Контакт? ведь Клиент однозначно определяется Контактом... и можно от Контакта перейти к Клиенту..
ну это уже так... :-) мысли вслух.. :-)))
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

контакт и клиент разделены между собой объектом контактные лица и соответственно никак не связаны между собой напрямую

Спасибо за пример!!! и главное то что нужно и один запрос и в QA и Лоции выполняется одинаково и по времени и по количеству объектов ...
НО по сравнению с объединением таблиц - он затрачивает на извлечение той же информации в QA - чудовищно много времени
конкретно в основном Select'e при извлечении атрибутов сторонних объектов

Код: Выделить всё

select lsdbo.object_reference_view.description,
--теряем время на извлечение родных атрибутов объекта - с этим можно мириться (никуда не денешься) 
     (SELECT vv.value
         FROM lsdbo.attrib_value_view av,
              lsdbo.value_string_view vv
        WHERE av.value_id = vv.id
              AND av.object_id = lsdbo.object_reference_view.id
              AND av.treelink_id = 0
              AND av.attrib_id = 100007986500005) as prod_Status,  
...
--теряем огромное количество времени на извлечение чужих атрибутов 
      (SELECT vs.value
         FROM lsdbo.attrib_value_view av,
              lsdbo.value_string_view vs
        WHERE av.value_id = vs.id
              and av.attrib_id = 100000016000000
              and av.object_id in
                (SELECT vs.value
                   FROM lsdbo.attrib_value_view av,
                        lsdbo.value_numeric_view vs
                  WHERE av.object_id = lsdbo.object_reference_view.id
                        and av.value_id = vs.id
                        and av.attrib_id = 100004060300000))
...
  from  lsdbo.object_reference_view, 
        lsdbo.object_type_view 
  where (lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id)
         and (lsdbo.object_reference_view.type_id
                 in(100006459500000,100023044500000,100024516500000,-103))
         and (lsdbo.object_reference_view.id
                 in (Select av.object_id
                       From lsdbo.attrib_value_view av,
                            lsdbo.value_numeric_view vv
                      Where av.value_id = vv.id
                            and av.attrib_id = 100004060500000
                            and vv.attrib_id = 100004060500000
                            AND vv.Value > 0) )
         and (lsdbo.object_reference_view.id in
                    (select av.object_id
                       from lsdbo.attrib_value_view av,
                            lsdbo.value_numeric_view vn
                      where av.value_id = vn.id
                            and av.attrib_id = 100004060300000
                            and vn.attrib_id = 100004060300000
						))
         and (lsdbo.object_reference_view.id in
                    (select av.object_id
                       from lsdbo.attrib_value_view av,
                            lsdbo.value_numeric_view vn
                      where av.value_id = vn.id
                            and av.attrib_id = 100004081100000
                            and vn.attrib_id = 100004081100000
						))
если бы только этот кусок работал быстро :( а так к сожалению это не выход
Но за идею спасибо!! (за where) я бы никогда в жизни не додумался как это все сунуть в один запрос :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

ого, какой огромный фильтр...
аж три условия по атрибутам, насколько я понимаю...

а зачем нужно вот это:
AND av.treelink_id = 0
????

и еще, зачем нужно вот это:
lsdbo.object_type_view
и
lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id
????
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

зачем это
sdbo.object_type_view
lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id
AND av.treelink_id = 0
не знаю, я в SQL чайник, и все это из Profiler

но по ощущениям это все на скорость не влияет и основной Select с родными атрибутами и большой главный Where работают приемлемо быстро
а вот извлечение атрибутов чужих объектов-это конец...
по скорости сравнимо как если бы я эти три запроса обрабатывал тремя связанными отчетами с передачей сквозных аргументов (что собственно сейчас я и делаю, в ожидании ответа Лоции)

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

лично я не вижу смысла в проверке равенства ИД типа из двух таблиц... в моих запросах такого нет :-)
и av.treelink_id = 0 я тоже не использовал.. это похоже на работу с атрибутами проекта, а у нас таких нет..

если убрать эти "лишние" строки? ;-)

потом, я так до конца и не понял, зачем нужно

and av.attrib_id = 100004060300000
and vn.attrib_id = 100004060300000

, почему не хватит простого

and av.attrib_id = 100004060300000..

в моих запросах, опять же, нет этого дублирования ;-)

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

и кстати, если убрать обращения к чужим атрибутам - то время выполнения будет нормально?
а если их добавлять - время будет увеличиваться, да?
а зависимость между числом чужих атрибутов и временем выполнения насколько пропорциональная? время планов увеличивается при добавлении каждого нового атрибута?
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

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

спасибо за ответ теперь по SQL только к тебе :wink: гораздо эффективнее чем на SQL.ru :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Сообщение Старик Крупский »

to Anderyt: av.treelink_id = 0 - это чтобы выковыривать атрибуты объекта, а не проекта. Если атрибуты проекта не используются, то можно и не накладывать это условие.

to Александр: а в QA случайно нет настройки, которая ограничивает число выводимых строк или объем данных? В некоторых СУБД такие настройки есть.
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

Вопрос по объединению СНЯТ
Мой глюк...вся проблема была в том что я взял какой то отчет по выделенному объекту, сказал что он будет пользовательский, вставил запрос и сохранил - но не посмотрел при этом что данный отчет работал кроме всего прочего по какому то источнику данных и получилось что Лоция делала пользовательский отчет по выделенному объекту + источнику данных и в конце еще цепляла мой SQL - :shock: :shock: :shock:

нельзя работать в праздники :cry: :cry:

В общем если не торопиться все объединения в любом стиле работают.
Спасибо Андрею за подсказку по оптимизации запроса - но join все таки гораздо быстрее :wink: :wink: и я пойду этим путем

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

к сожалению основной вопрос по
The maximum number of tables in a query (260) was exceeded
не снялся
в связи с этим, Андрей не подскажешь можно ли сделать такую штуку
есть запрос

Код: Выделить всё

SELECT vv.value 
            FROM lsdbo.attrib_value_view av,
                 lsdbo.value_numeric_view vv 
           WHERE av.value_id = vv.id 
                 AND (av.object_id = 4000000017834 and av.attrib_id in (100004060500000,100000648000000,100004081100000))
который возвращает значения 3х числовых атрибутов объекта в виде одна колонка - три строки (количество строк ограничено секцией in)
т.е. например получаем
_ |__value___
1 | 12364646
2 | 673574
3 | 8989394
а можно ли как то перестроить данный запрос чтобы получить эти значения в виде таблицы (одна строка и три колонки)??
_ |__value1__|_value2_|__value3_
1 | 12364646 | 673574 | 8989394
сейчас это решается как я понял только через

Код: Выделить всё

SELECT     (SELECT vv.value
                FROM lsdbo.attrib_value_view av,
                     lsdbo.value_numeric_view vv
               WHERE av.value_id = vv.id
                     AND av.object_id = lsdbo.object_reference_view.id
                     AND av.attrib_id = 100004060500000) as value1,
             (SELECT vv.value
                FROM lsdbo.attrib_value_view av,
                     lsdbo.value_numeric_view vv
               WHERE av.value_id = vv.id
                     AND av.object_id = lsdbo.object_reference_view.id
                     AND av.attrib_id = 100000648000000) as value2,
             (SELECT vv.value
                FROM lsdbo.attrib_value_view av,
                     lsdbo.value_numeric_view vv
               WHERE av.value_id = vv.id
                     AND av.object_id = lsdbo.object_reference_view.id
                     AND av.attrib_id = 100004081100000) as value3
  FROM   lsdbo.object_reference_view,
         lsdbo.object_type_view   
  WHERE  lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id
         and lsdbo.object_reference_view.id=4000000017834 
что не совсем красиво и медленно
никак нельзя использовать первый вариант? но чтобы он сразу менял строки и колонки местами????? :shock:
чтобы одним Select вывести допустим все числовые атрибуты объекта (или допустим все стрововые)(или только определенного типа но только те что нужны)

быть может этот финт позволит превзойти ограничение по таблицам?

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

хм... пока не получилось...

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

Код: Выделить всё

SELECT vv1.value,  vv2.value, vv3.value
FROM lsdbo.attrib_value_view av 
,lsdbo.value_numeric_view vv1 
,lsdbo.value_numeric_view vv2 
,lsdbo.value_numeric_view vv3 
WHERE 
av.object_id = 100000028000064
and 
((av.value_id = vv1.id 
and
av.attrib_id = 100000101000000)
or
(av.value_id = vv2.id 
and
av.attrib_id = 100000356200000)
or
(av.value_id = vv3.id 
and
av.attrib_id = 100000197200000)
)
но этот вариант оказался нежизнеспособным. :-(
если говорить конкретно об ограничении.. то тут есть одна деталь...
откуда берется аж 260 таблиц?? не догадываетесь? а вы смотрели план выполнения этого запроса? заметили в нем таблицы, имен которых НЕТ в запросе? ;-)
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

вариант не устраивает тем что, хотелось получить как числовые значения атрибутов объекта так и строковые и даты в одном запросе, и каким то образом не выбирать каждый атрибут персонально, а делать групповой выбор по типу атрибута, например 3 подзапроса
в первом вывести все нужные числовые атрибуты во втором строковые и т.д.

просто мой вариант с объединением 3х таблиц налетает на ошибку (260 таблиц) хотя каждая из 3х таблиц сама по себе набирается нормально, да и насчет плана выполнения ничего сказать не могу-не разбираюсь, кстати эту же ошибку выдал сам QA

Единственный выход (пока) обойти данную ошибку в отчетах, это связанные отчеты по каждой из таблиц персонально :cry: каждый из которых не превышает данного ограничения по выводимым колонкам

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Ответить