Оптимизация функций замены SQL для JOINS и путаница при наличии переменных - PullRequest
0 голосов
/ 02 октября 2018

Я только что начал новую работу в Dev Ops в издательской компании.Моя первая задача - оптимизировать огромный SQL-запрос, состоящий из функций.Функции действительно медленные.Парень, который создал запрос, был умным, но не знал SQL и использовал функции, когда мог вместо этого использовать JOIN.У меня проблемы с преобразованием функций, которые имеют переменные.Например, это одна из функций.Здесь он находится в запросе, а рядом находится связанная функция, сохраненная в другом месте.

dbo.rpt_get_isbn(b.bookkey, 21) AS 
f_upc

Затем функция ...

ALTER FUNCTION [dbo].[rpt_get_isbn](
        @i_bookkey  INT,
        @i_isbn_type    INT)

/*  Returns the identifier such as EAN, 
ISBN, with or without dashes


   PARAMETER @i_isbn_type
        10 = ISBN10
        13 = ISBN 13
        16 = EAN
        17 = EAN (no dashes)
        18 = GTIN
        19 = GTIN (no dashes)
        20 = LCCN
        21 = UPC
*/
    RETURNS VARCHAR(50)

AS
BEGIN
        DECLARE @RETURN VARCHAR(50)
        DECLARE @v_desc VARCHAR(50)

    IF @i_isbn_type = 10
        BEGIN
            SELECT @v_desc = isbn10
            FROM isbn
            WHERE bookkey = @i_bookkey
        END

    ELSE IF @i_isbn_type = 13
        BEGIN
            SELECT @v_desc = isbn
            FROM isbn
            WHERE bookkey = @i_bookkey
        END

    ELSE IF @i_isbn_type = 16
        BEGIN
           SELECT @v_desc = ean
           FROM isbn
            WHERE bookkey = @i_bookkey
        END
    ELSE IF @i_isbn_type = 17
        BEGIN
            SELECT @v_desc = ean13
            FROM isbn
            WHERE bookkey = @i_bookkey
        END
    ELSE IF @i_isbn_type = 18
        BEGIN
            SELECT @v_desc = gtin
            FROM isbn
            WHERE bookkey = @i_bookkey
        END
    ELSE IF @i_isbn_type = 19
        BEGIN
            SELECT @v_desc = gtin14
            FROM isbn
            WHERE bookkey = @i_bookkey
        END
    ELSE IF @i_isbn_type = 20
        BEGIN
            SELECT @v_desc = lccn
            FROM isbn
            WHERE bookkey = @i_bookkey
        END
    ELSE IF @i_isbn_type = 21
        BEGIN
            SELECT @v_desc = upc
            FROM isbn
            WHERE bookkey = @i_bookkey
        END
    IF LEN(@v_desc) > 0
        BEGIN
            SELECT @RETURN = 
LTRIM(RTRIM(@v_desc))
        END
    ELSE
        BEGIN
            SELECT @RETURN = ''
        END

  RETURN @RETURN
END

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

LTRIM(RTRIM(bo.ean13)) AS p_coverimagepath

, и требуется СОЕДИНЕНИЕ ...

LEFT JOIN Isbn bo WITH (NOLOCK) ON bo.bookkey = b.bookkey

Но опять же, теперь яРабота с параметрами и функцией, которая использует If / elses для получения ответа.Так что мне нужно добавить эту логику if / else в мой основной запрос?Я не могу думать о способах, которые приведут к простому ответу.Я с нетерпением жду, чтобы выяснить это.Пожалуйста, дайте мне знать, если я забыл какие-либо важные элементы, чтобы понять, что я делаю.Спасибо!

ОБНОВЛЕНИЕ Вот куда идет код

,pss8.dbo.xml_StripIllegalChars(dbo.rpt_get_series_volume(b.bookkey)) AS 
p_seriesvol
    ,CASE
        WHEN dbo.rpt_get_isbn(b.bookkey, 17) = ''
            THEN (
                    SELECT ipg_id
                    FROM tmmdb.ipg_extra.dbo.vw_Pss8IsbnOrUpc bo
                    WHERE bo.bookkey = b.bookkey
                    )
        ELSE dbo.rpt_get_isbn(b.bookkey, 17)
        END AS p_coverimagepath
    ,CASE
        WHEN dbo.rpt_get_isbn(b.bookkey, 17) = ''
            THEN (
                    SELECT ipg_id
                    FROM tmmdb.ipg_extra.dbo.vw_Pss8IsbnOrUpc bo
                    WHERE bo.bookkey = b.bookkey
                    )
        ELSE dbo.rpt_get_isbn(b.bookkey, 17)
        END AS TSP_p_coverimagepath
    ,pss8.dbo.xml_StripIllegalChars(replace(dbo.rpt_get_title(b.bookkey, 
'T'), '&', '&')) AS p_title /*  30OCT14 */

,pss8.dbo.xml_StripIllegalChars(replace(dbo.rpt_get_sub_title(b.bookkey), 
'&', '&')) AS p_subtitle /* 20OCT14 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...