从视图中选择 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 列很慢的主要内容,如果未能解决你的问题,请参考以下文章

允许 null 的 ORDER BY 列很慢。为啥?

MySQL视图查询超慢,求解答

MySQL视图查询超慢,求解答

预加载 UIViewController 失败--转换仍然很慢

oracle 修改表结构或修改视图时很慢,直接让PLSQL卡死,不知道是啥原因? 重启oracle 服务却又可以了!

选择多行时QTableView变得很慢