最近,我遇到了一种在 SELECT 查询中对数据进行排序的模式(不确定,可能是反模式)。该模式更像是一种用于排序数据的冗长且非声明性的方式。该模式是将实际表中的相关数据转储到临时表中,然后将 orderby 应用于临时表上的字段。我想,有人这样做的唯一原因是提高性能(我对此表示怀疑)而没有其他好处。
例如,假设有一个用户表。该表可能包含数百万行。我们要检索名字以“G”开头并按名字排序的所有用户。在这种情况下实现 SQL 查询的自然且更具声明性的方式是:
更自然和声明的方式
SELECT * FROM Users
WHERE NAME LIKE 'G%'
ORDER BY Name
详细方式
SELECT * INTO TempTable
FROM Users
WHERE NAME LIKE 'G%'
SELECT * FROM TempTable
ORDER BY Name
在这种情况下,我有几个问题:
如果名字字段上没有索引,两种方式之间是否会有任何性能差异。如果是的话,哪一个会更好。
如果名字字段上有索引,两种方式之间是否会有任何性能差异。如果是的话,哪一个会更好。
SQL Server 优化器不应该为这两种方式生成相同的执行计划吗?
从锁定/阻塞之类的任何其他方面编写详细的方式有什么好处吗?
提前致谢。