我有两个表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 *
操作更快(更快)运行。
感谢。
答案 0 :(得分:1)
您必须记住,使用SELECT *
会返回表格中的所有列。
这意味着数据库引擎需要读取所有列和所有行,这在表A的情况下要多得多。此外,这些数据需要转移。所以也可能有很多网络流量。
例如,在SQL Server中,您可以使用包含的列创建索引(与索引一起存储的列,但不会影响索引本身)。
这允许您指定索引中包含的列,您将在选择中使用很多。不是实际的连接或过滤列,而是显示或计算中使用的其他列。
现在,如果你有一张桌子,可以说TABLE_A
列A-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列和条件可以随身携带。