Как обойти The maximum number of tables in a query (260) ...
- Anderyt
- Активный участник
- Сообщения: 777
- Зарегистрирован: 15 июл 2004, 13:15
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Тюмень
- Контактная информация:
я так понимаю, Продукты, Клиенты и Контакты - это все разные типы объектов (в случае с Продуктами - несколько типов сразу), которые между собой как-то связаны.. а можно узнать, КАК ИМЕННО они между собой связаны? я успел догадаться (и то не факт, что правильно), что у Продукта есть ИД клиента и ИД контакта.. а больше - пока не могу врубиться..
и еще хотелось бы посмотреть на таблицу, которая должна в итоге получиться, какие атрибуты (и от каких объектов) должны быть в этой таблице...
можно?
и еще хотелось бы посмотреть на таблицу, которая должна в итоге получиться, какие атрибуты (и от каких объектов) должны быть в этой таблице...
можно?
лучше день потерять, потом за пять минут долететь!
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Да это объекты разных типов НИКАК НЕ СВЯЗАННЫЕ между собой средствами SQL , для связи используется прямая адресация через 'адресные' атрибуты (атрибуты содержащие id объектов)
в двух словах схема такая (обрезанная только суть)
В результате нужно получить одну таблицу из атрибутов 3х объектов разного типа, в виде (например)
т.е. по точкам входа выхода объектов собрать всю информацию из несвязанных объектов разного типа и вывести результаты в виде одной таблицы
в двух словах схема такая (обрезанная только суть)
Код: Выделить всё
Объект (несколько разных типов, например Soft Hard и т.д)
Продукт
набор атрибутов полностью описывающих продукт
+
атрибут 'id Клиента'
+
атрибут 'id Контакта'
Объект
Клиент
набор атрибутов полностью описывающих Клиента
Объект
Контакт
набор атрибутов полностью описывающих Контактное лицо
Код: Выделить всё
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)
Уровень администрирования - Альтернативный
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
а фильтра вообще нет (если ты имеешь в виду фильтр Лоции) работаю по всем объектам отбираемым в запросе
1.Нахожу все продукты с признаком >0
2.Нахожу всех клиентов системный id которых = атрибут id Клиента в найденных продуктах
3.Нахожу все контакты системный id которых = атрибут id Контакта в найденных продуктах
Объединяю все 3 таблицы в одну, и тут получаю полный Облом в Лоции (многократное дублирование, причем на разных запросах разное - подробно не разбирался)
в QA запрос выполняется .5 сек а из Лоции 4 минуты (примерно)
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
- Откуда: Тюмень
- Контактная информация:
скорее всего, Лоция не так обрабатывает этот запрос...
может быть, попробовать сделать всю выборку в одном запросе, без промежуточных таблиц?
думаю, это возможно...
самое интересное - вытащить определенный атрибут объекта, на который есть ссылка в попавшемся нам объекте..
у меня совсем другая структура данных, но вот такой запрос работает адекватно:
конечно, фильтрацию в главном WHERE можно сделать и другую
но смысл такой, что таким же способом можно вытащить и другие атрибуты связанного объекта... или объектов..
а кстати, зачем у Продукта две ссылки - на Клиента и на Контакт? ведь Клиент однозначно определяется Контактом... и можно от Контакта перейти к Клиенту..
ну это уже так...
мысли вслух..
))
может быть, попробовать сделать всю выборку в одном запросе, без промежуточных таблиц?
думаю, это возможно...
самое интересное - вытащить определенный атрибут объекта, на который есть ссылка в попавшемся нам объекте..
у меня совсем другая структура данных, но вот такой запрос работает адекватно:
Код: Выделить всё
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
-- это ИД атрибута, который содержит ссылку на связанный объект, например, на Клиента
)
но смысл такой, что таким же способом можно вытащить и другие атрибуты связанного объекта... или объектов..
а кстати, зачем у Продукта две ссылки - на Клиента и на Контакт? ведь Клиент однозначно определяется Контактом... и можно от Контакта перейти к Клиенту..
ну это уже так...


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

Спасибо за пример!!! и главное то что нужно и один запрос и в 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) я бы никогда в жизни не додумался как это все сунуть в один запрос


Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Anderyt
- Активный участник
- Сообщения: 777
- Зарегистрирован: 15 июл 2004, 13:15
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Тюмень
- Контактная информация:
ого, какой огромный фильтр...
аж три условия по атрибутам, насколько я понимаю...
а зачем нужно вот это:
AND av.treelink_id = 0
????
и еще, зачем нужно вот это:
lsdbo.object_type_view
и
lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id
????
аж три условия по атрибутам, насколько я понимаю...
а зачем нужно вот это:
AND av.treelink_id = 0
????
и еще, зачем нужно вот это:
lsdbo.object_type_view
и
lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id
????
лучше день потерять, потом за пять минут долететь!
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
зачем это
но по ощущениям это все на скорость не влияет и основной Select с родными атрибутами и большой главный Where работают приемлемо быстро
а вот извлечение атрибутов чужих объектов-это конец...
по скорости сравнимо как если бы я эти три запроса обрабатывал тремя связанными отчетами с передачей сквозных аргументов (что собственно сейчас я и делаю, в ожидании ответа Лоции)
не знаю, я в SQL чайник, и все это из Profilersdbo.object_type_view
lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id
AND av.treelink_id = 0
но по ощущениям это все на скорость не влияет и основной Select с родными атрибутами и большой главный Where работают приемлемо быстро
а вот извлечение атрибутов чужих объектов-это конец...
по скорости сравнимо как если бы я эти три запроса обрабатывал тремя связанными отчетами с передачей сквозных аргументов (что собственно сейчас я и делаю, в ожидании ответа Лоции)
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Anderyt
- Активный участник
- Сообщения: 777
- Зарегистрирован: 15 июл 2004, 13:15
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Тюмень
- Контактная информация:
лично я не вижу смысла в проверке равенства ИД типа из двух таблиц... в моих запросах такого нет 
и av.treelink_id = 0 я тоже не использовал.. это похоже на работу с атрибутами проекта, а у нас таких нет..
если убрать эти "лишние" строки?
потом, я так до конца и не понял, зачем нужно
and av.attrib_id = 100004060300000
and vn.attrib_id = 100004060300000
, почему не хватит простого
and av.attrib_id = 100004060300000..
в моих запросах, опять же, нет этого дублирования
а скорость работы... сейчас для того, чтобы узнать ИД связанного объекта, нам нужно обратиться к двум таблицам, которые, между прочим, одни из самых длинных.. это все из-за того, что связь с объектом прописана в атрибуте..
а если бы это был реально связанный объект - была бы одна таблица...
и кстати, если убрать обращения к чужим атрибутам - то время выполнения будет нормально?
а если их добавлять - время будет увеличиваться, да?
а зависимость между числом чужих атрибутов и временем выполнения насколько пропорциональная? время планов увеличивается при добавлении каждого нового атрибута?

и av.treelink_id = 0 я тоже не использовал.. это похоже на работу с атрибутами проекта, а у нас таких нет..
если убрать эти "лишние" строки?

потом, я так до конца и не понял, зачем нужно
and av.attrib_id = 100004060300000
and vn.attrib_id = 100004060300000
, почему не хватит простого
and av.attrib_id = 100004060300000..
в моих запросах, опять же, нет этого дублирования

а скорость работы... сейчас для того, чтобы узнать ИД связанного объекта, нам нужно обратиться к двум таблицам, которые, между прочим, одни из самых длинных.. это все из-за того, что связь с объектом прописана в атрибуте..
а если бы это был реально связанный объект - была бы одна таблица...
и кстати, если убрать обращения к чужим атрибутам - то время выполнения будет нормально?
а если их добавлять - время будет увеличиваться, да?
а зависимость между числом чужих атрибутов и временем выполнения насколько пропорциональная? время планов увеличивается при добавлении каждого нового атрибута?
лучше день потерять, потом за пять минут долететь!
- Старик Крупский
- Активный участник
- Сообщения: 803
- Зарегистрирован: 27 июл 2006, 22:17
- Откуда: Москва
to Anderyt: av.treelink_id = 0 - это чтобы выковыривать атрибуты объекта, а не проекта. Если атрибуты проекта не используются, то можно и не накладывать это условие.
to Александр: а в QA случайно нет настройки, которая ограничивает число выводимых строк или объем данных? В некоторых СУБД такие настройки есть.
to Александр: а в QA случайно нет настройки, которая ограничивает число выводимых строк или объем данных? В некоторых СУБД такие настройки есть.
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Вопрос по объединению СНЯТ
Мой глюк...вся проблема была в том что я взял какой то отчет по выделенному объекту, сказал что он будет пользовательский, вставил запрос и сохранил - но не посмотрел при этом что данный отчет работал кроме всего прочего по какому то источнику данных и получилось что Лоция делала пользовательский отчет по выделенному объекту + источнику данных и в конце еще цепляла мой SQL -
нельзя работать в праздники
В общем если не торопиться все объединения в любом стиле работают.
Спасибо Андрею за подсказку по оптимизации запроса - но join все таки гораздо быстрее
и я пойду этим путем
Мой глюк...вся проблема была в том что я взял какой то отчет по выделенному объекту, сказал что он будет пользовательский, вставил запрос и сохранил - но не посмотрел при этом что данный отчет работал кроме всего прочего по какому то источнику данных и получилось что Лоция делала пользовательский отчет по выделенному объекту + источнику данных и в конце еще цепляла мой SQL -



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


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


Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
к сожалению основной вопрос по
в связи с этим, Андрей не подскажешь можно ли сделать такую штуку
есть запрос
который возвращает значения 3х числовых атрибутов объекта в виде одна колонка - три строки (количество строк ограничено секцией in)
т.е. например получаем
что не совсем красиво и медленно
никак нельзя использовать первый вариант? но чтобы он сразу менял строки и колонки местами?????
чтобы одним Select вывести допустим все числовые атрибуты объекта (или допустим все стрововые)(или только определенного типа но только те что нужны)
быть может этот финт позволит превзойти ограничение по таблицам?
не снялся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))
т.е. например получаем
а можно ли как то перестроить данный запрос чтобы получить эти значения в виде таблицы (одна строка и три колонки)??_ |__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
никак нельзя использовать первый вариант? но чтобы он сразу менял строки и колонки местами?????

чтобы одним Select вывести допустим все числовые атрибуты объекта (или допустим все стрововые)(или только определенного типа но только те что нужны)
быть может этот финт позволит превзойти ограничение по таблицам?
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Anderyt
- Активный участник
- Сообщения: 777
- Зарегистрирован: 15 июл 2004, 13:15
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Тюмень
- Контактная информация:
хм... пока не получилось...
а первый запрос - он же работает быстро? чем он не устраивает?
если только тем, что данные в столбце - то в некоторых случаях это может оказаться неважным. например, f_execSQLSelect_2 данные возвращает в виде строки, с которой можно делать что-то еще..
а если не в этом дело...
я попробовал сделать вот так:
но этот вариант оказался нежизнеспособным. 
если говорить конкретно об ограничении.. то тут есть одна деталь...
откуда берется аж 260 таблиц?? не догадываетесь? а вы смотрели план выполнения этого запроса? заметили в нем таблицы, имен которых НЕТ в запросе?
а первый запрос - он же работает быстро? чем он не устраивает?
если только тем, что данные в столбце - то в некоторых случаях это может оказаться неважным. например, 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 таблиц?? не догадываетесь? а вы смотрели план выполнения этого запроса? заметили в нем таблицы, имен которых НЕТ в запросе?

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

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