我希望提高从表中选择多个列的查询的性能。我想知道限制列数是否会对查询的性能产生任何影响。
答案 0 :(得分:4)
我认为减少列数对查询速度的影响非常有限,但会对数据的传输速度产生更大的影响。您选择的数据越少,需要通过线路传输到您的应用程序的数据就越少。
答案 1 :(得分:4)
我可能会误解这个问题,但无论如何都会这样:
您选择的列的绝对数字并没有太大的区别。但是,您选择的哪些列可能会产生显着差异,具体取决于表的索引方式。
如果您只选择索引所涵盖的列,则数据库引擎只能使用查询索引而无需获取表数据。但是,如果你甚至使用一个未覆盖的列,它必须获取整行(键查找),这将显着降低性能。有时它会扼杀性能,以至于数据库引擎选择进行全扫描而不是甚至打扰索引;它取决于所选择的行数。
因此,如果通过删除列,您可以将其转换为覆盖查询,那么是的,它可以提高性能。否则,可能不是。无论如何都不明显。
SQL Server 2005+的快速示例 - 假设这是您的表:
ID int NOT NULL IDENTITY PRIMARY KEY CLUSTERED,
Name varchar(50) NOT NULL,
Status tinyint NOT NULL
如果我们创建这个索引:
CREATE INDEX IX_MyTable
ON MyTable (Name)
然后这个查询会很快:
SELECT ID
FROM MyTable
WHERE Name = 'Aaron'
但是这个查询会很慢(呃):
SELECT ID, Name, Status
FROM MyTable
WHERE Name = 'Aaron'
如果我们将索引更改为覆盖索引,即
CREATE INDEX IX_MyTable
ON MyTable (Name)
INCLUDE (Status)
然后第二个查询再次变快,因为数据库引擎永远不需要读取该行。
答案 2 :(得分:1)
限制列数对查询没有可测量的影响。几乎普遍地,整个行被提取到缓存。投影最后发生在SQL管道中。
处理的投影部分必须最后发生(例如,在GROUP BY之后),因为它可能涉及创建聚合。此外,JOIN,WHERE和ORDER BY处理可能需要许多列。比结果集中最终返回的列数多。很难在查询计划中添加一个步骤,以某种方式进行投影以节省一点I / O.
检查您的查询计划文档。查询计划中没有“项目”节点。这是制定结果集的一小部分。
要远离“整行获取”,您必须使用柱状(“倒置”)数据库。
答案 3 :(得分:0)
它可能取决于您正在处理的服务器(在MySQL的情况下,还取决于存储引擎)。例如,至少有一个MySQL存储引擎可以进行列式存储而不是行式存储,在这种情况下,更多列可能需要更多时间。
另一个主要的可能性是,如果您对表进行了分段,那么有些列存储在一个服务器上,而其他列存储在另一个服务器上(也就是垂直分区)。在这种情况下,检索更多列可能涉及从不同服务器检索数据,并且总是可能负载不平衡,因此不同的服务器具有不同的响应时间。当然,您通常会尝试保持负载合理平衡,这应该是相当不寻常的,但它仍然是可能的(例如,如果其中一个服务器处理其他数据,其使用可能与其他数据无关),尤其如此。 / p>
答案 4 :(得分:0)
是的,如果您的查询可以被非聚集索引覆盖,那么它将更快,因为所有数据已经在索引中,并且基表(如果您有堆)或聚簇索引不需要被触及优化器
答案 5 :(得分:0)
为了演示tvanfosson已经编写了什么,有一个“转移”成本我在查询分析器的MSSQL 2000 DB上运行了以下两个语句。
SELECT datalength(text)FROM syscomments
从syscomments中选择文本
两个结果都返回了947行,但第一行为5毫秒,第二行为973毫秒。
另外因为字段是相同的,我不希望索引在这里考虑因素。