Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用SELECT*时的性能问题?_Sql_Database_Performance - Fatal编程技术网

Sql 使用SELECT*时的性能问题?

Sql 使用SELECT*时的性能问题?,sql,database,performance,Sql,Database,Performance,可能重复: 使用SELECT*而不是SELECT FiledName、FiledName2…,是否存在性能问题 应该是的。我在工作中被全心全意地告知,我永远不应该使用SELECT*。事实上,在我们的政策中不使用它,因为a)这意味着仅通过查看查询,使用的内容和可用的内容就存在歧义;b)由于SQL server必须找到它需要的每一列并返回它们,因此速度较慢 然而,我从来没有看到过这方面的任何证据 编辑:另外,如果在服务器上编译存储过程并使用SELECT*,当基础表结构发生更改时,假定SQL将se

可能重复:


使用SELECT*而不是SELECT FiledName、FiledName2…,是否存在性能问题

应该是的。我在工作中被全心全意地告知,我永远不应该使用SELECT*。事实上,在我们的政策中不使用它,因为a)这意味着仅通过查看查询,使用的内容和可用的内容就存在歧义;b)由于SQL server必须找到它需要的每一列并返回它们,因此速度较慢

然而,我从来没有看到过这方面的任何证据


编辑:另外,如果在服务器上编译存储过程并使用SELECT*,当基础表结构发生更改时,假定SQL将select*编译为单个列时,它不会选择回新引入的列。

唯一的性能问题是应用程序只需要
select*
返回的字段的子集。数据库中没有性能差异,因为它们实际上是相同的东西。

我不知道计算性能,但在读取/维护能力(即人的性能)方面,我们在我的商店中不使用select*。所有内容都是显式选择的。

如果指定了所有字段,则不会有任何有意义的性能差异。但是,如果您只想从一个包含十几列的表中获得几个特定字段,则速度会慢一些


SELECT*
存在可读性和可维护性问题。始终使用特定字段名是有意义的,即使您想选择所有字段。

select*被转换为select Field1、Field2。。。。等,使它们实际上是相同的东西。性能没有差别


但是,当选择字段1、字段2时,可读性和可维护性会更好。如果您需要列的子集,则会给优化器提供不好的帮助(无法为索引选择,或只能转到索引…)

某些数据库可以选择仅从索引检索数据。这是非常非常有益的,给了难以置信的加速。运行SELECT*查询不允许使用此技巧

无论如何,从应用的角度来看,这不是一个好的做法


这方面的例子:

  • 表T有20列(C1、C2、…、C19、C20)
  • 在T上有一个(C1,C2)的索引
  • 您使
    从T中选择C1,C2,其中C1=123
  • 优化器拥有索引上的所有信息,不需要转到表数据
相反,如果您
从T中选择*,其中C1=123
,则优化器需要获取所有列数据,则不能使用(C1,C2)上的索引


在多个表的联接中非常有用。

每次执行select*时,可能会有一个额外的查询来获取列列表。在高事务处理环境中,这可能会成为一种可见的开销,但偶尔一次也不会有什么不同


此外,在插入记录时,如果添加了列,请不要在插入中使用select*。

我不是DBA,但我记得从我们的DBA那里了解到,原因(至少在SQL Server中)是DB缓存算法不能很好地缓存“*”查询,但是如果您使用多次指定的精确列运行同一查询,它将很好地缓存这一点

我相信一位知识更渊博的DBA可以详细了解缓存机制的工作原理,但这就是性能受到影响的原因


注意:缓存性能仅在查询要运行多次时才起作用,特别是在很短的时间内,因此,否则您将看不到性能差异。

从技术上讲,这取决于您使用的关系数据库管理系统。我认为对性能的影响是微秒。如果你真的想从你的系统中挤出最后一点性能,我会说不要使用它们


我个人一直都在使用它。

看看这篇文章:

这些:


如果只使用字段的子集,则性能差异可能很大。请参阅以下示例,其中涉及从的检索1411771行


这甚至不是衡量对服务器性能的影响。

如果在代码中嵌入sql,则应始终使用长格式,以确保清晰,而不是性能。对于即席查询,select*语法的效率基本上不低于指定列名,除非您有大量的列,而这些列是不应该的,除非您正在反规范化


我在一个句子中使用了2个不存在项,但仍然有意义,我应该得到1分!!:)

性能,不太好。这只是有点笨拙:在一个表中,比如说,有10列,连接到另外两个或更多的表中,特别是对于大型结果集,SELECT*可以返回几十列,通常包含大部分未使用甚至无用的数据。就对DBMS的影响而言,不会有太多,但所有这些数据仍然需要以某种方式通过网络传输;网络带宽和随之而来的延迟肯定会增加。我在大容量环境中亲眼目睹了这一点。这肯定很重要


除了带宽问题外,您还可能遇到不明确的列命名问题(消除歧义通常意味着无论如何都要删除SELECT*,因此您最好从一开始就这样做),并且明确代码内部的代码需求也是一种良好的做法;这样做在很多方面都有帮助——包括调试、协作等。

SELECT*需要SQL查找所有列名,但这并不是长期以来影响最大的性能

SELECT*语句的最大性能影响是在执行需要非聚集索引进行计算的查询时。即使非聚集索引是cov
$ time sh -c "echo 'select * from IDS' | mysql cslinux >/dev/null"
real    0m5.622s
user    0m2.580s
sys     0m0.532s

$ time sh -c "echo 'select EID from IDS' | mysql cslinux >/dev/null"
real    0m4.492s
user    0m0.716s
sys     0m0.096s
SELECT x,y,z,w FROM tab WHERE id='abc' ORDER BY s

SELECT x,y,z,w FROM tab WHERE id='abc' 
AND x in ('a','b','c','d','e','f','g','h',...)
ORDER BY ('a','b','c','d','e','f','g','h',...)
SELECT field_name, field_type, field_offset, field_len
FROM internal_field_catalog
WHERE table_name = 'abc'
ORDER BY field_order