慢速插入: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
刷新所有视图,但没有成功。
我们如何确定此问题的原因并希望解决它?
[编辑]
我对一些评论的回复:
@Dale K:我不能 post 执行计划,我认为它们太复杂了,而且不相关,因为它们对于两个语句都是相等的,有或没有 INSERT部分,除了 Table Insert 部分。但我确实看到 INSERT 花费了 100%。出于某种原因 SQL 在 table.
中插入视图结果时遇到问题
@Panagiotis Kanavos:除了我,没有人在使用数据库。它是我们客户数据库的副本,我正在我的本地机器上处理它。
@gotqn:SomeSmallTable 是一个 table,所以没有 table 变量或临时 table。但是,当用户在我们的应用程序中打开特定表单时创建它,并在用户关闭此表单时删除它。
@Arvo: SomeSmallTable 没有键也没有触发器。在此 table 中插入的视图 returns 少于 200 行,并且在插入这些之前 table 是空的。
我按照接受的答案中的步骤进行操作,最终将当前的“ComplexView”与以前的版本进行了比较,找出了导致此问题的原因。
正如其他人所说,检查执行计划是第一步。鉴于 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 您可以查看。
以下语句至少需要 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
刷新所有视图,但没有成功。
我们如何确定此问题的原因并希望解决它?
[编辑]
我对一些评论的回复:
@Dale K:我不能 post 执行计划,我认为它们太复杂了,而且不相关,因为它们对于两个语句都是相等的,有或没有 INSERT部分,除了 Table Insert 部分。但我确实看到 INSERT 花费了 100%。出于某种原因 SQL 在 table.
中插入视图结果时遇到问题@Panagiotis Kanavos:除了我,没有人在使用数据库。它是我们客户数据库的副本,我正在我的本地机器上处理它。
@gotqn:SomeSmallTable 是一个 table,所以没有 table 变量或临时 table。但是,当用户在我们的应用程序中打开特定表单时创建它,并在用户关闭此表单时删除它。
@Arvo: SomeSmallTable 没有键也没有触发器。在此 table 中插入的视图 returns 少于 200 行,并且在插入这些之前 table 是空的。
我按照接受的答案中的步骤进行操作,最终将当前的“ComplexView”与以前的版本进行了比较,找出了导致此问题的原因。
正如其他人所说,检查执行计划是第一步。鉴于 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 您可以查看。