过滤和获取数据或过滤器然后获取数据更快吗?
问题描述:
我有这样的要求:过滤和获取数据或过滤器然后获取数据更快吗?
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
答
您将要选择尽量少的行越好。使用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
你的两个查询是非常不同的 - 第一个只是选择,第二个是更新。你是在问不同的方式来选择或不同的方式来更新? – Oded 2010-03-16 13:38:18
你只是试图强制从一个表到另一个表中的所有“匹配的ID”的链接?即:您的myLink是您的主表,myTable是其他工作表,并且您希望将所有记录更新为另一个(或者表格反之亦然)?或者...是否有其他进程针对@result提取进行。 – DRapp 2010-03-16 13:48:45
2个查询的结果是相同的:我有一张表,其中包含ID和来自myTable的数据,而且我只有链接到ID2 666的记录。 不同之处在于,第一次获取数据和I在同一时间选择记录。在第二个请求中,我选择了记录,一旦我有了我的记录ID,我就可以得到这些数据。 – 2010-03-16 14:00:44