【发布时间】:2021-09-12 23:46:15
【问题描述】:
我有两个包含大量数据集的表,我正在尝试根据可选的搜索条件过滤数据。
Table 1 : Item
Table 2 : ScanCode
Item 可以有零个或 n 个 ScanCode,因此它们之间是一对 0 或多个关系,这就是我在 ScanCode 表上留下联接的原因,我正在尝试通过可选的 ScanCode 搜索让 Item 数据与 ScanCode 联接。
Declare @p_scanCode BIGINT = NULL, @p_limit INT = 500
SELECT TOP(@p_limit) i.ItemCode, i.StandardDescription,i.ItemType
FROM Item i
LEFT OUTER JOIN ScanCode sc
ON sc.FK_ItemCode = i.ItemCode
WHERE ((@p_scanCode IS NULL) OR (@p_scanCode IS NOT NULL AND sc.ScanCode = @p_scanCode))
ORDER BY ItemCode
上面的查询工作得很好,但由于我们有多个 ScanCode 用于一个项目,我们将在结果集中有重复,所以我更改了查询以包括 distinct。
Declare @p_scanCode BIGINT = NULL, @p_limit INT = 500
SELECT DISTINCT TOP(@p_limit) i.ItemCode, i.StandardDescription,i.ItemType
FROM Item i
LEFT OUTER JOIN ScanCode sc
ON sc.FK_ItemCode = i.ItemCode
WHERE ((@p_scanCode IS NULL) OR (@p_scanCode IS NOT NULL AND sc.ScanCode = @p_scanCode))
ORDER BY ItemCode
在查询上添加 distinct 后,现在需要 30 多秒才能获得结果,而以前需要不到 1 秒。 ScanCode 表很大,有 1200 万条数据。
我如何在没有任何性能问题的情况下根据提供的限制获得不同的顶级记录。
请提出建议。
【问题讨论】:
-
性能相关问题我们需要看执行计划。
-
缺少上下文,但听起来你有一个典型的kitchen sink search issue。而且使用没有 ORDER BY 子句的 TOP 通常是一个逻辑缺陷。
-
请通过brentozar.com/pastetheplan分享执行计划
-
@SM或者谢谢你,你给我的厨房水槽搜索帮助了我
标签: sql sql-server tsql sql-server-2012