如果我有两个问题
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 *需要访问表记录以获取您不需要的值.性能也不好.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%"不会.
我要反对这里的流程并说你应该选择*.我认为过早优化是许多问题的根源,您可能会发现它在您实际使用时不会影响您的性能.当然,通过这本书它必须更慢,但这并不意味着差异在实践中很重要.
但是要注意的是,某些SQL引擎(肯定是MS-SQL)会缓存select*,因此如果您使用的是预准备语句,或者使用它的视图或存储过程,并更改表模式,除非重新编译视图或sp,否则它不会接受更改,因此如果您没有动态运行这些查询,这是避免这样做的一个很好的理由.
当然,这因数据库引擎而异,因此需要进行一些负载测试,以确保命中率不是很大.
| 归档时间: |
|
| 查看次数: |
11097 次 |
| 最近记录: |