2013-05-30 40 views
0

我有两个表A和B.这些表通过A.bid = B.id.链接。表A有19列,表B有10列。两张表都包含大约40,000条记录。SQL投影成本

我一直在寻找在以下3个简单的查询:

-- Query 1 
SELECT Col1, Col2, Col3, Col4, Col5 FROM A, B 
WHERE A.bid = B.id 

-- Query 2 
SELECT * FROM A 

-- Query 3 
SELECT Col1 FROM A 

我发现有趣的是,查询2采用目前为止最长的运行,接着是查询1(加入)并以最快的被查询3(一个更严格的预测)。所有3个查询返回相同的行数。

是什么导致了这种行为?为什么投影中的列数对性能有如此大的影响?当然,我明白投影并不是免费的,但我不明白加入的方式(尽管投影更加有限)可以比简单的SELECT *运行更快(速度更快)。

谢谢。

回答

1

您必须记住,使用SELECT *会返回表中的所有列。

这意味着数据库引擎需要读取所有列和所有行,这在您的表A的情况下更多。此外,这些数据需要转移。所以可能还有很多网络流量。

在SQL Server中,例如,您可以创建包含列的索引(与索引一起存储但不影响索引本身的列)。

这使您可以指定在您的选择中您将使用的索引中包含的列。不是实际的连接或过滤列,而是显示或计算中使用的附加列。

现在,如果你有一个表,让说TABLE_AA-Z列,在A,B,C列的索引与包括列D,E,F

查询

SELECT A,B,C,D,E,F 
FROM TABLE_A 
WHERE A = ?A 
AND B = ?B 
AND C = ?C 

将能够使用这样的指数。

现在,如果你运行该查询

SELECT * 
FROM TABLE_A 
WHERE A = ?A 
AND B = ?B 
AND C = ?C 

查询引擎将能够轻松地识别有问题的行,但仍然需要做一个查询检索不包含在索引中的列。

+0

我想我估计额外的读取/网络流量的成本。我非常关注联盟中关键比较的成本,以致我看到了这些额外成本。谢谢。 –

0

这很正常,因为Sql引擎正在取所有19列进行选择,即使没有在条件中使用,在Query 1中你只有7列和条件来进行。