从连接的大桌子中尽可能快地检索

时间:2013-06-25 10:43:54

标签: c# .net sql-server-2008 linq-to-sql stored-procedures

我有一个非常大的表(将其命名为表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会有帮助吗?但是,将其分解为视图可能涉及复杂的查询。请帮我解决这个问题。非常感谢。

4 个答案:

答案 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_ATable_B合并到一个表中? Table_B中的项似乎属于Table_A项的属性,因此您可以为Table_B添加列,而不是根据项目的表来确定项目的状态。 -ness到Table_A

答案 3 :(得分:0)

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

现在,我能够在1分4秒内执行它。谢谢大家帮助我。我使用了与前面提到的SP

相同的连接查询