В запросах памяти с использованием SQL Server - PullRequest
0 голосов
/ 22 марта 2020

Я боюсь, что, хотя я использую CTE в своем запросе, что, возможно, за кулисами происходит большое кеширование диска - так что, возможно, оно не использует CTE.

Весь смысл использования CTE состоял в том, что мой исходный код запроса был слишком медленным, и в итоге получал ошибку транспортного уровня и cra sh.

Ну, это все еще слишком медленно. Может быть, даже медленнее. Я пока не знаю.

Есть ли способ сообщить SQL Server о go впереди и быть бестселлером для моего запроса?

Я только догадываюсь, но я думаю, что он использует дисковое пространство для кэширования результатов памяти. Когда я смотрю на использование памяти диспетчера задач, я вижу SSMS на 161 МБ. SSMS - это то место, откуда я запускаю запрос.

Вот мой код - вам не нужно подробно его читать, но вкратце исходная таблица содержит около миллиона строк.

Мне нужно решение, поэтому альтернативные идеи приветствуются ...

    WITH MetEdFliers AS 
    (
        SELECT DISTINCT
            [CustomerName1], [Mailing_Address], [Mailing_Address2], [Mailing_Zip]
        FROM 
            [dbo].[_MetEd_Detail]
        WHERE
            RunId = (SELECT RunId FROM LastLoadRuns WHERE UtilityId = 9)
            AND [Profitable] = 1   -- and not low income, should flag exist
    ),
    MetEdLookUpFirst AS 
    (
        -- same as [dbo].[VW_MetEd_Master_Profitable_ExcludeBadAddress]
       SELECT
           IIF (DET.IncalculableMailAddress = 1, 
                IIF (AA.Address1 IS NULL, 'Bad Address Undefined Fix -- Source Address Provided', 'Fixed Bad Source Address Via Lookup'), '') AS AddressStatus,
           DET.ACCT_NO,
           (CAST(DET.Monthly1 as Decimal) + 
            CAST(DET.Monthly2 as Decimal) + 
            CAST(DET.Monthly3 as Decimal) + 
            CAST(DET.Monthly4 as Decimal) + 
            CAST(DET.Monthly5 as Decimal) + 
            CAST(DET.Monthly6 as Decimal) + 
            CAST(DET.Monthly7 as Decimal) + 
            CAST(DET.Monthly8 as Decimal) + 
            CAST(DET.Monthly9 as Decimal) + 
            CAST(DET.Monthly10 as Decimal) + 
            CAST(DET.Monthly11 as Decimal) + 
            CAST(DET.Monthly12 as Decimal)) AS BilledKWHTotal,
           DET.Polar, DET.CustomerName1, 
           REPLACE (IIF (DET.IncalculableMailAddress = 1,
                         IIF (AA.Address1 IS NULL, DET.Mailing_Address, AA.Address1), DET.Mailing_Address), ',', ';') AS Address1,
           REPLACE (IIF (DET.IncalculableMailAddress = 1,
                         IIF (AA.Address2 IS NULL, DET.Mailing_Address2,  AA.Address2), DET.Mailing_Address2), ',', ';') AS Address2,
           REPLACE (IIF (DET.IncalculableMailAddress = 1,
                         IIF (AA.City IS NULL, DET.Mailing_City, AA.City), DET.Mailing_City), ',', ';') AS City,
           IIF (DET.IncalculableMailAddress = 1,
                IIF (AA.[State] IS NULL, DET.Mailing_State, AA.[State]), DET.Mailing_State) AS [State],
           IIF (DET.IncalculableMailAddress = 1, 
                IIF (AA.Zip IS NULL, DET.Mailing_Zip, AA.Zip), DET.Mailing_Zip) AS ZIP,
           IIF (DET.IncalculableMailAddress = 1, '', DET.Mailing_Zip4) AS ZIP4,
           REPLACE (DET.Address, ',', ';') AS ServiceAddress,
           REPLACE (DET.City, ',', ';') AS ServiceAddressCity,
           DET.State ASs ServiceAddressState,
           DET.Zip AS ServiceAddressZip,
           DET.Zip4 AS ServiceAddressZip4,
           DET.ProfitAnnualPotential AS [Potential Annual Profit]
       FROM
           _MetEd_DETAIL DET 
       LEFT JOIN
           AccountAddress AA ON (DET.ACCT_NO = AA.ACCT_NO AND AA.UtilityId = 9)
       WHERE
           RunId = (SELECT RunId FROM LastLoadRuns WHERE UtilityId = 9)
           AND DET.Profitable = 1 --AND det.CAP_CUSTOMER = 0
           AND (DET.IncalculableMailAddress = 0 OR (AA.Address1 IS NOT NULL))
    )
    SELECT X.* 
    FROM MetEdFliers Fliers
    OUTER APPLY 
        (SELECT TOP 1 *
         FROM MetEdLookUpFirst LU
         WHERE LU.CustomerName1 = Fliers.CustomerName1 
           AND LU.Address1 = Fliers.Mailing_Address 
           AND LU.Address2 = Fliers.Mailing_Address2 
           AND LU.Zip = Fliers.Mailing_Zip) X

1 Ответ

0 голосов
/ 23 марта 2020

Это выглядит сложно. Я собираюсь обработать это в моей исходной программе, которая генерирует входные файлы для серверной базы данных sql (я превращаю cvs в таблицу, используя импорт).

Для решения этой проблемы я собираюсь использовать Технология под названием словарь, с парой ключ-значение, в c#.

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

Примечание: предыдущий метод, у меня не было суммы (улучшение).

...