我有一个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
请提供一些相关指导。
谢谢
答案 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_NUMBER
或B61DDE99
未编入索引且优化程序必须执行表扫描,尤其如此。
ETA:您在评论中指出,您希望每个CLIENT_CODE
和ID_NUMBER
组合只返回一种文档类型。在这种情况下,以下内容可能对您更有效。
请注意,我使用通用表格展示(CTE)来过滤Documents
的内容,只返回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