慢速插入:select 从视图

Slow insert: select from view

以下语句至少需要 4 秒:

INSERT INTO [SomeSmallTable] 
SELECT * FROM ComplexView 
WHERE [Date] = convert(datetime, '23/09/2020',103)

但是,如果我们只 运行 SELECT 部分而没有 INSERT INTO,它只需要不到半秒的时间:

SELECT * 
FROM ComplexView 
WHERE [Date] = convert(datetime, '23/09/2020',103)

视图选择了不到 200 行,名为“SomeSmallTable”的 table 仅包含几行。我认为这个问题是在我们更新名为“ComplexView”的视图时开始的。 ComplexView 是基于其他视图的(其中一些视图是基于其他视图本身的),还有一些 tables.

我尝试使用 sp_refreshview 刷新所有视图,但没有成功。

我们如何确定此问题的原因并希望解决它?


[编辑]

我对一些评论的回复:

正如其他人所说,检查执行计划是第一步。鉴于 INSERT(而不是查询)导致了延迟,您可以进一步排除故障。以下是您可以尝试的一些方法:

  • 尝试使用 Statistics IO 了解更多信息,如回答here
  • 尝试使用静态数据(例如 INSERT INTO [SomeSmallTable] VALUES (1, 2, '...etc');INSERT。这将告诉您问题是否出在任何 INSERT 语句上,或者是在具体从视图插入时。
  • 检查视图返回了多少数据。 4s 可能合理也可能不合理,具体取决于插入的行数。
  • 检查 table 设计,了解它如何使用主键、外键、复合键、索引、触发器等。其中一些功能优化了 table 的选择设计, 但作为 trade-off 使插入变慢。 here.
  • 可以找到一个很好的答案
  • 如果您知道这不是负载问题(因为您是唯一使用此数据库的人),请检查是否有其他因素限制了您正在使用的机器上的资源(其他 resource-intensive 任务,同时发生的任何其他查询,SQL 服务器中的计划作业等)您可以使用 SQL Server Profiler 实时查看查询。
  • 如果性能低下不仅限于此特定查询,那么还有其他一般性的 design considerations 您可以查看。