我有一个非常大的表(将其命名为表A:大约有3亿条记录)和另一个大约有100,000条记录的表(将其命名为表B)。任务是从表B中检索表A中没有的所有记录。表A和表B的结构是相同的。
我在两个表中都使用了Primary Key,并在Non Unique字段中添加了Unstructured Index,用于在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会有帮助吗?但是,将其分解为视图可能涉及复杂的查询。请帮我解决这个问题。非常感谢。
答案 0 :(得分: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
让我知道执行时间。
答案 1 :(得分:2)
你可以在没有加入的情况下尝试这个
SELECT Col1 FROM Table_B
WHERE NOT EXISTS(SELECT 1 FROM Table_A Table_B.Col1 = Table_A.Col1)
的Manoj
答案 2 :(得分:0)
是否可以重构数据库结构并将Table_A
和Table_B
合并到一个表中? Table_B
中的项似乎属于Table_A
项的属性,因此您可以为Table_B
添加列,而不是根据项目的表来确定项目的状态。 -ness到Table_A
答案 3 :(得分:0)
我设法得到了正确的答案。看起来使用LINQ似乎不是一个好选择。使用参数化SP完全使用它,并使用Schemabinding使用Views将巨大的表A划分为多个表。有了这个,我已经为主键字段(Col1)添加了索引,以便更快地检索。
现在,我能够在1分4秒内执行它。谢谢大家帮助我。我使用了与前面提到的SP
相同的连接查询