Радикальное увеличение скорости

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

Радикальное увеличение скорости

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

Берем скрипт подключаемся в нем к базе под админом и работаем в действии или в задаче, а под юзером запускаем это самое действие или задачу которая работает уже без View.. на полной скорости, с одной стороны... :wink: защита интеллектуальной собственности админа с другой стороны - код скрипта можно хранить отдельно... все что угодно, мы например на 40 сложных запросах вынесенных в один скрипт сэкономили огромное количество времени уменьшив его в 4 раза от базового...

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

Option explicit                              
Dim cn  

Function ADODB_Connected
    On Error Resume Next
    set cn = CreateObject("ADODB.Connection")
      if Err.Number=0 Then
         cn.Open "Provider=SQLOLEDB;Data Source=имя базы;Initial Catalog=имя сервера;User ID=sa;Password=пароль админа;"
         ADODB_Connected=True
         Exit Function
       Else 
         ADODB_Connected=False
       End if
End Function

Function GetSingleData(Sql)
 Dim Ret
      Set Ret = cn.Execute(Sql)
      If IsNull(Ret(0)) then 
          GetSingleData=""
      Else
          GetSingleData=Ret(0).Value
      End If     
End Function

Sub sGetDataOrderFromLotsia()
... 
   If ADODB_Connected Then
      id_ClPlat=GetSingleData("SELECT vv1.value FROM lsdbo.object_reference rw left jo...
'      id_ClPlat=GetSingleData("SELECT vv1.value FROM lsdbo.object_reference_view rw left jo...
от имени админа для юзера...
ps
пример для MSSQL

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

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

Re: Радикальное увеличение скорости

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

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

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

cn.Open "Provider=SQLOLEDB;Data Source=имя сервера;Initial Catalog=имя базы;User ID=sa;Password=пароль админа;"
ну и в конце конечно после всех запросов - убиваем Connection

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

set cn= Nothing
ps
полностью отказались от отчета в нашей единственной работе типа 38 параметров отчета в действие потом их же в отчет и т.д. - теперь все полностью скриптом и табличные данные и просто переменные работы
круто в общем!

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

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

Re: Радикальное увеличение скорости

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

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

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

      On Error Resume Next
Set rs = CreateObject("ADODB.RecordSet")
 if Err.Number=0 Then
  sql="Select tw.Mnemo,
   vv0.value as sCode,
   vv1.value as sType,
   vv2.value as sName,
   vv3.value as sCount,
   Coalesce(vv4.value,0) as sPriceBase,
   Coalesce(vv5.value,0) as sPriceBaseNDS,
   vv6.value as sListCurrency,
   Coalesce(vv7.value,0) as sPriceDiscount00,
   Coalesce(vv8.value,0) as sPriceDiscount01,
   rw.created as sCreate 
FROM lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id = tw.id left join 
        lsdbo.tree_link tl on rw.id = tl.link_id left join lsdbo.attrib_value av0 on rw.id = av0.object_id and av0.attrib_id = 10.. left join 
        lsdbo.value_string vv0 on av0.value_id = vv0.id and av0.attrib_id = 10.. left join lsdbo.attrib_value av1 on rw.id = av1.object_id and av1.attrib_id = 10.. left join 
        lsdbo.value_numeric vv1 on av1.value_id = vv1.id and av1.attrib_id = 10.. left join lsdbo.attrib_value av2 on rw.id = av2.object_id and av2.attrib_id = 30.. left join 
        lsdbo.value_string vv2 on av2.value_id = vv2.id and av2.attrib_id = 30.. left join lsdbo.attrib_value av3 on rw.id = av3.object_id and av3.attrib_id = 10.. left join 
        lsdbo.value_numeric vv3 on av3.value_id = vv3.id and av3.attrib_id = 10.. left join lsdbo.attrib_value av4 on rw.id = av4.object_id and av4.attrib_id = 10.. left join 
        lsdbo.value_numeric vv4 on av4.value_id = vv4.id and av4.attrib_id = 10.. left join lsdbo.attrib_value av5 on rw.id = av5.object_id and av5.attrib_id = 30.. left join 
        lsdbo.value_numeric vv5 on av5.value_id = vv5.id and av5.attrib_id = 30.. left join lsdbo.attrib_value av6 on rw.id = av6.object_id and av6.attrib_id = 10.. left join 
        lsdbo.value_string vv6 on av6.value_id = vv6.id and av6.attrib_id = 10.. left join lsdbo.attrib_value av7 on rw.id = av7.object_id and av7.attrib_id = 10.. left join 
        lsdbo.value_numeric vv7 on av7.value_id = vv7.id and av7.attrib_id = 10.. left join lsdbo.attrib_value av8 on rw.id = av8.object_id and av8.attrib_id = 10.. left join 
        lsdbo.value_numeric vv8 on av8.value_id = vv8.id and av8.attrib_id = 10.. where tl.parent_id=" & id_Order & " and tw.mnemo <> 'Doc' order by sCreate"
         rs.Open sql,cn
       Else 
           msgbox "Чтение спецификации не удалось. Сори" 
       End if
этот запрос возвращает в recordset массив 11 колонок X сколько получилось строк
дальше мы его переписываем в свой массив, типа

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

   do while not rs.Eof 
       Select Case rs.Fields.item(0)
             Case "PSft"
                 Select Case Mid(rs.Fields.item(1),10,2 ) 
                       Case "05"    
                          tmp=""
                       Case "08"    'Technical support
                          tmp=""
                       Case "06"    'Manuals Dock-Pack
                          tmp=""
                       Case Else
                           Select Case rs.Fields.item(2)
                                Case "0"
                                   tmp="Программное обеспечение "
                               Case "1"  
                                   tmp="Предоставление неисключительного права использования "                        
                               Case Else
                                   tmp=""
                           End Select
                 End Select         
             Case Else
                 tmp=""           
       End Select
       Main.vPartList(j,0)=tmp & rs.Fields.item(3)
       for i=4 to rs.Fields.count-2
            Main.vPartList(j,i-3)= rs.Fields.item(i)
   '     msgbox  Main.vPartList(j,i)            
       next
       rs.MoveNext ' получить следующую запись
       j=j+1
    loop
и освобождаем recordset

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

   set rs= Nothing              'убить объект recordset
собственно все...
1. подключились к базе
2. набрали все нужные данные, переменные массивы, все что нужно...
3. отключились от базы
4. скриптом формируем все документы которые нужны
все запросы идут от имени админа, вроде эт не страшно т.к. на чтение ну и т.д. Скорость вот что главное :wink:

ps
спасибо техподдержке за быстрый старт типа 'Hello Word' :wink: и конечно функции Application.GetADOConnect() которая не отработала корректно для текущего юзера (уже исправлена) и пришлось подключаться как админу :wink: одна ошибка - а сколько открылось перспектив по быстродействию!!!!!

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

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

Re: Радикальное увеличение скорости

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

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

Re: Радикальное увеличение скорости

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

в том то и дело что собственные view в данном случае вообще ни к чему, зачем базу засорять неизвестно чем :wink: , я тоже делал но уже забыл что и для чего и щас они там болтаются просто так...
...
на счет безопасности - это да - жертвую пока
а расскажи поподробнее как создать такого виртуального пользователя на чтение без view

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

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

Re: Радикальное увеличение скорости

Сообщение Disillusioned »

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

Re: Радикальное увеличение скорости

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

нет нет все не то.. :wink:
пароль админа просто вынесу во внешние файлы и буду при старте работы собирать его по кускам - и все
...
никаких больше ни хр ни view, те которые были немного устарели в связи с расширением кругозора... а в новых вообще не вижу смысла - только запросами только в скрипте и гибкость искорость

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

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

Re: Радикальное увеличение скорости

Сообщение Disillusioned »

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

Re: Радикальное увеличение скорости

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

скрипт в моем случае используются на 10% для 38ми запросов возвращающих строки с одним значением и на 90% для получения табличных данных из базы и прямой передачи их в скрипт (в виде массива). Если делать через xp массив скрипта придется получать разбирая строку с разделителями. Не знаю что быстрее - мне показалось что напрямую (recordset=array) лучше. Да и в отладке удобней мне кажется и в эксплуатации. Во всяком случае делать xp для этого варианта не подходит никак - очень много параметров как на входе так и на выходе. в общем 50x50
...
а пароль вполне можно хранить в каком либо объекте базы в виде какой либо смешанной/закодированной строки в виде атрибута/атрибутов... я думаю безопасность не очень сильно пострадает- ведь пароль будет брать не сам скрипт а работа или действие передавая его в качестве параметра дальше...
пользователь пароля не увидит - а увидит не поймет
если базу будет ктото взламывать со стороны думаю тоже не будет особо заморачиваться поиском пароля в базе даже зная что он там есть - ведь наверняка присутствуют нормальные методы взлома - например спросить у админа :wink:
так что здесь тоже 50x50 :wink: :wink: :wink:

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

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

Re: Радикальное увеличение скорости

Сообщение Disillusioned »

Рекордсет можно получить не только при помощи
SELECT ... FROM table
но и при помощи
CALL xp(....)
или
SELECT ... FROM xp(...)
Пишем ХП, вызываем их в скрипте...
Количество параметров у ХП не ограничено...

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

Re: Радикальное увеличение скорости

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

:wink:
но чтение без view не помешало бы в стандартном функционале типа
- включил чтение с правами
- включил чтение без прав
а на счет xp пока никак - все постоянно меняется, но даже если бы и не менялось я просто не знаю как из хp вернуть массив в скрипт допустим 10 x n синтаксически не знаю....
-Если хp создает какую-то временную таблицу (массив) и мы ее читаем скриптом - не очень интересно
-Если xp возвращает длиииииинную отформатированную строку/строки (массив) - тоже не очень

расскажи в двух словах... если время есть
т.е.
я создал xp Select @00, @01 ... @09 получил массив 10 x n - как его передать в скрипт в array(n,9)?

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

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

Re: Радикальное увеличение скорости

Сообщение Disillusioned »

Результат вызова ХП и простого SELECTа будет одинаковым, потому и обрабатывать эти результаты надо одинаково.
В MS SQL и Sybase SQL Anywhere хранимые процедуры могут возвращать наборы записей подобно простым SELECTам. В Oracle, насколько мне известно, ХП набор записей возвратить не может (но утвержать этого не могу).
Приблизительная последовательность следующая: создаешь в ХП локальную временную таблицу, накидываешь в нее данные, обрабатываешь их необходимым образом, и в конце ХП делаешь SELECT в котром из временной таблицы выбираешь нужные данные
В скрипте вместо SELECTa вызываешь ХП call xp_name(arg1,arg2...). Результатом будет набор записей из финального селекта ХП.
Последний раз редактировалось Disillusioned 21 апр 2009, 10:16, всего редактировалось 1 раз.
Ах и с ними невозможно
И без них никак нельзя
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Радикальное увеличение скорости

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

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

Set ScriptArray=f_ExecSQLSelect_3('exec lsdbo.xpGetArray... ?
я понимаю что в скрипте нет такой функции - эт для примера
так или как то иначе?

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

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

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

Re: Радикальное увеличение скорости

Сообщение Disillusioned »

Процедуры вызываются при помощи CALL
Для функции(create function) используй SELECT

текстовку запроса также в скрипте формируй
Вместо:
sql="Select tw.Mnemo,
vv0.value as sCode,
vv1.value as sType,
vv2.value as sName,
vv3.value as sCount,
...
Сделай
sql="CALL xp_name(......)"
Ах и с ними невозможно
И без них никак нельзя
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Радикальное увеличение скорости

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

:wink: хорошо давай еще раз для тупых (для меня)
1. сделал хп - допустим
2. пишу такой скрипт

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

Dim lCon,lRecSet
  Set lCon = GetADOConnect()
  Set lRecSet = LCon.Execute("lsdbo.xpGetArray... ? 
так? или...
просто в такой записи я не уверен что lRecSet это рекордсет
может так?

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

Dim lCon,lRecSet,sql
  Set lCon = GetADOConnect()
  Set lRecSet = CreateObject("ADODB.RecordSet")
  sql="exec lsdbo.xpGetArray... 
  lRecSet.Open sql,lCon
? тут вроде все ок или как то еще?

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

Ответить