Clarion 6.3 MSSQL Вопрос

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Kvakerok
Прохожий
Сообщения: 3
Зарегистрирован: 29 Ноябрь 2018, 4:39

Clarion 6.3 MSSQL Вопрос

Сообщение Kvakerok » 29 Ноябрь 2018, 4:49

Здравствуйте.

Судьба свела меня с Кларионом, есть внутренний продукт на 6.3, MSSQL запрос выполнен в формате селекта пары тысяч записей. Наш продукт почему-то делает полный селект, а потом забирает по сети по одной штучке, делая отдельный запрос по пойнтеру на каждую запись из памяти датабазы. Трафик генерирует неописуемый, время отклика уходит в минуты, десятки минут. Вопрос в следующем: это нормально для Клариона или можно как-то сделать чтобы по-людски все записи забрать одной пачкой? Если можно сделать по-человечески, то есть ли пример такого селекта для Клариона?

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 760
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

Clarion 6.3 MSSQL Вопрос

Сообщение RaFaeL » 29 Ноябрь 2018, 15:15

Давайте пример кода, так не совсем понятно, о чем речь. Может стандартный броуз с типом загрузки "файл"?

Аватара пользователя
finsoftrz
Ветеран
Сообщения: 905
Зарегистрирован: 06 Ноябрь 2014, 12:48

Clarion 6.3 MSSQL Вопрос

Сообщение finsoftrz » 29 Ноябрь 2018, 15:25

Не, стандартный с типом файл засасывает всю таблицу на клиента одним запросом. Это больше похоже на какие-то проблемы в рукописном коде.
Рязань решает.

kreator
Ветеран
Сообщения: 3014
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Clarion 6.3 MSSQL Вопрос

Сообщение kreator » 29 Ноябрь 2018, 15:39

Разработчик "view{'field_label',PROP:Name} = string" не знал. Тут примером кода не обойтись. Знания Клаши чуть поглубже нужны.
We are hard at work… for you. :)

Kvakerok
Прохожий
Сообщения: 3
Зарегистрирован: 29 Ноябрь 2018, 4:39

Clarion 6.3 MSSQL Вопрос

Сообщение Kvakerok » 30 Ноябрь 2018, 0:41

Переговорил с тех диром, он мне подгонит пример который они разбирали до меня. А я его сразу - вам.

kreator
Ветеран
Сообщения: 3014
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Clarion 6.3 MSSQL Вопрос

Сообщение kreator » 30 Ноябрь 2018, 9:56

Kvakerok, а разработчик пропал что-ли?
We are hard at work… for you. :)

Kvakerok
Прохожий
Сообщения: 3
Зарегистрирован: 29 Ноябрь 2018, 4:39

Clarion 6.3 MSSQL Вопрос

Сообщение Kvakerok » 30 Ноябрь 2018, 20:26

Софтине уже десяток лет, много ходила по рукам, сменила от трёх до пяти разрабов. Теперешний разработчик разбирается в Кларионе от силы на шестёрочку из десяти, а в 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 трейс полон

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

exec sp_cursorfetch 18017213,2,1,20
которые вызываются на каждую линию селекта.

Сэмпл кода - часть небольшой процедуры, которая вызывается для обработки закупщика и длится от 13 до 20 секунд. Этот код больше не используется так как его полностью вынесли в SQL stored procedure, что уменьшило скорость выполнения до приемлимой.

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 760
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

Clarion 6.3 MSSQL Вопрос

Сообщение RaFaeL » 30 Ноябрь 2018, 21:44

Kvakerok писал(а):
30 Ноябрь 2018, 20:26
SQL трейс полон

exec sp_cursorfetch 18017213,2,1,20
которые вызываются на каждую линию селекта.
Не обращайте внимания, так драйвер работает, тормоза не из-за этого

kreator
Ветеран
Сообщения: 3014
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Clarion 6.3 MSSQL Вопрос

Сообщение kreator » 01 Декабрь 2018, 14:39

Что-то я селектов не увидел в приведённом фрагменте. Только апдейт, который, действительно, можно оптимизировать, в т.ч. за счёт хранимки.
We are hard at work… for you. :)

gopstop2007
Ветеран
Сообщения: 1155
Зарегистрирован: 25 Март 2009, 21:55

Clarion 6.3 MSSQL Вопрос

Сообщение gopstop2007 » 02 Декабрь 2018, 13:18

Kvakerok писал(а):
30 Ноябрь 2018, 20:26
Софтине уже десяток лет, много ходила по рукам, сменила от трёх до пяти разрабов. Теперешний разработчик разбирается в Кларионе от силы на шестёрочку из десяти, а в SQL не разбирается совсем...
а меньше update используя case when, чтобы за один проход, использовать нельзя?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2120
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Clarion 6.3 MSSQL Вопрос

Сообщение Дед Пахом » 02 Декабрь 2018, 15:00

gopstop2007 писал(а):
02 Декабрь 2018, 13:18
а меньше update используя case when, чтобы за один проход, использовать нельзя?
+1000, что-то много UPDATE по одной таблице, запихать всё в хранимку и вызывать один раз.
С уважением, ДП

Ответить