从SQL表中选择所有列是否昂贵?

时间:2013-05-03 08:35:21

标签: sql select

与指定要检索的列相比,从SQL表中选择所有列是否昂贵?

SELECT * FROM table

VS

SELECT col1, col2, col3 FROM table

可能有用的是要知道我查询的一些表有超过100列。

4 个答案:

答案 0 :(得分:4)

可能。这取决于表中定义的索引。

如果col1,col2,col3上存在非聚集索引,则该索引可用于满足查询(因为它比表本身更窄,无论是堆还是聚簇索引),这会导致更低I / O成本。

通常,它也是首选,以便您可以确定哪些查询使用表中的特定列。

如果表没有索引,或者只有一个聚簇索引,或者没有覆盖特定查询的索引,那么无论如何都必须访问堆/聚簇索引的每个页面。即便如此,如果您有任何行外数据(例如较大的varchar(max)),那么,如果您未在SELECT中包含该列,则可以避免 I / O成本。

答案 1 :(得分:1)

在这种情况下,

性能取决于查询中索引的正确使用。

如果您的数据库已正确规范化并且您已在where子句中使用了索引,那么确保性能会更好。

例如

select * from tableName where id=232

此处使用索引。

您可以参考以下链接:

Performance issue in using SELECT *?

What is the reason not to use select *?

答案 2 :(得分:1)

让我们把它分成主要问题:

实际的数据库/应用程序:如何键入查询可能会更改SQL应用程序实际优化查询的方式,从何处获取数据等等。然后,它可能不会。这里很难概括,取决于数据库应用程序和设置。

程序员资源:使用*而不是输入内容对您来说更容易,更快捷。好极了!如果"暗示"命令背后的字面意思是"得到所有东西",也许它是一个很好的程序员通信使用*而不是手动列出所有列。作为程序员阅读代码后,被列入数百个列名列表是一种不愉快的经历。另一方面,手动列出内容可能会发出一些信号,表明您有特殊原因要求提供这些专栏。它不是一个强烈的信号,但它仍然是一个信号。

其他资源/ IO /内存等:现在,如果您实际上并不需要所有100列,而您因为懒惰而要查询它们,那么我们会进入更远的灰色区域。加载的数据库是什么?查询结果在哪里?这些东西的读/写速度有多快?你真的想用所有的列做到这一点吗?在处理查询时将使用多少内存或资源?它会使用索引吗?是否已编入索引?在这个阶段你甚至需要关心优化吗?

所以它的长短是一个灰色区域......

答案 3 :(得分:0)

通常,您应该只选择查询所需的列。

有时,选择稍后在存储过程中使用的查询的所有列将不会因执行计划如何优化整个存储过程而产生任何差异。列上的索引也会生效。