1

我有一个非常大的表(将其命名为表 A:可能有 3 亿条记录)和另一个大约有 100,000 条记录的表(将其命名为表 B)。任务是从表 B 中检索表 A 中不存在的所有记录。表 A 和表 B 的结构相同。

我在两个表中都使用了主键,并在用于在 WHERE 子句中搜索的非唯一字段上添加了非结构化索引。

目前我正在执行连接操作来完成任务......(Col1 是主键)

SELECT Col1 FROM Table_B
WHERE Col1 NOT IN (
SELECT     Table_B.Col1 
FROM         Table_A INNER JOIN
                      Table_B ON Table_A.Col1 =   Table_A.Col1 ) 

有没有更有效的方法?

任务是在 2 分钟内检索信息。但是,它大约需要 18-25 分钟。检索相同的。

我目前正在使用带有存储过程的 LINQ to SQL 来检索数据。它是有益的还是我应该坚持从数据库中进行通常的检索。

如果我使用 Views 在多个表中分解表 A 会有帮助吗?但是,将其分解为视图可能涉及复杂的查询。请帮我解决这个问题。非常感谢。

4

4 回答 4

3

您需要避免在 SQL 中使用“IN”语句。您可以尝试以下方法

 SELECT Col1 FROM Table_B
 LEFT JOIN Table_A
 ON Table_B.Col1 = Table_A.Col1
 WHERE Table_A.Col1 IS NULL

让我知道执行时间。

于 2013-06-25T10:52:16.933 回答
2

你也可以不加入试试这个

SELECT Col1 FROM Table_B 
WHERE NOT EXISTS(SELECT 1 FROM Table_A Table_B.Col1 = Table_A.Col1)

马诺伊

于 2013-06-25T11:18:25.940 回答
0

是否可以重构数据库结构并将其合并Table_ATable_B一张表中?似乎 inTable_B是 的项目的属性Table_A,因此与其根据项目所在的表确定项目的状态,不如为Table_B-ness添加一列Table_A

于 2013-06-25T13:33:40.880 回答
0

我设法得到了正确的答案。似乎使用 LINQ 不是一个好的选择。已将其完全与参数化 SP 一起使用,并使用使用 Schemabinding 的视图将巨大的表 A 划分为多个表。有了这个,我在主键字段 (Col1) 中添加了索引,以便更快地检索。

现在,我可以在 1 分 4 秒内执行它。感谢大家帮助我。我对 SP 使用了与上述相同的连接查询

于 2013-06-26T09:46:06.290 回答