【发布时间】:2021-10-20 17:28:44
【问题描述】:
我最近一直在进行一些性能优化,但对下面的查询有点卡住了。分解一下,各个步骤似乎不需要很长时间,但是当我将查询作为一个整体运行时,大约需要 30 分钟才能完成。
TABLE 有大约 100k 行,而 VIEW 有大约 400k 行,所以它们不是特别大。我不确定我是否只是没有准确理解 EXCEPT 逻辑,这是否可能是罪魁祸首?除了 EXCEPT 之外,还有其他选择吗?
编辑 - 视图本身有大约 4 个连接和一个 UNION,所以它确实有一些逻辑。
CREATE TABLE [SCHEMA].[TABLE](
ColumnA [int] IDENTITY(1,1) NOT NULL,
ColumnB [tinyint] NOT NULL,
ColumnC [tinyint] NOT NULL,
ColumnD [int] NULL,
ColumnE [nvarchar](50) NOT NULL,
ColumnF [int] NOT NULL,
ColumnG [nvarchar](250) NULL,
ColumnH [nvarchar](250) NULL,
ColumnI [nvarchar](250) NULL,
ColumnJ [nvarchar](50) NULL,
columnK [nvarchar](400) NULL,
ColumnL [nvarchar](2) NULL,
ColumnM [nvarchar](250) NULL,
ColumnN [nvarchar](3) NULL,
----
DELETE FROM [DB].[SCHEMA].[TABLE] WHERE ColumnB NOT IN (4,6)
AND ColumnG not in
(SELECT ColumnG
FROM
(
SELECT ColumnG,ColumH,ColumnI FROM [DB].[SCHEMA].[TABLE] EXCEPT
SELECT ColumnG,ColumnH,ColumnI FROM [DB].[SCHEMA].[VIEW]
WHERE VIEW.ColumnB='Active' and year(LastChgDateTime) = 9999
) AAA )
感谢您的帮助!
【问题讨论】:
-
year(LastChgDateTime)不会高效,因为它不是 SARGable。使用LastChgDateTime >= '99990101。 -
问题可能是视图中的基础查询。视图是否复杂?
-
抱歉,刚刚添加了关于视图的内容。它有大约 4 个连接和一个 UNION。不确定您是否会将其标记为复杂。
-
4 个连接和一个 UNION 肯定很复杂,您是否检查过您的 UNION 是否真的需要删除重复项?那是一种昂贵的 DISTINCT SORT,10 次中有 9 次根本不可能是骗子,他们应该使用 UNION ALL 而不必执行这些排序。
-
9999 的假日期/年份往往迟早会导致问题。
标签: sql sql-server tsql query-optimization