我看到大量的文章都在说 SELECT * 这样的 SQL 语句对性能有多大影响,持有这种观点的人建议我们将需要读取的列都罗列出来而不是使用 SELECT * 的语句用于提升 SQL 执行的性能。今天我就想较真一次,来测试这两者到底有何区别,因为我觉得这个结论有点扯淡。
开始测试
我有如下两个 SQL 查询语句:
SELECT *
FROM Warehouse.StockItemTransactions AS sit;
--and
SELECT sit.StockItemTransactionID,
sit.StockItemID,
sit.TransactionTypeID,
sit.CustomerID,
sit.InvoiceID,
sit.SupplierID,
sit.PurchaseOrderID,
sit.TransactionOccurredWhen,
sit.Quantity,
sit.LastEditedBy,
sit.LastEditedWhen
FROM Warehouse.StockItemTransactions AS sit;
我使用 PowerShell 来运行这些查询几百次,然后通过扩展事件来捕获执行结果,接着对这些结果进行统计和比较。
测试结果
为了了确保测试准确,我执行了很多次的测试过程。有趣的是我在结果中看到了一些差异。其中一个测试只测试单个方法的偏差,而另外一个则相反。因此我们对这些结果取平均值,就会看到如下的结果:
* | 167.247ms |
字段列表 | 165.500ms |
这个结果是在每个查询独立执行了 2000 次后的结果,也就是说两个查询在执行 2000 次后会有 2 毫秒的性能偏差,字段列表的查询方式略优。你也可以说二者的性能差别不到 1% 。所以还值得为这不同的写法费心吗,我相信不管做多少测试,这个结果也将会是正确的。在我的多个测试中 SELECT * 语句跑得要更快一些些,我觉得自己有责任提供这个完整的结果,有一些改进,但是我并未此感到兴奋,因为还有数据读取、执行计划等等影响性能的因素。
SELECT * 结论
别让我犯错误,有很多不要使用 SELECT * 查询的原因,性能是其中一个因素。但是这么多人认为使用 SELECT * 查询会导致性能低下的结论并不一定是对的。他们只是认为你应该根据需要来读取数据,而不是全部。但我并不认为那些有经验和学识的人建议的那样,使用完整的字段列表代替SELECT * 会使查询变得更快。在上面的测试中我们已经看到了,不是吗?(或许这样说更贴切一点:差别微乎其微,可以忽略不计)

- 原文:SELECT * Does Not Hurt Performance / SELECT * 语句并不会对性能有什么影响
- 作者:Grant Fritchey
- 频道:计算机
- 发布:CY2 (2016-10-19)
- 标签: SQLSELECT *
- 版权:本文仅用于学习、研究和交流目的,非商业转载请注明出处、译者和可译网完整链接。
1、select *会导致网络资源大量浪费(服务器和数据库不在一个局域网中时特别明显),程序响应速度急剧下降。
2、如果表结构发生改变,程序可能无法感知(也就是可能不报异常,但逻辑上确是错误的),这可能会导致严重的业务灾难!
2.列只有11个,某些大表有几十个列。
我相信。。。我觉得。。。我xxx。。。。。
2000次的测试也算测试...
1.传输大小
2.缓存大小
如果真要做试验,加一个 select pk, 和 select *,在千万级的数据表上对比下。
楼主说的对,楼主万岁
1:单从数据库查询执行效率两者没有差别
2:建议不使用*的原因是因为如果字段多的情况下,数据的传输量会增加,传输需要带宽和时间,遇到网络不好,数据量大你就跪了