Как максимально ускорить выборку из базы ????

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

Как максимально ускорить выборку из базы ????

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

Задача простая в в массив WorkFlow максимально бысто загрузить все атрибуты одного объекта

запрос например такой

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

SELECT Coalesce(vv.value,''), 
       Coalesce(vv0.value,''),
       rw.description , 
       Coalesce(vv1.value,''), 
       Coalesce(vv2.value,''), 
       Coalesce(vv3.value,''), 
       Coalesce(vv4.value,''), 
       Coalesce(vv5.value,''), 
       Coalesce(vv6.value,''), 
       Coalesce(vv7.value,''), 
       Coalesce(vv8.value,''), 
       Coalesce(vv9.value,'') 
  FROM lsdbo.object_reference_view rw left
       join lsdbo.object_type_view tw on rw.type_id = tw.id left
       join lsdbo.attrib_value_view av on rw.id = av.object_id and av.attrib_id = 100000016000000 left
       join lsdbo.value_string_view vv on av.value_id = vv.id and av.attrib_id = 100000016000000 left
       join lsdbo.attrib_value_view av0 on rw.id = av0.object_id and av0.attrib_id = 3000000000002 left
       join lsdbo.value_string_view vv0 on av0.value_id = vv0.id and av0.attrib_id = 3000000000002 left
       join lsdbo.attrib_value_view av1 on rw.id = av1.object_id and av1.attrib_id = 3000000000022 left 
       join lsdbo.value_string_view vv1 on av1.value_id = vv1.id and av1.attrib_id = 3000000000022 left 
       join lsdbo.attrib_value_view av2 on rw.id = av2.object_id and av2.attrib_id = 3000000000021 left
       join lsdbo.value_string_view vv2 on av2.value_id = vv2.id and av2.attrib_id = 3000000000021 left 
       join lsdbo.attrib_value_view av3 on rw.id = av3.object_id and av3.attrib_id = 3000000000024 left 
       join lsdbo.value_string_view vv3 on av3.value_id = vv3.id and av3.attrib_id = 3000000000024 left 
       join lsdbo.attrib_value_view av4 on rw.id = av4.object_id and av4.attrib_id = 3000000000023 left 
       join lsdbo.value_string_view vv4 on av4.value_id = vv4.id and av4.attrib_id = 3000000000023 left 
       join lsdbo.attrib_value_view av5 on rw.id = av5.object_id and av5.attrib_id = 3000000000025 left 
       join lsdbo.value_string_view vv5 on av5.value_id = vv5.id and av5.attrib_id = 3000000000025 left 
       join lsdbo.attrib_value_view av6 on rw.id = av6.object_id and av6.attrib_id = 3000000000041 left
       join lsdbo.value_string_view vv6 on av6.value_id = vv6.id and av6.attrib_id = 3000000000041 left 
       join lsdbo.attrib_value_view av7 on rw.id = av7.object_id and av7.attrib_id = 3000000000042 left 
       join lsdbo.value_string_view vv7 on av7.value_id = vv7.id and av7.attrib_id = 3000000000042 left
       join lsdbo.attrib_value_view av8 on rw.id = av8.object_id and av8.attrib_id = 3000000000043 left
       join lsdbo.value_string_view vv8 on av8.value_id = vv8.id and av8.attrib_id = 3000000000043 left 
       join lsdbo.attrib_value_view av9 on rw.id = av9.object_id and av9.attrib_id = 3000000000062 left
       join lsdbo.value_string_view vv9 on av9.value_id = vv9.id and av9.attrib_id = 3000000000062 

where  rw.type_id = tw.id and
       rw.id =4000000024410 -- единственный параметр id объекта
т.е. есть запрос есть один параметр

как средствами SQL можно разогнать данный запрос?

с одной стороны сделать свой View без проверки прав - но в вид нельзя передать параметр?

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

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

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

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

Сообщение Anderyt »

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

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

select  attr.description, vs.value
from 
lsdbo.value_string_view vs
, lsdbo.attrib_view attr
where 
vs.id in
(
select value_id
from lsdbo.attrib_value_view
where
object_id = 111111163000000
)
and
vs.attrib_id = attr.id
это конечно одному типу атрибутов, по строковым.. но зато выполняется махом, даже по стандартным видам с правами..
если сделать еще запросы к числам и датам - будут все атрибуты..
а вот как это сделать в одном запросе - честно говоря, не соображу..
но в трех отдельных - запросто :-)

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

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

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

на счет работы по общим таблицам с последующей фильтрацией вида - нужно подумать :roll: может это и выход

:wink:
Последний раз редактировалось Александр 19 мар 2008, 14:20, всего редактировалось 1 раз.

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

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

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

Андрей - твой запрос то что надо

но еще два момента
1. как развернуть результаты запроса из столбца 1хN в строку Nx1 (скорее всего средствами Лоции - в SQL хп городить неохота или может можно твой запрос как нибудь наполнить подзапросами - для образования колонок)?
2. как выводить колонки в нужном мне порядке ?

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

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

Сообщение Anderyt »

быстро работает, да? ;-)

моменты...
ну, с этим сложнее..
если городить подзапросы - то получится ВАШ запрос.. и скорость тоже изменится :-(
а вот средствами Лоции - может быть и можно попробовать.. вот только надо ли... ведь если показываем информацию об ОДНОМ объекте, то получается более компактный вид, если делать два столбика - с названием и значением.. не зря в Лоции именно такой вид ;-)
порядок - тоже вопрос. в лоции выводится в алфавитном порядке, причем там ещу участвуют названия групп атрибутов. в принципе, здесь тоже можно сделать так, вот код по алфавиту, но без названий групп атрибутов (если нужно):

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

select  attr.description as 'desc', vs.value
from 
lsdbo.value_string_view vs
, lsdbo.attrib_view attr
where 
vs.id in
(
select value_id
from lsdbo.attrib_value_view
where
object_id = 100000813200015
)
and
vs.attrib_id = attr.id
order by 'desc'
в принципе, может быть можно сделать и свой порядок, если каждому названию атрибута сопоставить какой нить код (или в запросе, или уже в лоции через вычисляемое поле) и сортировать по этому коду (или вычисляемому полю)...
ну это все я говорю для того случая, когда вид останется, как есть, то есть два столбика со названиями и значениями..
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

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

вот если бы в Лоции можно было наполнять массив не горизонтально а вертикально - т.е. сопоставлять значения запроса не колонкам а строкам - вопрос бы был исчерпан :wink: :wink: :wink:

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

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

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

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

Андрей - если не сложно подскажи - можно ли всетаки в твой запрос вставить подзапросы

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

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

Select
   (Select значения атрибута по его id...
   (Select значения атрибута по его id...
   (Select значения атрибута по его id...
   (Select значения атрибута по его id...
From ...
Where отобрать id всех строковых атрибутов объекта
просто понять не могу возможно ли это в принципе?

Софт - 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

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

ни в коем случае никаких действий
твой запрос настолько поразил меня скоростью - что я хочу только средствами SQL :wink: :wink: :wink:

а в столбик нельзя - поскольку я формирую массив строк состоящий из разных объектов и их атрибутов - именно массив строк... хотя подожди... в принципе можно использовать не один массив для всех объектов а несколько массивов по количеству объектов и вытаскивать атрибуты по индексу или по описанию ... во как

так думаем дальше :wink:
круто, круто :wink: :wink: :wink:

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

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

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

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

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

проблема простая - работаем в WorkFlow
нужно разместить на форме информацию о 5 объектах причем данная информация в дальнейшем пойдет на формирование отчета

что было сначала - в Party я знал id всех 5 объектов и в действии отбирал их атрибуты и в качестве аргументов (порядка 50 штук) передавал их в отчет (это вылавливание атрибутов занимало достаточно много времени)

теперь в Workflow я хочу сразу вытащить все атрибуты на форму
чтобы потом уже из переменных формы формировать аргументы отчета
проблема в том что атрибутов у каждого объекта 10 штук - т.е. делать 50 переменных не имеет смысла
я формирую массив 5х10
и в аргументы отчета отправляю значения нужных колонок из полученного массива

и вернувшись к теме - опять же, вылавливание атрибутов уже средствами WorkFlow - все равно занимает достаточно времени - меньше чем в действии но тоже не мало

вот и бьюсь :wink: :wink:
как максимально компактно и максимально много данных вытащить на форму причем затратив минимальное количество времени

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

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

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

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

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

никогда не задумывался над этим вопросом - по ощущениям вроде одинаково :wink:

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

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

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

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

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

Андрей а можешь нарисовать тот же запрос к строковым атрибутам объекта но с условием чтобы он показывал все атрибуты объекта вне зависимости от того есть этот атрибут физически у объекта или нет

просто в таком виде для объектов одного типа он показывает для одного объекта (у меня) одно количество а для другого другое (просто не все используются)

можно в этом запросе использовать таблицу привязки атрибутов к типу объекта?

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

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

Ответить