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

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

18.04.2024 13:49


28.01.2021 09:44
redesupar
 
Супермаг 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=&quotSELECT articlecardnamectg_codesubgrp_namectg_namestatus_textlast_income_dtlast_income_claccpricesalesremains_on_endcashpriceextrachargeextracharge_art/100stepminpricesales_toprofit, CASE sales_to WHEN 0 THEN 0 ELSE profit/sales_to*100 END margininAuction, (SELECT rate FROM supermag.smaltunits a WHERE a.article=s.article AND a.altunit=2volume 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 profitsupermag.classifier.NORMALIZECLASSIF(ctg_codectgTO_CHAR(d.createdat,'dd.mm.yyyy'last_income_dt, (SELECT name FROM supermag.smclientinfo c WHERE c.id=d.clientindexlast_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 ASCarticle ASCs  &quot;;
    
string sLocName;
    
string sGroupName;
    
string sUserName;
    
string sDateName;
    
    
RepHost host;

    private 
void _StartReport(object senderEventArgs e)
    { 
      
      
// Хост отчёта
      
host = new RepHost(Report);
            
      
// контрагент &quot;От имени&quot;
      
sUserName RepClientInfo.GetClientName(host.ConnectionReport.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.ToSqlNumberiCountDay )+&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(10from 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(10from 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 senderEventArgs e)
    {
      if(
Report.GetTotalValueNullable(&quot;TotalSales_TO&quot;).ToString()==null){
         
Cell75.Text=&quot;&quot;;
      }
    }
  }
}
</
ScriptText
28.01.2021 11:23
vdm
 
Видимая часть отчета тут вполне безобидна.
Но вот процедура supermag.rep_formtemptabletoo.fill_pricecut - основные запросы наверняка в ней.

Не влезая в код, вам бы для начала базу проверить/обслужить, чем-то типа Оптимайзер Олега.
29.01.2021 06:22
redesupar
 
Цитата:
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
vdm
 
Цитата:
redesupar раньше говорят работало прекрсно
Повторяю, первым делом нужно обслужить БД.
Потом уже искать проблему в коде. И вышеуказанный запрос - достаточно простой, не должен тормозить.
Часовой пояс GMT +3, время: 13:49.

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