为什么select count(*)选择*更快,即使表没有索引?

Dee*_*hra 1 sql t-sql sql-server-2008

有没有采取时间之间的任何diffrence Select *Select count(*)具有在SQL Server 2008 R2没有主键等指标表?

我试过select count(*)一个视图,它已经拍摄了00:05:41的410063922记录. Select (*)来自视图的前600000条记录已经花了10分钟,查询仍然在运行.所以它看起来需要1个多小时.

有没有什么方法可以让我更快地创建这个视图而不改变底层表的结构?

我可以为没有索引的表创建索引视图吗?

我是否可以在sql server中使用缓存,因此如果再次调用它,则需要的时间更少?

它是一个仅包含一个表中20列的视图.该表没有任何索引.用户可以查询该视图.我不确定用户是否确实选择了*或从视图中选择了某些条件.我唯一想做的就是建议他们进行一些更改,通过这些更改,他们对视图的查询将更快地返回结果.我正在考虑索引和缓存,但我不确定它们是否可能在没有索引的表的视图上.如其中一个答案所述,此处无法建立索引.

任何人都可以对sql server 2008 R2中的缓存有所了解吗?

Han*_*nky 5

count(*)只返回一个数字并select *返回所有数据.想象一下,必须移动所有数据以及成千上万条记录所需的时间.即使您的表可能已编入索引,运行select *在您的数十万条记录上仍然会花费大量时间,即使比以前更少,并且首先应该永远不需要.

我可以为没有索引的表创建索引视图吗?

不,您必须为索引结果添​​加索引

我是否可以在sql server中使用缓存,因此如果再次调用它,则需要的时间更少?

是的,你可以,但它没有用于这样的要求.你为什么一开始就选择这么多唱片?您永远不必在任何查询中返回数百万或数千行完整数据.

编辑

事实上,你试图获得数十亿行而没有任何where子句.这肯定会在任何你可以推迟的服务器上失败,所以最好停在那里:)

TL; DR

索引与SELECT * FROM myTABLE查询无关,因为没有条件和数十亿行.除非您更改查询,否则任何优化都无法帮助您