从视图中选择 int 列很慢
Posted
技术标签:
【中文标题】从视图中选择 int 列很慢【英文标题】:select on int column from view is slow 【发布时间】:2015-09-15 15:34:06 【问题描述】:因此,对于一组表,我试图为学生获取 personIds,这是一个缓慢的查询(约 30 秒),因此为了加快速度,我试图对此做出看法。
这个问题是关于视图的。我有一个包含 1 个 int 列和 ~1,000,000 行的视图。
一个简单的:SELECT [PersonId] FROM [yoda_lat].[dbo].[person_view]
仍然需要大约 25 秒才能完成。我将建议将此结果缓存给为此数据库开发的人员,但我想知道我还能做些什么来加快速度。
创建视图后,构建视图的查询就不再重要了,是吗?我看到了有关为更复杂的选择添加索引的内容,但我实际上是在尝试获取该视图唯一列的单个列的每个值。
【问题讨论】:
你的基表有索引吗?就算是集群上的PK?如果不是,则每次查询都会扫描此表。即使只有一列,也需要扫描一百万行。 您可以在表上应用索引,如果您知道哪些列被大量使用,那么这将加快数据检索。但是,这会减慢对表的插入或更新。因此,在实施之前,您应该权衡差异,看看是否值得。 ***.com/questions/2955459/what-is-an-index-in-sql 对于这样一个简单的查询,索引将无济于事,因为您正在进行表扫描(即读取每条记录)。创建视图肯定无济于事。您真的需要检索每条记录吗? “为了加快速度,我试图对此做出看法。”通常,视图只是代码。将查询放在视图中不会使查询更快,就像将循环移动到子过程会使循环运行更快一样。有物化视图存储(缓存)视图的结果以加快速度。在 SQL Server 中,物化视图称为索引视图。 @TheDumbRadish 我对你最初的陈述有点困惑。扫描适用于小数据集,搜索适用于大数据集。查询的复杂性无关紧要,只有返回的数据大小无关紧要。无论查询返回 1 列还是 20 列,上百万条记录的索引几乎总是比扫描表快。 【参考方案1】:除非您从表中复制数据,否则执行将返回 100 万行的 SELECT 是没有意义的
不带 WHERE 子句的 SELECT 将读取数据库表的所有数据页。这是 FULLSCAN,我们尽量避免这种类型的执行
实际上,您需要根据某些标准过滤数据。您可以在此表字段上创建索引。这将提高您的查询性能。
【讨论】:
以上是关于从视图中选择 int 列很慢的主要内容,如果未能解决你的问题,请参考以下文章
预加载 UIViewController 失败--转换仍然很慢