案例1:我有一个包含30列的表,我使用where子句中的4列进行查询。
案例2:我有一个包含6列的表,我在where子句中使用4列进行查询。
两种情况下的表现有何不同?
例如我有桌子
table A
{
b varchar(10),
c varchar(10),
d varchar(10),
e varchar(10),
f varchar(10),
g varchar(10),
h varchar(10)
}
SELECT b,c,d
FROM A
WHERE f='foo'
create table B
{
b varchar(10),
c varchar(10),
d varchar(10),
e varchar(10),
f varchar(10)
}
SELECT b,c,d
FROM B
WHERE f='foo'
A和B表具有相同的结构意味着在where条件也相同且列中的列也相同时使用的列数和列数的差异。区别在于表B只有一些未使用的列,这些列未在select和where条件中使用 在这种情况下,两个查询的性能是否存在差异?
答案 0 :(得分:11)
表中的总列数是否会影响性能(如果选择了相同的列子集,并且表中没有索引)
是,根本没有索引,两个查询(表A和表B)都将执行表扫描。鉴于Table B
的列数少于Table A
,每页的行数(密度)会在B
上更高,因此B
会略微加快,因为需要的页数更少取出。
但是,鉴于您的查询形式为:
SELECT b,c,d
FROM X
WHERE f='foo';
查询的性能将由列f
上的索引主导,而不是基础表中的列数。
对于这个确切的查询,最快的性能将来自以下索引:
A(f) INCLUDE (b,c,d)
B(f) INCLUDE (b,c,d)
在这两种情况下,两个查询的性能应该相同(假设两个表中都有相同的数据),因为SQL会命中现在具有相似列宽和行密度的索引,而不需要原始表中的任何其他数据
select中的列数是否影响查询性能?
在SELECT
中返回较少列的主要好处是SQL可能能够避免从表/群集中读取,而是,如果它可以检索所有selected
1}}来自索引的数据(在covering index的情况下,作为索引列和/或包含的列)。
显然,谓词中使用的列(过滤器),即示例中的f
,必须位于索引的索引列中,并且必须足够{{ 3}},以便首先使用索引。
从SELECT
返回较少的列时,还有次要优势,因为这会减少任何I / O开销,尤其是在数据库服务器和消费数据的应用程序 - 即最好只返回您实际需要的列,并避免使用SELECT *
。
修改
其他一些计划:
B(f)
上的索引,没有其他键或INCLUDE
列,或者INCLUDE
列不完整(即b, c or d
中的一个或多个列丢失):< / LI>
SQL Server可能需要执行selective Key or RID,因为即使使用了索引,也需要“连接”回表以检索select中缺少的列条款。 (查找类型取决于表是否具有聚簇PK)
B(f,b,c,d)
这仍然非常高效,因为将使用索引并避免使用表,但是Lookup,因为索引树的密度将因索引中的其他键列而减少。
答案 1 :(得分:4)
除非你有一个非常宽的列集差异而没有使用索引(因此是一个表扫描),你应该看到性能上的差异很小。话虽如此,为了满足您的需求,返回尽可能少的列总是有用/有益的。这里的问题是,通过返回所需的列而不是为其他列提取第二个数据库,可以获得更大的好处。
答案 2 :(得分:4)
测试并查看!
会有性能差异,但99%的时间你都不会注意到它 - 通常你甚至无法检测到它!
你甚至不能保证列数较少的表会更快 - 如果它困扰你那么试试看看。
技术垃圾:(从Microsoft SQL Server的角度来看)
假设在所有其他方面(索引,行数,6个公共列中包含的数据等等)表是相同的,那么唯一真正的区别是较大的表分布在更多磁盘/内存中的页面。
SQL服务器只尝试读取它绝对需要的数据,但它总是一次加载整个页面(8 KB)。即使具有完全相同的数量,也需要数据作为查询的输出,如果该数据分布在更多页面上,则需要更多IO。
也就是说,SQL服务器的数据访问效率极高,因此除极端情况外,您不太可能看到对性能的显着影响。
此外,您的查询也可能会针对索引而不是表格运行,因此,如果索引的大小完全相同,则更改可能 0 。
答案 3 :(得分:2)
根据列位置不会有性能差异。现在桌子的构造是一个不同的故事,例如行数,索引,列数等。
您所谈论的场景比较两个表中列的位置,就像几乎将苹果与橙子进行比较一样,因为除了列位置之外还有很多不同的变量。
答案 4 :(得分:1)
取决于表的宽度(每行的字节数),表中的行数以及查询使用的列是否有索引。没有这些信息,没有明确的答案。但是,表中的列越多,它的可能性就越大。但是适当指数的影响比表格大小的影响要大得多。
答案 5 :(得分:0)
自从您指定使用WHERE子句以来,它取决于返回的行数。如果您的WHERE子句中的值为UNIQUE或PRIMARY KEY,则几乎不存在差异。 您可以在SELECT语句前面使用EXPLAIN ANALYZE来查看计划时间和执行时间值,然后可以比较查询。