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_NUMBER
或 B61DDE99
是非索引且优化器必须执行 table 扫描尤其如此。
预计到达时间:您在评论中指出,每个 CLIENT_CODE
和 ID_NUMBER
的组合只需要一种文档类型 returned。在这种情况下,以下内容可能更适合您。
请注意,我正在使用通用 Table 表达式 (CTE) 将 Documents
的内容过滤为 return,仅 Document_Type
和 B61DDE99
.
;
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
我有一个具有 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_NUMBER
或 B61DDE99
是非索引且优化器必须执行 table 扫描尤其如此。
预计到达时间:您在评论中指出,每个 CLIENT_CODE
和 ID_NUMBER
的组合只需要一种文档类型 returned。在这种情况下,以下内容可能更适合您。
请注意,我正在使用通用 Table 表达式 (CTE) 将 Documents
的内容过滤为 return,仅 Document_Type
和 B61DDE99
.
;
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