【问题标题】:In memory queries using SQL Server使用 SQL Server 进行内存查询
【发布时间】:2020-03-21 21:16:09
【问题描述】:

我担心,即使我在查询中使用 CTE,也可能在幕后进行了大量磁盘缓存 - 所以它可能不使用 CTE。

使用 CTE 的全部意义在于我原来的查询代码太慢了,最终会出现传输级错误并崩溃。

嗯,还是太慢了。甚至可能更慢。我还不知道。

有没有办法告诉 SQL Server 继续并为我的查询占用资源?

我只是猜测,但我认为它正在使用磁盘空间来缓存内存结果。当我查看任务管理器内存利用率时,我看到 SSMS 为 161 MB。 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

【问题讨论】:

  • CTE 不会(通常)改变 SQL Server 中的查询性能。完全没有。
  • 在我的日常业务中,我了解到临时表在性能方面的表现要好得多。所以尝试将你的 CTE 写入临时表(如 SELECT ... INTO #T1 FROM ...
  • 查询似乎返回了 1M 相对宽的行,并且您正在 SSMS 中显示。我怀疑这是客户端而不是服务器。尝试使用 SSMS 丢弃结果集选项运行查询,看看需要多长时间。
  • 或在最后一行尝试OPTION (FORCE ORDER)
  • 你需要发布你的执行计划和STATISTICS IO输出

标签: sql sql-server tsql select common-table-expression


【解决方案1】:

看起来很难。 我将在为 sql server 数据库生成输入文件的源程序中处理它(我使用 import 将 cvs 真正放入表中)。

为了解决这个问题,我将在 c# 中使用一种称为字典的技术,带有键值对。

我将能够判断之前是否已添加该键,如果是,我将键值对替换为新的键值对,并将年利润潜力字段替换为两条记录的总和....

注意:之前的方法,我没有求和(增强)。

【讨论】:

  • 这将如何清理您的数据?您的大部分查询都试图动态清理数据并选择一个地址。
猜你喜欢
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 2013-06-21
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
相关资源
最近更新 更多