Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Помогите пожалуйста оптимизировать запрос : Супермаг Плюс (Супермаг 2000)

22.11.2024 22:24


28.01.2021 09:44
Супермаг 1.042 SP5 Oracle - OraClient11g_home1_32bit
Товаров конечно очень много как и продаж, раньше говорят работало прекрсно, сейчас если брать большие даты и кол-во категорий товаров, то даже за день не сделает запрос

SQL код:
<ScriptText>using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Reflection;
using FastReport;
using FastReport.Data;
using FastReport.Dialog;
using FastReport.Table;
using FastReport.Utils;
using FastReport.Format;

using Sm.FastReports;
using Sm.FastReports.Link;
using Sm.Interfaces;
using Sm.Objects;
using Sm.Core;

namespace FastReport
{
  public class ReportScript
  {
    string qMainSQL=&quot; SELECT article, cardname, ctg_code, subgrp_name, ctg_name, status_text, last_income_dt, last_income_cl, accprice, sales, remains_on_end, cashprice, extracharge, extracharge_art/100, step, minprice, sales_to, profit, CASE sales_to WHEN 0 THEN 0 ELSE profit/sales_to*100 END margin, inAuction, (SELECT rate FROM supermag.smaltunits a WHERE a.article=s.article AND a.altunit=2) volume FROM ( SELECT s.*, CASE status WHEN 1 THEN 'Активна' WHEN 2 THEN 'Неактивна' ELSE 'Не определено' END status_text, CASE accprice WHEN 0 THEN 0 ELSE cashprice/accprice-1 END extracharge, CASE status WHEN 1 THEN sales*cashprice WHEN 2 THEN remains_on_end*cashprice ELSE 0 END sales_to, (cashprice-accprice)* CASE status WHEN 1 THEN sales WHEN 2 THEN remains_on_end ELSE 0 END profit, supermag.classifier.NORMALIZECLASSIF(ctg_code) ctg, TO_CHAR(d.createdat,'dd.mm.yyyy') last_income_dt, (SELECT name FROM supermag.smclientinfo c WHERE c.id=d.clientindex) last_income_cl FROM supermag.rep$pricecut s LEFT OUTER JOIN supermag.smdocuments d ON d.doctype='WI' AND d.id=s.last_income ORDER BY ctg ASC, article ASC) s  &quot;;
    string sLocName;
    string sGroupName;
    string sUserName;
    string sDateName;
    
    RepHost host;

    private void _StartReport(object sender, EventArgs e)
    { 
      
      // Хост отчёта
      host = new RepHost(Report);
            
      // контрагент &quot;От имени&quot;
      sUserName = RepClientInfo.GetClientName(host.Connection, Report.GetParameterValue(&quot;P_USER_ID&quot;));
      
      //Проверка необходимости отображения последней колонки с объемом
      if(ToInt32(Report.GetParameterValue(&quot;P_FLAG1&quot;))==0){
        Page1.PaperWidth=615;  
        Cell76.Visible=false;
        Cell77.Visible=false;
        Cell78.Visible=false;
        Cell79.Visible=false;
      }
      
      // подзаголовок отчета: период отчета
      string sFirstDate = ToString(Report.GetParameterValue(&quot;P_FIRSTDATE&quot;));
      string sLastDate = ToString(Report.GetParameterValue(&quot;P_LASTDATE&quot;));
      int iCountDay = (RepConvert.ToSmDate(sLastDate)-RepConvert.ToSmDate(sFirstDate)).Days+1;
      sDateName = &quot;с &quot;+sFirstDate+&quot; по &quot;+sLastDate+&quot; ( &quot;+Safe.ToSqlNumber( iCountDay )+&quot; дн. )&quot;;

      // фильтр по местам хранения            
      RepOracleRunner.ExecuteProcedure(host.Connection,&quot;Supermag.RepTools.LoadLoc&quot;, 
        Report.GetParameterValue(&quot;P_STORED_ALL&quot;),
        Report.GetParameterValue(&quot;P_STORED_NAME&quot;),
        null,
        null); 
     
      // подзаголовок отчета: места хранения
      sLocName = RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;select supermag.RepTools.LocString(10) from dual&quot;);
      
      // фильтр по группам товаров
      RepOracleRunner.ExecuteProcedure(host.Connection,&quot;Supermag.RepTools.LoadClass&quot;, 
        Report.GetParameterValue(&quot;P_GROUP_ALL&quot;),
        Report.GetParameterValue(&quot;P_BGROUP&quot;),
        Report.GetParameterValue(&quot;P_GROUP_TREE&quot;));
      // подзаголовок отчета: группы товаров
      sGroupName = RepOracleRunner.ExecuteScalar&lt;string&gt;(host.Connection, &quot;select supermag.RepTools.ClassString(10) from dual&quot;);
      
      RepOracleRunner.ExecuteProcedure(host.Connection,&quot;supermag.rep_formtemptabletoo.fill_pricecut&quot;, 
        sFirstDate,
        sLastDate);
      
      host.TableDataSourcePreInit(&quot;MainSQL&quot;, qMainSQL);    
      
    }

    private void ReportSummary1_BeforePrint(object sender, EventArgs e)
    {
      if(Report.GetTotalValueNullable(&quot;TotalSales_TO&quot;).ToString()==null){
         Cell75.Text=&quot;&quot;;
      }
    }
  }
}
</ScriptText> 
28.01.2021 11:23
Видимая часть отчета тут вполне безобидна.
Но вот процедура supermag.rep_formtemptabletoo.fill_pricecut - основные запросы наверняка в ней.

Не влезая в код, вам бы для начала базу проверить/обслужить, чем-то типа Оптимайзер Олега.
29.01.2021 06:22
Цитата:
string qMainSQL=&quot; SELECT article, cardname, ctg_code, subgrp_name, ctg_name, status_text, last_income_dt, last_income_cl, accprice, sales, remains_on_end, cashprice, extracharge, extracharge_art/100, step, minprice, sales_to, profit, CASE sales_to WHEN 0 THEN 0 ELSE profit/sales_to*100 END margin, inAuction, (SELECT rate FROM supermag.smaltunits a WHERE a.article=s.article AND a.altunit=2) volume FROM ( SELECT s.*, CASE status WHEN 1 THEN 'Активна' WHEN 2 THEN 'Неактивна' ELSE 'Не определено' END status_text, CASE accprice WHEN 0 THEN 0 ELSE cashprice/accprice-1 END extracharge, CASE status WHEN 1 THEN sales*cashprice WHEN 2 THEN remains_on_end*cashprice ELSE 0 END sales_to, (cashprice-accprice)* CASE status WHEN 1 THEN sales WHEN 2 THEN remains_on_end ELSE 0 END profit, supermag.classifier.NORMALIZECLASSIF(ctg_code) ctg, TO_CHAR(d.createdat,'dd.mm.yyyy') last_income_dt, (SELECT name FROM supermag.smclientinfo c WHERE c.id=d.clientindex) last_income_cl FROM supermag.rep$pricecut s LEFT OUTER JOIN supermag.smdocuments d ON d.doctype='WI' AND d.id=s.last_income ORDER BY ctg ASC, article ASC) s &quot;;
почему то кажется тут проблема. Нету знаний в sql но то что прогуглил скорей всего тут
29.01.2021 15:22
Цитата:
redesupar раньше говорят работало прекрсно
Повторяю, первым делом нужно обслужить БД.
Потом уже искать проблему в коде. И вышеуказанный запрос - достаточно простой, не должен тормозить.
Часовой пояс GMT +3, время: 22:24.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.