2009-04-08 40 views

回答

1

是;列发现过程仍然必须发生。 “select *”决不能用于生产应用程序或流程。您应该始终明确定义您要检索的特定数据。

1

我敢打赌,在这两种情况下,时间都是可以忽略的;但是,您应该避免选择*因其他原因。

使用select *可以返回更多的数据,那么您可能实际需要哪些数据,这取决于数据可能很重要。那么如果你删除了一列,那么你的查询可能仍然有效;但是,使用代码可能会失败。您确实无法确定somone是否在使用该列。

6

时间微乎其微。是的,如果它适用于表格,它适用于视图。

但是在做SQL的12年中,我还没有看到通过显式命名列来加速查询,而不是使用*

在生产代码,我不使用*,但这是使代码的意思是说,没有效率的原因,因为为了能够决定的事情结合的结果,当设定

在生产观,我如果视图的意图(如果“我的意思是说”)是“引入所有列”,那么将使用*;这样,重新编译一个视图将会选择表格变化。在视图中顺序无关紧要;只在客户端查询,可能使用的视图。

关于编辑:让我注意一个视图定义被解析一次(直到它被重新编译),当视图是创建,而不是当它被使用。因此,从*column1, c2, d3, foobar的一小部分时间发生一次,在create view发送到数据库服务器时。

现在,将所有列带回到客户端将比仅回收一个(尽管通常不会太多)慢。但这是一个不同的问题。

3

没有区别的查询计划的条款,但明确定义列被认为是有许多原因的良好做法,其中包括:

  • 将列于表不会打破依赖于旧代码旧的列设置。
  • 从不需要的列中选择数据意味着更多的数据传输,这通常是从数据库获取数据的最慢部分。
2

想象一下,你有一个像这样的表:

CREATE TABLE t_test (id INT NOT NULL PRIMARY KEY, value1 INT, value2 INT, aux_value VARCHAR(200)) 
CREATE INDEX ix_test_values ON (value1, value2) 

然后要选择一定范围内的所有值:

SELECT value1, value2 
FROM t_test 
WHERE value1 BETWEEN 10 AND 20 

在这种情况下,SQL Server只会扫描索引ix_test_values。你想知道的一切都包含在这个索引中,这就是为什么只有是必需的。

现在您发出:

SELECT * 
FROM t_test 
WHERE value1 BETWEEN 10 AND 20 

SQL Server现在需要选择具有value1value2沿idaux_value。这些值不包含在索引中,这就是为什么对于每个索引叶SQL Server应该查看表本身并从表页中检索值。

这可能需要比简单索引扫描长410倍,具体取决于表结构的复杂程度以及有多少页适合内存。

2

我一直在使用“SELECT *”将增加 到时间的SQL Server听说才能建立 查询执行计划,因为它有 找出哪些列上存在 引用的表。

想一想。什么是SQL Server执行,当您发送:

SELECT ID, col1, col2, col3 
    FROM table 

上述声明意味着它不会检查,看看是否ID,COL1,COL2等存在于表中 - 它只会相信你的话它?天哪不! :D

它将查看系统目录以查看这些列是否存在。事情,而在内部,几乎是相同的说法:

SELECT * FROM table 

有充足的理由不使用 SELECT *(他们已经在这个名单至今,一直枚举),但声称这增加了可衡量的,有意义的查询解析时间的开销是非常愚蠢的。所以如果有人试图告诉你,请纠正它们:)

相关问题