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