SQL投影成本

时间:2013-05-30 12:55:16

标签: sql

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

我一直在查看以下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 *操作更快(更快)运行。

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

这允许您指定索引中包含的列,您将在选择中使用很多。不是实际的连接或过滤列,而是显示或计算中使用的其他列。

现在,如果你有一张桌子,可以说TABLE_AA-Z,列A,B,C上有一个INDEX,列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

查询引擎很容易识别出有问题的行,但仍需要进行查找以检索索引中未包含的列。

答案 1 :(得分:0)

这是正常的,因为Sql引擎正在获取要选择的所有19列,即使在条件中没有使用,在查询1中你只有7列和条件可以随身携带。