Как максимально ускорить выборку из базы ????
- Александр
- Активный участник
- Сообщения: 1652
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Андрей и все таки мы пошли по твоему пути...
ведь всего два варианта
1- медленно вытащить упорядоченные данные и напрямую работать с ними
2- быстро вытащить беспорядочные данные и не торопясь упорядочивать их в процессе
конечно 2й вариант гораздо круче - вобщем мы за полный и главное шустрый беспорядок
ведь всего два варианта
1- медленно вытащить упорядоченные данные и напрямую работать с ними
2- быстро вытащить беспорядочные данные и не торопясь упорядочивать их в процессе
конечно 2й вариант гораздо круче - вобщем мы за полный и главное шустрый беспорядок
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Александр
- Активный участник
- Сообщения: 1652
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
на форме работы WorkFlow...
нужны практически все строковые атрибуты от 5 объектов
сделал 5 двумерных массивов id+value
и вычисляемыми полями в смысле переменными через поиск в массиве по id атрибута - рисую то что нужно
и соответственно параметры для отчета набирать буду также
кстати а может использовать не 2х мерные массивы а 1мерные и там просто в одной строке хранить и значение и ID наверно это будет еще быстрее......
но...
а вот вопрос - а где хранятся и как называются массивы WorkFlow чтобы к ним обратиться напрямую из SQL????
нужны практически все строковые атрибуты от 5 объектов
сделал 5 двумерных массивов id+value
и вычисляемыми полями в смысле переменными через поиск в массиве по id атрибута - рисую то что нужно
и соответственно параметры для отчета набирать буду также
кстати а может использовать не 2х мерные массивы а 1мерные и там просто в одной строке хранить и значение и ID наверно это будет еще быстрее......
но...
а вот вопрос - а где хранятся и как называются массивы WorkFlow чтобы к ним обратиться напрямую из SQL????
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Александр
- Активный участник
- Сообщения: 1652
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как максимально ускорить выборку из базы ????
вот оно- запрос по всем назначенным объекту атрибутам
может не оч эффективен и надежен но выдает 5 столбцов со всеми атрибутами объекта - если засунуть это дело в recordset в скипте и разобрать под workflow - получится очень быстро ну просто очень
ps
спасибо Андрею за наводку
Код: Выделить всё
select at.id as gID,
at.description as gName,
sv.value as gString,
nv.value as gNumeric,
dtv.value as gDataType
from lsdbo.attrib as at left join lsdbo.attrib_value as av on at.id=av.attrib_id left join
lsdbo.value_numeric as nv on nv.id=av.Value_ID left join
lsdbo.value_string as sv on sv.id=av.Value_ID left join
lsdbo.value_datetime as dtv on dtv.id=av.Value_ID
where av.object_id=100000317100048
ps
спасибо Андрею за наводку
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Активный участник
- Сообщения: 239
- Зарегистрирован: 13 янв 2005, 14:30
- Используемое ПО: Lotsia PDM PLUS LT
- Откуда: Украина, Донецк
- Контактная информация:
Re: Как максимально ускорить выборку из базы ????
Код: Выделить всё
select attr.id IdTypeAttr, attr.description descTypeAttr, attr.data_type data_type,
'IdValue' =
case
when attr.data_type = 'S' then vals.id
when attr.data_type = 'T' then vald.id
when attr.data_type = 'N' then valn.id
end,
'Value' =
case
when attr.data_type = 'S' then isNull(vals.value,'')+isNull(vals.value1,'')
when attr.data_type = 'T' then convert(varchar,vald.value,4)
when attr.data_type = 'N' then cast(valn.value as varchar)
end
from (select * from LSDBO.attrib_value attr_val
where attr_val.Object_id=100020644830006) attr_val left join
LSDBO.attrib attr on attr.id = attr_val.Attrib_ID left join
LSDBO.value_string vals on vals.id = attr_val.Value_ID left join
LSDBO.value_datetime vald on vald.id = attr_val.Value_ID left join
LSDBO.value_numeric valn on valn.id = attr_val.Value_id
- Александр
- Активный участник
- Сообщения: 1652
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как максимально ускорить выборку из базы ????
Да! чьерт побери - так тоже клево
если раньше гонялся за выигрышем в секунды - теперь перешел на милии
пора остановиться уже - у нас и так кондишн сломался - так башка нагрелась от SQ'эля
вот ещебы работы с многомерными массивами Workfklow вынести куда в сторону - а то каждное изменение ячейки с сохранением всего массива для формы занимает по 1,5 сек... - но думаю тоже решим как нибудь
если раньше гонялся за выигрышем в секунды - теперь перешел на милии
пора остановиться уже - у нас и так кондишн сломался - так башка нагрелась от SQ'эля
вот ещебы работы с многомерными массивами Workfklow вынести куда в сторону - а то каждное изменение ячейки с сохранением всего массива для формы занимает по 1,5 сек... - но думаю тоже решим как нибудь
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Александр
- Активный участник
- Сообщения: 1652
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как максимально ускорить выборку из базы ????
чтоб закрыть тему немножко кода
твой запрос (чуть сократил )
и использование его в скрипте
вроде получение и разбор атрибутов не должны тормозить, даже если что и есть в любом случае доступны все атрибуты объекта - а это круто! и быстрее чем таскать атрибуты по одному или группой
твой запрос (чуть сократил )
Код: Выделить всё
select
attr.id as IdTypeAttr,
case when attr.data_type = 'S' then cast(isNull(sv.value,'')+isNull(sv.value1,'') as sql_variant)
when attr.data_type = 'T' then cast(dv.value as sql_variant)
when attr.data_type = 'N' then cast(nv.value as sql_variant) end as aValue
from (select * from LSDBO.attrib_value as av where av.Object_id=100001138400023) as av left join
LSDBO.attrib as attr on attr.id = av.Attrib_ID left join
LSDBO.value_string as sv on sv.id = av.Value_ID left join
LSDBO.value_datetime as dv on dv.id = av.Value_ID left join
LSDBO.value_numeric as nv on nv.id = av.Value_id
order by IdTypeAttr
Код: Выделить всё
Option Explicit
Option Base 0
Dim cn
Function ADODB_Connected()
On Error Resume Next
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=SQLOLEDB;Data Source=xxx;Initial Catalog=xxx;User ID=xxx;Password=xxx;" (логин быстрого юзера без view)
If Err.Number = 0 Then
ADODB_Connected = True
Exit Function
Else
MsgBox Err.Number
ADODB_Connected = False
End If
End Function
Sub sGetDataObjectFromLotsia()
Dim sql, rs, j, tmp, id, Field, i
Dim aRs() As Variant 'массив для хранения результатов recordset'а
If ADODB_Connected Then
On Error Resume Next
Set rs = CreateObject("ADODB.RecordSet")
If Err.Number = 0 Then
id = 100001138400023# 'объект
sql = "select attr.id as IdTypeAttr, case when attr.data_type='S' then cast(isNull(sv.value,'')+isNull(sv.value1,'') as sql_variant) when attr.data_type='T' then cast(dv.value as sql_variant) when attr.data_type='N' then cast(nv.value as sql_variant) end as aValue from (select * from LSDBO.attrib_value as av where av.Object_id=" + CStr(id) + ") as av left join LSDBO.attrib as attr on attr.id=av.Attrib_ID left join LSDBO.value_string as sv on sv.id=av.Value_ID left join LSDBO.value_datetime as dv on dv.id=av.Value_ID left join LSDBO.value_numeric as nv on nv.id=av.Value_id order by IdTypeAttr"
rs.Open sql, cn
aRs = rs.GetRows
rs.Close
MsgBox fGetSingleIDValue(aRs, -33) 'атрибут
' LsJob.SetVarValue "value1", cStr((fGetSingleIDValue(aRs, -33))
id = 100000356100012# 'объект
sql = "select attr.id as IdTypeAttr, case when attr.data_type='S' then cast(isNull(sv.value,'')+isNull(sv.value1,'') as sql_variant) when attr.data_type='T' then cast(dv.value as sql_variant) when attr.data_type='N' then cast(nv.value as sql_variant) end as aValue from (select * from LSDBO.attrib_value as av where av.Object_id=" + CStr(id) + ") as av left join LSDBO.attrib as attr on attr.id=av.Attrib_ID left join LSDBO.value_string as sv on sv.id=av.Value_ID left join LSDBO.value_datetime as dv on dv.id=av.Value_ID left join LSDBO.value_numeric as nv on nv.id=av.Value_id order by IdTypeAttr"
rs.Open sql, cn
aRs = rs.GetRows
MsgBox fGetSingleIDValue(aRs, 100037488300000#) 'атрибут
' LsJob.SetVarValue "value2", cDate((fGetSingleIDValue(aRs, -33))
MsgBox fGetSingleIDValue(aRs, 100037288300000#) 'атрибут
Erase aRs
Set rs = Nothing 'убить recordset
Set cn = Nothing 'убить conncet
Else
MsgBox "Чтение не удалось..."
Set cn = Nothing 'убить conncet
Exit Sub
End If
Else
MsgBox "Подключение не удалось...." & vbCr & ";-)"
End If
End Sub
Function fGetSingleIDValue(f_Arr, f_ID)
Dim i, j, k
i = 0
j = UBound(f_Arr, 2) - 1
While (i < j)
k = Round((i + j) / 2 + 0.5) - 1
If f_ID <= f_Arr(0, k) Then
j = k
Else
i = k + 1
End If
If f_Arr(0, i) = f_ID Then
fGetSingleIDValue = f_Arr(1, i)
Exit Function
End If
Wend
fGetSingleIDValue = ""
End Function
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Александр
- Активный участник
- Сообщения: 1652
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как максимально ускорить выборку из базы ????
в итоге использования внутренних функций и этого запроса с последующими разборками в скрипте - на получение атрибутов в одну колонку, по сравнению с точечными запросами по атрибутам - произошел выигрыш всех моих операция на пару десятых секунды- Круто (эт специально для С.К.)
теперь переходим на микросекунды
тут уже интересный момент где больше потери времени
на преобразовании всех типов одной колонки в varchar или sql_variant
или
на разбор вместо одной - трех колонок - но уже без преобразований
??????????????????
но это в следующей жизни - главный вывод - я собрал в два раза больше атрибутов и в скорости не проиграл - вообще.
это то что надо
Юрий - спасибо!
ps
разбор происходил по двум сортированным массивам за один проход - один recordset другой вручную набранный из id атрибутов
теперь переходим на микросекунды
тут уже интересный момент где больше потери времени
на преобразовании всех типов одной колонки в varchar или sql_variant
или
на разбор вместо одной - трех колонок - но уже без преобразований
??????????????????
но это в следующей жизни - главный вывод - я собрал в два раза больше атрибутов и в скорости не проиграл - вообще.
это то что надо
Юрий - спасибо!
ps
разбор происходил по двум сортированным массивам за один проход - один recordset другой вручную набранный из id атрибутов
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный