Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 投影数对查询性能的影响_Sql_Performance_Database_Query Performance - Fatal编程技术网

Sql 投影数对查询性能的影响

Sql 投影数对查询性能的影响,sql,performance,database,query-performance,Sql,Performance,Database,Query Performance,我希望提高从表中选择多个列的查询的性能。我想知道限制列数是否会对查询的性能产生任何影响。限制列数对查询没有可测量的影响。几乎所有情况下,都会将整行提取到缓存中。投影在SQL管道中最后发生 处理的投影部分必须最后发生(例如,在GROUP BY之后),因为它可能涉及创建聚合。此外,JOIN、WHERE和ORDER BY处理可能需要许多列。结果集中最终返回的列数大于。在查询计划中添加一个步骤来进行预测以节省一点I/O几乎不值得 检查您的查询计划文档。查询计划中没有“项目”节点。这只是制定结果集的一小部

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

限制列数对查询没有可测量的影响。几乎所有情况下,都会将整行提取到缓存中。投影在SQL管道中最后发生

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

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


要摆脱“整行获取”,您必须使用柱状(“反转”)数据库

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

我可能误解了这个问题,但还是这样:

您选择的列的绝对数量不会产生很大的差异。但是,根据表的索引方式,选择哪些列可能会产生显著差异

如果只选择索引包含的列,则DB引擎可以仅使用索引进行查询,而不必获取表数据。但是,如果使用一个未包含的列,它必须获取整行(键查找),这将显著降低性能。有时,它会极大地降低性能,以至于数据库引擎选择进行全扫描,而不必费心处理索引;它取决于所选的行数

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

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'
但是这个查询会很慢(呃):

如果我们将索引更改为覆盖索引,即

CREATE INDEX IX_MyTable
ON MyTable (Name)
INCLUDE (Status)

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

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


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

是,如果您的查询可以由非聚集索引覆盖,则会更快,因为所有数据都已在索引中,并且优化器无需触及基表(如果您有堆)或聚集索引来演示tvanfosson已经编写的内容,即存在“传输”我从查询分析器在MSSQL 2000 DB上运行了以下两条语句

从syscomments中选择datalength(文本)

从syscomments中选择文本

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


此外,由于字段相同,我不希望在此处使用索引。

+1用于显示代码和添加索引,以显示使用可变长度数据类型返回尾随列如何会导致搜索开销
CREATE INDEX IX_MyTable
ON MyTable (Name)
INCLUDE (Status)