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

时间:2015-02-04 14:17:30

标签: sql-server-2008

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

我有两个数据库,我想知道我们有多少记录从1到另一个匹配。

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

匹配我正在使用ID_Number的记录,每个表中都是唯一的,并带来其他必要的字段。

以下脚本运行几分钟,然后超时“内存不足错误”。

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

请提供一些相关指导。

谢谢

1 个答案:

答案 0 :(得分:0)

我会在表之间尝试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

我不是百分百肯定,但我认为当您使用Table1, Table2语法并使用WHERE子句进行过滤时,它会将Table1中的每条记录连接到Table2中的每条记录,然后筛选出不匹配的内容。这将需要大量的内存。对于ID_NUMBERB61DDE99未编入索引且优化程序必须执行表扫描,尤其如此。

ETA:您在评论中指出,您希望每个CLIENT_CODEID_NUMBER组合只返回一种文档类型。在这种情况下,以下内容可能对您更有效。

请注意,我使用通用表格展示(CTE)来过滤Documents的内容,只返回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