【发布时间】:2013-07-17 18:02:49
【问题描述】:
背景。我正在使用 SQL Server。我在数据库中有两个表:
Vendors(Id, Name, Description)
Products(Id, VendorId, Name, Description)
Id 列中的值在Vendor 表中使用前缀'ID_' 格式化。
VendorId 列中的值在Products 表中使用前缀'VE_' 格式化。
例如Products中的'VE_001245'指的是Vendors中的'ID_001245'。
(请不要提出改变这个概念,不关心数据库方案,不建议添加外键。只是为了说明。)
问题:以下哪个查询在性能方面最好?为什么?
-
在内部
select中使用replace函数:select v.* from Vendors v inner join ( select distinct replace(VendorId, 'VE_', 'ID_') as Id from Products ) list on v.Id = list.Id -
在
on-statement 中使用replace函数:select v.* from Vendors v inner join ( select distinct VendorId as Id from Products ) list on v.Id = replace(list.Id, 'VE_', 'ID_')
编辑。每个表中只有聚集索引(按Id 列)。每个表可以包含数百万行。
【问题讨论】:
-
我的猜测是 2,就像 1) 我必须在整个产品列表上运行该函数,然后选择与之不同的。对于第二个,我只在不同的列表上运行该函数(即我必须运行替换的行数应该更小)。但是很难知道,不知道数据编号是什么,索引等等。既然您可以访问架构,为什么不同时运行两个显示并比较结果的实际执行计划?
-
可以加computed columns (SQL2005+) 吗?
-
@BogdanSahlean:不,我不能修改数据库方案。
-
@dash 我已经更新了有关索引和估计表大小的详细信息的问题。目前表格未填满。所以我担心填表时实际执行计划会发生变化。
标签: sql sql-server tsql select