Переключение между выборками занимает очень много времени в Qlikview

Автор Софья, 08 мая 2015, 07:59:41

« назад - далее »

admin

Загрузка из QVD с расчетами и формированием новых полей не самое лучшее решение при больших объемах данных.
Перенесите формирование полей на первый этап загрузки данных, в предварительный LOAD на Select Sql, с последующим сохранением в QVD-формат.
В этом случае загрузка файла в приложение пользователя будет происходить быстрее.

Софья

Получается, что я заменила поля "роз_цена*кол-во_товара" и "факт_цена*кол-во_товара" на вычисляемые СУММА_РОЗ и СУММА. В выражениях всё равно остались вышеуказанные агрегирования.
Натолкнули меня на мысль, чтобы прописать эти выражения, но без Sum в коде. Я об этом не подумала что-то.
If ещё не заменяла Set Analysis-ом, пока не разобралась.
Сейчас как раз пытаюсь прописать кол-во чеков в коде, чтобы убрать нагрузку с внешнего отображения. Запрос работает, но возвращает значения по одному полю, если их несколько, то код уже нерабочий. Поэтому пока на этапе совмещения этого запроса со всем кодом.
SELECT COUNT(DISTINCT L.LINE_NO||d.partn_doc), GG.NAME AS MAGAZ
FROM DB1_LINE L, DB1_DOCUMENT D, DB1_AGENT AG, DB1_AGENT GG
WHERE D.TYPE = 40304641
AND L.TYPE = 40304641
AND L.DOCUMENT = D.ID
AND AG.ID = D.DEPARTMENT
AND AG.PID = GG.ID
AND L.F14286866 >= TO_DATE('18.03.2015 00:00:00','DD.MM.YYYY HH24:MI:SS')
AND L.F14286866 <= TO_DATE('18.03.2015 23:59:59','DD.MM.YYYY HH24:MI:SS')
AND D.DOC_DATE >= TO_DATE('16.03.2015 00:00:00','DD.MM.YYYY HH24:MI:SS')
AND D.DOC_DATE <= TO_DATE('20.03.2015 23:59:59','DD.MM.YYYY HH24:MI:SS')
GROUP BY ROLLUP(GG.NAME);

Про загрузку не совсем поняла - "Перенесите формирование полей на первый этап загрузки данных, в предварительный LOAD на Select Sql, с последующим сохранением в QVD-формат." При формировании полей мне необходимы расчёты, я их прописываю в SQL, ставлю на отладку + параллельно формируется QVD-файл.
Что из себя представляет предварительный LOAD?
Как организовать последующее сохранение в QVD-формат? Точнее, чем оно отличается от получаемого файла, какие преимущества даёт?

admin

В вашем примере в первом сообщении:
SET vL1Date = "'01.01.2014 00:00:00','DD.MM.YYYY HH24:MI:SS'";     
SET vL2Date = "'31.12.2014 23:59:59','DD.MM.YYYY HH24:MI:SS'";
SET vDo1Date = "'30.12.2013 00:00:00','DD.MM.YYYY HH24:MI:SS'";     
SET vDo2Date = "'02.01.2015 23:59:59','DD.MM.YYYY HH24:MI:SS'";
Документы:
LOAD ID AS ID_DOCUMENT,     
    TYPE AS ТИП,   
    DEPARTMENT AS ID_DEPARTMENT,
    DOC_DATE,
    SECOND(DOC_DATE) AS SECOND,           
    MINUTE(DOC_DATE) AS MINUTE,
    HOUR(DOC_DATE) AS HOUR,                         
    DAY(DOC_DATE) AS DAY,
    WEEKDAY(DOC_DATE) AS DAYNAMES,
    MONTH(DOC_DATE) AS MONTH,
    YEAR(DOC_DATE) AS YEAR,
    PRODUCT AS ID_PRODUCT,
    F15007748 AS ЦЕНА,
    F15007746 AS РОЗ_ЦЕНА,
    F14286852 AS КОЛВО_ТОВАРА,
    LINE_NO AS ЧЕК,
    BEZNAL AS БЕЗНАЛ,
    VOZVRAT AS ВОЗВРАТ,
    POZ AS КОЛВО_ПОЗИЦИЙ;     
SQL SELECT --+ INDEX(DB1_DOCUMENT DB1_DOCUMENT_BY_TYPE_DATE)
    D1.ID,
    D1.TYPE,
    D1.DEPARTMENT,
    TO_CHAR(TRUNC(L.F14286866), 'dd.mm.yyyy') AS DOC_DATE,
    L.PRODUCT,
    L.F15007748,
    L.F15007746,
    L.F14286852,
    L.LINE_NO,
    (SELECT CASE WHEN L2.F6684673 = HEXTORAW('0095000101BC0001') THEN 0 ELSE 1 END
    FROM ETK00."DB1_LINE" L2 WHERE L2.DOCUMENT = D1.ID AND L2.TYPE = 40304642 AND L2.LINE_NO = L.LINE_NO AND ROWNUM <= 1) AS BEZNAL,
    (CASE WHEN L.F14286852 > 0 THEN 0 ELSE 1 END) AS VOZVRAT,
    (SELECT COUNT(*) FROM ETK00."DB1_LINE" where DOCUMENT = D1.id and TYPE = 40304641 and LINE_NO = L.LINE_NO) AS POZ
FROM ETK00."DB1_DOCUMENT" D1, ETK00."DB1_LINE" L
WHERE D1.CLASS = 40304641
AND D1.TYPE = 40304641
AND D1.STATE = 1
AND L.TYPE = 40304641
AND D1.ID = L.DOCUMENT
AND D1.DOC_DATE >= TO_DATE($(vDo1Date))
AND D1.DOC_DATE <= TO_DATE($(vDo2Date))
AND L.F14286866 >= TO_DATE($(vL1Date))
AND L.F14286866 <= TO_DATE($(vL2Date));

Предварительный load
ЦитироватьДокументы:
LOAD ID AS ID_DOCUMENT,
.....
который обрабатывает то, что грузится из непосредственного источника:
ЦитироватьSQL SELECT --+ INDEX(DB1_DOCUMENT DB1_DOCUMENT_BY_TYPE_DATE)
    D1.ID,
....
Если необходимо то мы можем добавить вычисляемые поля, например
ЦитироватьДокументы:
LOAD
ЦЕНА*КОЛВО_ТОВАРА AS [СУММА],//вычисляемое поле
ID AS ID_DOCUMENT,
.....
Затем сохранить в файл
Store * from Документы into Documents.qvd (qvd);

Софья

Ещё раз большое спасибо за советы и затраченное на меня время.
А про последнюю строчу со Store - я так и делала, просто в код, который выложила, её не включила.

admin

Поправлюсь
ошибочный код:
ЦитироватьДокументы:
LOAD
ЦЕНА*КОЛВО_ТОВАРА AS [СУММА],//вычисляемое поле
ID AS ID_DOCUMENT,
.....
Следует использовать имена полей, возвращаемые select sql :

ЦитироватьДокументы:
LOAD
F15007748 *F14286852 AS [СУММА],//вычисляемое поле
ID AS ID_DOCUMENT,
.....

Яндекс.Метрика