过滤和获取数据或过滤器然后获取数据更快吗?

问题描述:

我有这样的要求:过滤和获取数据或过滤器然后获取数据更快吗?

SELECT myTable.ID, 
myTable.Adress, 
-- 20 more columns of all kind of type 
FROM myTable 
WHERE EXISTS(SELECT * FROM myLink 
    WHERE myLink.FID = myTable.ID 
    and myLink.FID2 = 666) 

myLink的有很多行。

你认为这是更快地这样做:

INSERT INTO @result(ID) SELECT myLink.FID 
FROM myLink 
WHERE myLink.FID2 = 666 

UPDATE @result SET Adress = myTable.Adress, 
    -- 20 more columns of all kind of type 
    FROM myTable 
    WHERE myTable.ID = @result.ID 
+1

你的两个查询是非常不同的 - 第一个只是选择,第二个是更新。你是在问不同的方式来选择或不同的方式来更新? – Oded 2010-03-16 13:38:18

+0

你只是试图强制从一个表到另一个表中的所有“匹配的ID”的链接?即:您的myLink是您的主表,myTable是其他工作表,并且您希望将所有记录更新为另一个(或者表格反之亦然)?或者...是否有其他进程针对@result提取进行。 – DRapp 2010-03-16 13:48:45

+0

2个查询的结果是相同的:我有一张表,其中包含ID和来自myTable的数据,而且我只有链接到ID2 666的记录。 不同之处在于,第一次获取数据和I在同一时间选择记录。在第二个请求中,我选择了记录,一旦我有了我的记录ID,我就可以得到这些数据。 – 2010-03-16 14:00:44

您将要选择尽量少的行越好。使用where子句过滤数据是一个好主意,因为服务器必须返回更少的数据。在第二个版本中,您只选择一个myLink项目,然后对其进行处理,而在第一个示例中,您获得了select *,这通常是一个糟糕的主意。

有什么不妥:

SELECT myTable.etc from myTable,myLink where myLink.FID2= 666 AND myLink.ID=myTable.ID 

这构建了一个联接和过滤器中的一个步骤。也许一种不同类型的连接会更有效,但代码确实看起来更短。

+0

当您使用存在时,您可以使用“select *”没有区别 http://blog.sqlauthority.com/2008/02/26/sql-server-select-1-vs-select-an-interesting-观察/ 而我不喜欢只做一个连接来过滤数据,因为你可以得到重复的行。 – 2010-03-16 14:04:27