返回的列数是否会影响查询的速度?

ili*_*ian 8 sql performance

如果我有两个问题

SELECT Id, Forename, Surname
FROM Person
WHERE PersonName Like(‘%frank%’)
Run Code Online (Sandbox Code Playgroud)

SELECT *
FROM Person
WHERE PersonName Like(‘%frank%’)
Run Code Online (Sandbox Code Playgroud)

哪个查询运行得更快?where子句/表是加入最大因子还是返回的列数?

我问,因为我正在构建一系列映射到数据库表的对象.通常,每个对象至少具有以下三种方法:

Select - 选择一切

List - 选择足够的可用于填充下拉列表

Search - 选择结果中可查看的所有内容,通常约为6列.

如果每个查询返回完全相同的列集,则代码的维护和测试应该更加简单.在任何给定的表中,数据库不可能超过50,000行,因此如果性能差异很小,那么我将节省开发时间.如果表演会在场上摔倒,那么我将从不同角度进行表演.

那么,为了便于开发,是SELECT *明智的还是天真的?

Qua*_*noi 25

你最好避免 SELECT *

  • 更改表格布局时会导致混淆.
  • 它选择不需要的列,您的数据包变大.
  • 列可以获得重复的名称,这对某些应用程序也不好
  • 如果索引覆盖了您需要的所有列,SELECT columns则只使用此索引,同时SELECT *需要访问表记录以获取您不需要的值.性能也不好.

  • @Pax:如果在查询中有自连接,或者连接两个具有相同名称的列的表. (3认同)

pax*_*blo 7

SELECT *通常永远不是一个好主意.它可能不会减慢您的DBMS获取速度,但它可能会导致通过网络传输的数据超出您的需要.

但是,通过使用LIKE '%frank%'基本上不可索引的子句并且将导致全表扫描,这可能会被淹没为无意义.

您可能需要考虑在数据进入数据库时​​清理数据,因为这几乎肯定会使后续查询运行得更快.

如果你是坦率的,那么确保它存储为坦率并使用:

select x,y,z from table where name = 'frank'
Run Code Online (Sandbox Code Playgroud)

如果你想获得富兰克林,请使用:

select x,y,z from table where name like 'frank%'
Run Code Online (Sandbox Code Playgroud)

这两个都可以在name列上使用索引,但"%frank%"不会.


Yis*_*hai 5

我要反对这里的流程并说你应该选择*.我认为过早优化是许多问题的根源,您可能会发现它在您实际使用时不会影响您的性能.当然,通过这本书它必须更慢,但这并不意味着差异在实践中很重要.

但是要注意的是,某些SQL引擎(肯定是MS-SQL)会缓存select*,因此如果您使用的是预准备语句,或者使用它的视图或存储过程,并更改表模式,除非重新编译视图或sp,否则它不会接受更改,因此如果您没有动态运行这些查询,这是避免这样做的一个很好的理由.

当然,这因数据库引擎而异,因此需要进行一些负载测试,以确保命中率不是很大.