【发布时间】:2014-03-03 16:14:25
【问题描述】:
对于那里的数据库专家,我想知道在加入 SELECT 语句的结果和加入以前填充的表变量之间是否存在任何功能/性能差异。我正在使用 SQL Server 2008 R2。
示例(TSQL):
-- Create a test table
DROP TABLE [dbo].[TestTable]
CREATE TABLE [dbo].[TestTable](
[id] [int] NOT NULL,
[value] [varchar](max) NULL
) ON [PRIMARY]
-- Populate the test table with a few rows
INSERT INTO [dbo].[TestTable]
SELECT 1123, 'test1'
INSERT INTO [dbo].[TestTable]
SELECT 2234, 'test2'
INSERT INTO [dbo].[TestTable]
SELECT 3345, 'test3'
-- Create a reference table
DROP TABLE [dbo].[TestRefTable]
CREATE TABLE [dbo].[TestRefTable](
[id] [int] NOT NULL,
[refvalue] [varchar](max) NULL
) ON [PRIMARY]
-- Populate the reference table with a few rows
INSERT INTO [dbo].[TestRefTable]
SELECT 1123, 'ref1'
INSERT INTO [dbo].[TestRefTable]
SELECT 2234, 'ref2'
-- Scenario 1: Insert matching results into it's own table variable, then Join
-- Create a table variable
DECLARE @subset TABLE ([id] INT NOT NULL, [refvalue] VARCHAR(MAX))
INSERT INTO @subset
SELECT * FROM [dbo].[TestRefTable]
WHERE [dbo].[TestRefTable].[id] = 1123
SELECT t.*, s.*
FROM [dbo].[TestTable] t
JOIN @subset s
ON t.id = s.id
-- Scenario 2: Join directly to SELECT results
SELECT t.*, s.*
FROM [dbo].TestTable t
JOIN (SELECT * FROM [dbo].[TestRefTable] WHERE id = 1123) s
ON t.id = s.id
在“真实”世界中,表格和表格变量是预定义的。我正在寻找的是能够使匹配的参考行可用于进一步的操作,但我担心额外的步骤会减慢查询速度。为什么一个比另一个更快有技术原因吗?两种方法之间可能会出现什么样的性能差异?我意识到很难(如果不是不可能的话)给出一个明确的答案,只是为这种情况寻找一些建议。
【问题讨论】:
-
你永远不想在生产环境中使用这样的代码,SELECT t.*, s.*。 Seect * ii 是一个 SQl 反模式,当你有这样的连接时,你会返回不需要的字段,因为 jon 文件包含相同的数据。这是一个非常糟糕的做法。永远不要返回超出您需要的数据。
-
这是一个很好的问题,也有一些很好的答案。我可能会因为“我也是”的评论而受到抨击,但 +1 还不够。
标签: sql sql-server performance tsql database-performance