1

我希望提高从表中选择多个列的查询的性能。想知道限制列数是否会对查询的性能产生任何影响。

4

6 回答 6

6

我认为,减少列数对查询速度的影响非常有限,但对数据传输速度的影响可能更大。您选择的数据越少,需要通过网络传输到您的应用程序的数据就越少。

于 2010-02-03T18:34:32.353 回答
6

我可能误解了这个问题,但无论如何:

您选择的绝对列并没有太大的区别。但是,您选择列可能会产生显着差异,具体取决于表的索引方式。

如果您只选择索引覆盖的列,那么数据库引擎可以只使用索引进行查询,而无需获取表数据。但是,如果您甚至使用未涵盖的一列,它必须获取整行(键查找),这将显着降低性能。有时它会严重影响性能,以至于数据库引擎选择进行完整扫描而不是打扰索引;这取决于选择的行数。

因此,如果通过删除列可以将其转换为覆盖查询,那么是的,它可以提高性能。否则,可能不会。反正不明显。

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)

然后第二个查询再次变得很快,因为数据库引擎永远不需要读取该行。

于 2010-02-03T18:38:44.430 回答
1

限制列数对查询没有可衡量的影响。几乎普遍地,一整行被提取到缓存中。投影在 SQL 管道中最后发生。

处理的投影部分必须最后发生(例如,在 GROUP BY 之后),因为它可能涉及创建聚合。此外,JOIN、WHERE 和 ORDER BY 处理可能需要许多列。比结果集中最终返回的列多。几乎不值得在查询计划中添加一个步骤来进行预测以某种方式节省一点 I/O。

检查您的查询计划文档。查询计划中没有“项目”节点。这是制定结果集的一小部分。

要摆脱“整行提取”,您必须使用柱状(“倒置”)数据库。

于 2010-02-03T18:33:59.407 回答
0

为了演示 tvanfosson 已经编写的内容,即存在“转移”成本,我从查询分析器在 MSSQL 2000 DB 上运行了以下两条语句。

从系统评论中选择数据长度(文本)

从系统评论中选择文本

两个结果都返回了 947 行,但第一个用了 5 毫秒,第二个用了 973 毫秒。

另外因为字段是相同的,我不希望索引在这里考虑。

于 2010-02-03T19:28:19.890 回答
0

它可以取决于您正在处理的服务器(对于 MySQL,还取决于存储引擎)。例如,至少有一个 MySQL 存储引擎执行按列存储而不是按行存储,在这种情况下,更多的列确实需要更多的时间。

另一种主要可能性是,如果您对表进行了分段,以便将某些列存储在一台服务器上,而将其他列存储在另一台服务器上(也称为垂直分区)。在这种情况下,检索更多列可能涉及从不同服务器检索数据,并且负载总是可能不平衡,因此不同服务器具有不同的响应时间。当然,您通常会尝试使负载保持合理平衡,因此这应该是相当不寻常的,但它仍然是可能的(例如,如果其中一台服务器处理一些其他数据,其使用可能独立于其他数据)。

于 2010-02-03T18:39:43.183 回答
0

是的,如果您的查询可以被非聚集索引覆盖,它会更快,因为所有数据都已经在索引中并且基表(如果你有一个堆)或聚集索引不需要被优化器触及

于 2010-02-03T18:42:45.797 回答