Страница 1 из 1
Clarion 6.3 MSSQL Вопрос
Добавлено: 29 Ноябрь 2018, 4:49
Kvakerok
Здравствуйте.
Судьба свела меня с Кларионом, есть внутренний продукт на 6.3, MSSQL запрос выполнен в формате селекта пары тысяч записей. Наш продукт почему-то делает полный селект, а потом забирает по сети по одной штучке, делая отдельный запрос по пойнтеру на каждую запись из памяти датабазы. Трафик генерирует неописуемый, время отклика уходит в минуты, десятки минут. Вопрос в следующем: это нормально для Клариона или можно как-то сделать чтобы по-людски все записи забрать одной пачкой? Если можно сделать по-человечески, то есть ли пример такого селекта для Клариона?
Clarion 6.3 MSSQL Вопрос
Добавлено: 29 Ноябрь 2018, 15:15
RaFaeL
Давайте пример кода, так не совсем понятно, о чем речь. Может стандартный броуз с типом загрузки "файл"?
Clarion 6.3 MSSQL Вопрос
Добавлено: 29 Ноябрь 2018, 15:25
finsoftrz
Не, стандартный с типом файл засасывает всю таблицу на клиента одним запросом. Это больше похоже на какие-то проблемы в рукописном коде.
Clarion 6.3 MSSQL Вопрос
Добавлено: 29 Ноябрь 2018, 15:39
kreator
Разработчик "view{'field_label',PROP:Name} = string" не знал. Тут примером кода не обойтись. Знания Клаши чуть поглубже нужны.
Clarion 6.3 MSSQL Вопрос
Добавлено: 30 Ноябрь 2018, 0:41
Kvakerok
Переговорил с тех диром, он мне подгонит пример который они разбирали до меня. А я его сразу - вам.
Clarion 6.3 MSSQL Вопрос
Добавлено: 30 Ноябрь 2018, 9:56
kreator
Kvakerok, а разработчик пропал что-ли?
Clarion 6.3 MSSQL Вопрос
Добавлено: 30 Ноябрь 2018, 20:26
Kvakerok
Софтине уже десяток лет, много ходила по рукам, сменила от трёх до пяти разрабов. Теперешний разработчик разбирается в Кларионе от силы на шестёрочку из десяти, а в SQL не разбирается совсем.
Вотъ:
Код: Выделить всё
PROCESSBUYER PROCEDURE (BUYERID) ! Declare Procedure
LOC:NoBuyerCharges BYTE !
LOC:BaseNumeric CSTRING(21) !
LOC:CHAR STRING(1) !
loc:ChargedWeight LONG !
loc:ChargedWeightResale LONG !
loc:HeadCount LONG !
loc:HeadCountResale LONG !
FilesOpened BYTE(0)
CODE
DO OpenFiles
!<mdc 2010-03-10 Combined these 18 update statements into 1>
!Buyers{PROP:SQL} = 'UPDATE Buyers SET TOTALITEMS = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET TOTALSALESTAX = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET TOTALADDITIONALCHARGES = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET TOTALREFUNDS = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET GRANDTOTAL = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET PAYMENTSMADE = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET AMOUNTOWED = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET TOTALHEADCOUNT = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET TOTALWEIGHT = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET TOTALTICKETS = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET UNPRINTEDTICKETS = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET AVGPRICE = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET AVGWEIGHT = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET RESOLDHEAD = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET RESOLDWEIGHT = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET RESOLDEXTENSION = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET INVOICEHEADCOUNT = 0 WHERE Buyers.BuyerSysID = ' & BUYERID
!Buyers{PROP:SQL} = 'UPDATE Buyers SET PENNUM = <39><39> WHERE Buyers.BuyerSysID = ' & BUYERID
! Step1
Buyers{PROP:SQL} = 'UPDATE Buyers SET TOTALITEMS = 0, TOTALSALESTAX = 0, TOTALADDITIONALCHARGES = 0, ' & |
'TOTALREFUNDS = 0, GRANDTOTAL = 0, PAYMENTSMADE = 0, AMOUNTOWED = 0, TOTALHEADCOUNT = 0, TOTALWEIGHT = 0, ' & |
'TOTALTICKETS = 0, UNPRINTEDTICKETS = 0, AVGPRICE = 0, AVGWEIGHT = 0, RESOLDHEAD = 0, RESOLDWEIGHT = 0, ' & |
'RESOLDEXTENSION = 0, INVOICEHEADCOUNT = 0, PENNUM = <39><39> ' & |
'WHERE Buyers.BuyerSysID = ' & BUYERID
! Step1
Tickets{PROP:SQL} = 'UPDATE Tickets SET CowCalfLogic = 0, GroupLogic = 0 WHERE Tickets.BuyerSysID = ' & BUYERID !& ' AND Tickets.AuctionID = ' & glo:AuctionID
!</mdc>
!------------------------------!
! Order Number Numeric !
!------------------------------!
BUY:BuyerSysID = BUYERID
Access:Buyers.Fetch(BUY:BUY_SysID)
CLEAR(LOC:BaseNumeric)
LOOP
LEN# = LEN# + 1
IF LEN# >= (LEN(CLIP(BUY:ORDERNUMBER)) + 1)
IF LOC:BaseNumeric > 0
Buyers{PROP:SQL} = 'UPDATE Buyers SET ORDERNUMBERNUMERIC = ' & LOC:BaseNumeric & |
' WHERE BuyerSysID = ' & BUYERID
END
BREAK
END
LOC:CHAR = SUB(BUY:ORDERNUMBER,LEN#,1)
IF NUMERIC(LOC:CHAR) = 1
LOC:BaseNumeric = LOC:BaseNumeric & LOC:CHAR
END
END
!-----------------------------------------------!
! Set Pen Number - Added 1/16/2007 !
!-----------------------------------------------!
! Step1
Buyers{PROP:SQL} = 'UPDATE Buyers SET PENNUM = (SELECT TOP 1 Pen FROM Tickets WHERE Tickets.BuyerSysID = ' & BUY:BuyerSysID & ') WHERE Buyers.BuyerSysID = ' & BUYERID
!------------------------------------------------!
! Pencil Weight Processing !
!------------------------------------------------!
!<mdc 2010-03-10 Combined these 11 update statements into 1>
!Tickets{PROP:SQL} = 'UPDATE Tickets SET CowCalfLogic = (SELECT CowCalfPair FROM ItemTypes WHERE ItemTypes.ItemNumber = Tickets.AnimalType) WHERE Tickets.BuyerSysID = ' & BUYERID
!Tickets{PROP:SQL} = 'UPDATE Tickets SET GroupLogic = (SELECT GroupLogic FROM ItemTypes WHERE ItemTypes.ItemNumber = Tickets.AnimalType) WHERE Tickets.BuyerSysID = ' & BUYERID
!Tickets{PROP:SQL} = 'UPDATE Tickets SET ShrinkageFactor = (1 - (SELECT WeightShrinkage FROM ItemTypes WHERE ItemTypes.ItemNumber = Tickets.AnimalType) / 100) WHERE Tickets.BuyerSysID = ' & BUYERID
!Tickets{PROP:SQL} = 'UPDATE Tickets SET ShrinkageFactor = 1 WHERE ShrinkageFactor IS NULL AND BuyerSysID = ' & BUYERID
!Tickets{PROP:SQL} = 'UPDATE Tickets SET ShrinkageFactor = 1 WHERE ShrinkageFactor = 0 AND BuyerSysID = ' & BUYERID
!Tickets{PROP:SQL} = 'UPDATE Tickets SET ChargedWeight = (TotalWeight * ShrinkageFactor) WHERE BuyerSysID = ' & BUYERID
!Tickets{PROP:SQL} = 'UPDATE Tickets SET Extension = (Price * ChargedWeight / 100) WHERE PriceType = <39>C<39> AND BuyerSysID = ' & BUYERID
!Tickets{PROP:SQL} = 'UPDATE Tickets SET Extension = (Price * NumHead) WHERE CowCalfLogic = 0 AND PriceType = <39>H<39> AND BuyerSysID = ' & BUYERID
!Tickets{PROP:SQL} = 'UPDATE Tickets SET Extension = (Price * (NumHead / 2)) WHERE CowCalfLogic = 1 AND PriceType = <39>H<39> AND BuyerSysID = ' & BUYERID
!Tickets{PROP:SQL} = 'UPDATE Tickets SET Extension = (Price) WHERE GroupLogic = 1 AND PriceType = <39>H<39> AND BuyerSysID = ' & BUYERID
!Tickets{PROP:SQL} = 'UPDATE Tickets SET Extension = 0 WHERE BuyerSysID = 0 AND BuyerSysID = ' & BUYERID
! step1
Tickets{PROP:SQL} = 'UPDATE Tickets SET ' & |
'CowCalfLogic = (SELECT CowCalfPair FROM ItemTypes WHERE ItemTypes.ItemNumber = Tickets.AnimalType), ' & |
'GroupLogic = (SELECT GroupLogic FROM ItemTypes WHERE ItemTypes.ItemNumber = Tickets.AnimalType), ' & |
'ShrinkageFactor = (1 - (SELECT WeightShrinkage FROM ItemTypes WHERE ItemTypes.ItemNumber = Tickets.AnimalType) / 100), ' & |
'ChargedWeight = (TotalWeight * ShrinkageFactor) ' & |
'WHERE Tickets.BuyerSysID = ' & BUYERID !& ' AND Tickets.AuctionID = ' & glo:AuctionID
! Step1
Tickets{PROP:SQL} = 'UPDATE Tickets SET ShrinkageFactor = 1 ' & |
'WHERE ((ShrinkageFactor IS NULL) OR (ShrinkageFactor = 0)) AND BuyerSysID = ' & BUYERID !& ' AND Tickets.AuctionID = ' & glo:AuctionID
! Step1
Tickets{prop:SQL} = 'UPDATE Tickets SET ChargedWeight = (TotalWeight * ShrinkageFactor) WHERE Tickets.BuyerSysID = ' & BUYERID
! Step1
Tickets{PROP:SQL} = 'UPDATE Tickets SET Extension = (Price * ChargedWeight / 100) ' & |
'WHERE PriceType = <39>C<39> AND BuyerSysID = ' & BUYERID !& ' AND Tickets.AuctionID = ' & glo:AuctionID
! Step1
Tickets{PROP:SQL} = 'UPDATE Tickets SET Extension = (Price * NumHead) ' & |
'WHERE CowCalfLogic = 0 AND PriceType = <39>H<39> AND BuyerSysID = ' & BUYERID !& ' AND Tickets.AuctionID = ' & glo:AuctionID
! Step1
Tickets{PROP:SQL} = 'UPDATE Tickets SET Extension = (Price * (NumHead / 2)) ' & |
'WHERE CowCalfLogic = 1 AND PriceType = <39>H<39> AND BuyerSysID = ' & BUYERID !& ' AND Tickets.AuctionID = ' & glo:AuctionID
! Step1
Tickets{PROP:SQL} = 'UPDATE Tickets SET Extension = (Price) ' & |
'WHERE GroupLogic = 1 AND PriceType = <39>H<39> AND BuyerSysID = ' & BUYERID !& ' AND Tickets.AuctionID = ' & glo:AuctionID
! Step1
Tickets{PROP:SQL} = 'UPDATE Tickets SET Extension = 0 WHERE BuyerSysID = 0' !& ' AND Tickets.AuctionID = ' & glo:AuctionID
!AND BuyerSysID = ' & BUYERID
!</mdc>
SQL трейс полон
которые вызываются на каждую линию селекта.
Сэмпл кода - часть небольшой процедуры, которая вызывается для обработки закупщика и длится от 13 до 20 секунд. Этот код больше не используется так как его полностью вынесли в SQL stored procedure, что уменьшило скорость выполнения до приемлимой.
Clarion 6.3 MSSQL Вопрос
Добавлено: 30 Ноябрь 2018, 21:44
RaFaeL
Kvakerok писал(а): ↑30 Ноябрь 2018, 20:26SQL трейс полон
exec sp_cursorfetch 18017213,2,1,20
которые вызываются на каждую линию селекта.
Не обращайте внимания, так драйвер работает, тормоза не из-за этого
Clarion 6.3 MSSQL Вопрос
Добавлено: 01 Декабрь 2018, 14:39
kreator
Что-то я селектов не увидел в приведённом фрагменте. Только апдейт, который, действительно, можно оптимизировать, в т.ч. за счёт хранимки.
Clarion 6.3 MSSQL Вопрос
Добавлено: 02 Декабрь 2018, 13:18
gopstop2007
Kvakerok писал(а): ↑30 Ноябрь 2018, 20:26
Софтине уже десяток лет, много ходила по рукам, сменила от трёх до пяти разрабов. Теперешний разработчик разбирается в Кларионе от силы на шестёрочку из десяти, а в SQL не разбирается совсем...
а меньше update используя case when, чтобы за один проход, использовать нельзя?
Clarion 6.3 MSSQL Вопрос
Добавлено: 02 Декабрь 2018, 15:00
Дед Пахом
gopstop2007 писал(а): ↑02 Декабрь 2018, 13:18а меньше update используя case when, чтобы за один проход, использовать нельзя?
+1000, что-то много UPDATE по одной таблице, запихать всё в хранимку и вызывать один раз.