0

我有两个表 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 *操作运行得更快(快得多)。

谢谢。

4

2 回答 2

1

您必须记住 usingSELECT *返回表中的所有列。

这意味着数据库引擎需要读取所有列和所有行,对于您的表 A 来说,这要多得多。此外,需要传输此数据。所以也可能有很多网络流量。

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

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

现在,如果您有一个表,可以说TABLE_A带有 columns ,在包含列的列A-Z上有一个 INDEXA,B,CD,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

查询引擎将能够轻松识别有问题的行,但仍需要进行查找以检索未包含在索引中的列。

于 2013-05-30T12:58:21.200 回答
0

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

于 2013-05-30T12:59:39.763 回答