Sql 查询导致我的计算机 运行 内存不足

Sql query causing my computer to run out of memory

我有一个具有 24 GB RAM 的复制服务器,目前处于脱机状态以进行维护。我们 运行 SQL 服务器 2014.

我有两个数据库,我想找出有多少条记录从 1 匹配到另一个。

Database 1 Name: Clients_Records.(Table).Retail_BASE
Database 2 Name: Clients_Documents.(Table).Documents

匹配我正在使用的记录 ID_Number 因为每个记录都是唯一的 table 并将其他必要的字段带入。

下面的脚本运行了几分钟,然后超时 'Run out of memory error'。

select [Clients_Records].[dbo].[Retail_BASE].CLIENT_CODE,
[Clients_Records].[dbo].[Retail_BASE].ID_NUMBER,
[Clients_Documents].[dbo].[Documents].CBAF8917 AS Document_Type
from [Clients_Records].[dbo].[Retail_BASE],
[Clients_Documents].[dbo].[Documents]
where [Clients_Records].[dbo].[Retail_BASE].ID_NUMBER = [Clients_Documents].[dbo].[Documents].B61DDE99

我的结果应该是这样的。

CLIENT_CODE  ID_NUMBER  Document_Type
1234          111111       Contract
1234          111111       Agreement 
1234          111111       ID_Document
1235          111112       Contract
1235          111112       Agreement
1236          111113       Agreement
1237          111114       Contract
1237          111114       Agreement 
1239          111115       ID_Document
1240          111116       ID_Document

请提供一些指导。

谢谢

我会尝试在 table 之间进行 JOIN 而不是使用 WHERE 子句。我有理由相信所使用的优化会有所不同,这可能会使查询受益。

 select [Clients_Records].[dbo].[Retail_BASE].CLIENT_CODE,
        [Clients_Records].[dbo].[Retail_BASE].ID_NUMBER,
        [Clients_Documents].[dbo].[Documents].CBAF8917 AS Document_Type
 from   [Clients_Records].[dbo].[Retail_BASE]
     join [Clients_Documents].[dbo].[Documents]
         ON   [Clients_Records].[dbo].[Retail_BASE].ID_NUMBER = 
              [Clients_Documents].[dbo].[Documents].B61DDE99

我不是 100% 确定,但我认为当您使用 Table1, Table2 语法并使用 WHERE 子句进行过滤时,它将 Table1 中的每条记录连接到 [=14] 中的每条记录=],然后过滤掉不匹配的。这将需要大量内存。对于 ID_NUMBERB61DDE99 是非索引且优化器必须执行 table 扫描尤其如此。

预计到达时间:您在评论中指出,每个 CLIENT_CODEID_NUMBER 的组合只需要一种文档类型 returned。在这种情况下,以下内容可能更适合您。

请注意,我正在使用通用 Table 表达式 (CTE) 将 Documents 的内容过滤为 return,仅 Document_TypeB61DDE99.

 ;      
 WITH Unique_DocumentTypes
 AS (
     SELECT DISTINCT
            B61DDE99 as ID_NUMBER
        ,   CBAF8917 as Document_Type
     FROM   [Clients_Documents].[dbo].[Documents]
 )
 select rb.CLIENT_CODE,
        rb.ID_NUMBER,
        dt.Document_Type
 from   [Clients_Records].[dbo].[Retail_BASE] rb
     join Unique_DocumentTypes dt
         ON   rb.ID_NUMBER = dt.ID_NUMBER