第一种
exec sp_executesql N'SELECT [u].[Id], [u].[LoginName], [u].[KSH], [u].[TrueName], [u].[Sex], [u].[CollegeName], [u].[ProjectName], [u].[CardId], [t].[OkEndTime], [t].[Status], [t].[Remark], [u].[ReportYear], [u].[CreateDate]
FROM [WNA_NewUser] AS [u]
LEFT JOIN (
SELECT [u0].*
FROM [WNA_EnrolmentReport] AS [u0]
) AS [t] ON [u].[Id] = [t].[UserId]
WHERE (0 <> 1) AND ([u].[Sex] = @__param_Sex_0)
ORDER BY [u].[CreateDate] DESC
OFFSET @__p_1 ROWS FETCH NEXT @__p_2 ROWS ONLY',N'@__param_Sex_0 nvarchar(10),@__p_1 int,@__p_2 int',@__param_Sex_0=N'男',@__p_1=0,@__p_2=10
第二种
exec sp_executesql N'SELECT [a].[Id], [a].[LoginName], [a].[KSH], [a].[TrueName], [a].[Sex], [a].[CollegeName], [a].[ProjectName], [a].[CardId], [b].[OkEndTime], [b].[Status], [b].[Remark], [a].[ReportYear], [a].[CreateDate]
FROM [WNA_NewUser] AS [a]
LEFT JOIN [WNA_EnrolmentReport] AS [b] ON [a].[Id] = [b].[UserId]
WHERE (0 <> 1) AND ([a].[Sex] = @__param_Sex_0)
ORDER BY [a].[CreateDate] DESC
OFFSET @__p_1 ROWS FETCH NEXT @__p_2 ROWS ONLY',N'@__param_Sex_0 nvarchar(10),@__p_1 int,@__p_2 int',@__param_Sex_0=N'男',@__p_1=0,@__p_2=10
区别在于 SELECT [u0].*
,如果实际需要 SELECT 的字段很少,性能影响可能很大
理解的确是这样理解,但是sql server执行计划,两种都是一样的,查询时间也没啥区别,测试数据主表20万,副表200万数据。
@代码小六: 如果都是走聚集索引取数据,SELECT [u0].*
主要是传输数据的开销大一些;如果 SELECT 更少的字段可以在索引中直接取到数据,查询速度会更快。
@dudu: 测试了 select *, select 个别字段,每种情况的执行计划,耗时都没有区别