【发布时间】:2018-12-27 09:32:34
【问题描述】:
我已经在网上寻找答案,但找不到明确的答案。例如,您有 2 个连接子句:
1.
JOIN T2 ON T1.[ID] = T2.[ID]
2.
JOIN T2 ON T1.[ID] = REPLACE(T2.[ID],'A', '')
由于连接子句中的功能,现在第二个性能更差。这究竟是什么原因?
例如,如果这段代码在一个存储过程中,那么优化它的最佳方法是什么?要删除替换功能并将其添加到表级别,以便在任何连接之前完成所有这些操作?
任何建议或更多信息的链接都会很棒。谢谢
【问题讨论】:
-
第二个
JOIN的参数不是sargable。该词不在字典中,但它是您要用于调查此问题的关键词。 -
当您将函数应用于 WHERE 子句中的连接参数或字段时,服务器不能在该字段上使用任何索引。索引是使用字段的值创建的,而查询想要使用 不同的 值。为了生成这些值,服务器必须扫描整个表
-
顺便说一句,为什么 ID 会包含需要替换的任何内容?也许是两个领域冒充一个?糟糕的设计 - 键不应该具有可以或需要更改的商业意义
-
停留在第一个连接上并添加一个条件以排除 t2 'A' 记录。然后使用所有 t2 'a' 行联合选择并直接再次加入 - 请参阅下面我的答案
标签: sql sql-server join optimization