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

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

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

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

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

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

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

Андрей и все таки :wink: мы пошли по твоему пути...

ведь всего два варианта
1- медленно вытащить упорядоченные данные и напрямую работать с ними
2- быстро вытащить беспорядочные данные и не торопясь упорядочивать их в процессе

конечно 2й вариант гораздо круче - вобщем мы за полный и главное шустрый беспорядок :wink: :wink:

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

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

на форме работы WorkFlow...

нужны практически все строковые атрибуты от 5 объектов
сделал 5 двумерных массивов id+value
и вычисляемыми полями в смысле переменными через поиск в массиве по id атрибута - рисую то что нужно

и соответственно параметры для отчета набирать буду также
:roll: :roll: :roll:

кстати а может использовать не 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: Как максимально ускорить выборку из базы ????

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

вот оно- запрос по всем назначенным объекту атрибутам

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

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
может не оч эффективен и надежен но выдает 5 столбцов со всеми атрибутами объекта - если засунуть это дело в recordset в скипте и разобрать под workflow - получится очень быстро ну просто очень :wink:
ps
спасибо Андрею за наводку :wink:

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

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

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

Да! :wink: чьерт побери - так тоже клево :wink: :wink: :wink: :wink:
если раньше гонялся за выигрышем в секунды - теперь перешел на милии :wink: :wink: :wink:
пора остановиться уже - у нас и так кондишн сломался - так башка нагрелась от SQ'эля

вот ещебы работы с многомерными массивами Workfklow вынести куда в сторону - а то каждное изменение ячейки с сохранением всего массива для формы занимает по 1,5 сек... - но думаю тоже решим как нибудь

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

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

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

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

чтоб закрыть тему немножко кода
твой запрос (чуть сократил :wink: )

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

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
вроде получение и разбор атрибутов не должны тормозить, даже если что и есть в любом случае доступны все атрибуты объекта - а это круто! :wink: и быстрее чем таскать атрибуты по одному или группой

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

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

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

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

в итоге использования внутренних функций и этого запроса с последующими разборками в скрипте - на получение атрибутов в одну колонку, по сравнению с точечными запросами по атрибутам - произошел выигрыш всех моих операция на пару десятых секунды- Круто (эт специально для С.К.)
теперь переходим на микросекунды :wink: :wink: :wink:
тут уже интересный момент где больше потери времени
на преобразовании всех типов одной колонки в varchar или sql_variant
или
на разбор вместо одной - трех колонок - но уже без преобразований
??????????????????
:?: :?: :?: :?: :?: :?:
но это в следующей жизни - главный вывод - я собрал в два раза больше атрибутов и в скорости не проиграл - вообще.
это то что надо
Юрий - спасибо!

ps
разбор происходил по двум сортированным массивам за один проход - один recordset другой вручную набранный из id атрибутов

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

Ответить