Избегайте использования функции where, из-за чего возникает проблема с производительностью? - PullRequest
0 голосов
/ 09 октября 2019

Всякий раз, когда я выполняю процедуру, у меня возникает проблема с производительностью, где мне нужно изменить процедуру, чтобы повысить производительность?

Я вызвал табличную функцию, в которой мне нужно оптимизировать эту процедуру, не используястрока.

CREATE PROC proc_productwise_report @cmp_id VARCHAR(max), @unitcode VARCHAR(max), @gr_code VARCHAR(max), @store_code VARCHAR(max), @from_dt VARCHAR(20), @to_dt VARCHAR(20)
AS
BEGIN
    SELECT sh.cmp_id, d.unitcode, d.store_code, st.item_code AS product, d.item_code, im.item_desc, SUM(charge_qty) AS challan_qty
    FROM ps_invenstatic sh
    INNER JOIN ps_invenstaticdet st ON sh.cmp_id = st.cmp_id
        AND sh.sys_no_id = st.sys_no_id
        AND sh.doc_id = st.doc_id
        AND sys_doc_type = 'PSCH'
    INNER JOIN ps_invenissu h ON sh.cmp_id = h.cmp_id
        AND sh.doc_type = h.ref_doc_type
        AND sh.doc_no = h.ref_doc_no
        AND h.prod_code = st.item_code
    INNER JOIN ps_invenissudet d ON h.cmp_id = d.cmp_id
        AND h.sys_no_id = d.sys_no_id
        AND h.doc_id = d.doc_id
    INNER JOIN ps_itemmas im ON sh.cmp_id = im.cmp_id
        AND im.item_code = d.item_code
    WHERE sh.cmp_id IN (
            SELECT *
            FROM utilfn_split(@cmp_id, ',')
            )
        AND d.unitcode IN (
            SELECT *
            FROM utilfn_split(@unitcode, ',')
            )
        AND im.gr_code IN (
            SELECT *
            FROM utilfn_split(@gr_code, ',')
            )
        AND d.store_code IN (
            SELECT *
            FROM utilfn_split(@store_code, ',')
            )
        AND h.doc_dt BETWEEN convert(DATETIME, @from_dt, 103)
            AND convert(DATETIME, @to_dt, 103)
        AND sh.Stat_Code <> 'CA'
    GROUP BY sh.cmp_id, d.unitcode, d.store_code, st.item_code, d.item_code, im.item_desc
END

Мне нужно избегать использования функции where и решить проблему производительности.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Вы можете построить временные таблицы в своей хранимой процедуре с результатом SPLIT и INNER JOIN для этих временных таблиц в вашем основном запросе.

CREATE PROC proc_productwise_report @cmp_id VARCHAR(max), @unitcode VARCHAR(max), 
@gr_code VARCHAR(max), @store_code VARCHAR(max), @from_dt VARCHAR(20), @to_dt VARCHAR(20)
AS
BEGIN

SELECT *
INTO #cmp_ids
FROM utilfn_split(@cmp_id, ',');

SELECT *
INTO #unitcodes
FROM utilfn_split(@unitcode, ',');

SELECT *
INTO #gr_codes
FROM utilfn_split(@gr_code, ',');

SELECT *
INTO #store_codes
FROM utilfn_split(@store_code, ',');

SELECT 
    sh.cmp_id
    , d.unitcode
    , d.store_code
    , st.item_code AS product
    , d.item_code
    , im.item_desc
    , SUM(charge_qty) AS challan_qty
FROM ps_invenstatic sh
    INNER JOIN ps_invenstaticdet st 
        ON sh.cmp_id = st.cmp_id
            AND sh.sys_no_id = st.sys_no_id
            AND sh.doc_id = st.doc_id
            AND sys_doc_type = 'PSCH'
    INNER JOIN ps_invenissu h 
        ON sh.cmp_id = h.cmp_id
            AND sh.doc_type = h.ref_doc_type
            AND sh.doc_no = h.ref_doc_no
            AND h.prod_code = st.item_code
    INNER JOIN ps_invenissudet d 
        ON h.cmp_id = d.cmp_id
            AND h.sys_no_id = d.sys_no_id
            AND h.doc_id = d.doc_id
    INNER JOIN ps_itemmas im 
        ON sh.cmp_id = im.cmp_id
            AND im.item_code = d.item_code
    INNER JOIN #cmp_ids tci on sh.cmp_id = tci.[value]
    INNER JOIN #unitcodes tuc on d.unitcode = tuc.[value]
    INNER JOIN #gr_codes tgr on im.gr_code = tgr.[value]
    INNER JOIN #store_codes tsc on d.store_code = tsc.[value]
WHERE h.doc_dt BETWEEN convert(DATETIME, @from_dt, 103)
    AND convert(DATETIME, @to_dt, 103)
    AND sh.Stat_Code <> 'CA'
GROUP BY sh.cmp_id
    , d.unitcode
    , d.store_code
    , st.item_code
    , d.item_code
    , im.item_desc
END 
0 голосов
/ 09 октября 2019

Используйте табличные параметры вместо строк CSV. В качестве альтернативы сначала создайте временные таблицы (переменные таблиц).

declare @tunitcode table (id int); -- you type may be different
insert @tunitcode(id) 
select * 
from utilfn_split(@unitcode, ',');

.. AND d.unitcode IN (
            SELECT * FROM @tunitcode)
..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...