【发布时间】:2018-04-24 09:20:20
【问题描述】:
我们正在寻求改进一个 SQL WHERE 子句,该子句过滤 NULL 和仅包含空白的值,但发现很难让解决方案使用该列上的索引,从而使 sargable。
原文:
where isnull(ltrim(rtrim(ean_code)), N'') <> N''
建议:
where EAN_CODE is not null and EAN_CODE NOT IN ('', ' ', ' ', ' ', ' ', ' ')
有没有更好的解决方案?
【问题讨论】:
-
如果一个值只包含空格,那么
LEN(value) = 0和value = '',这要归功于 SQL 的一个怪癖,其中尾随空格不计算在内。您也许可以利用它来发挥自己的优势。 (如,一个简单的EAN_CODE <> ''应该足以满足所有情况。) -
@JeroenMostert 不幸的是,基于列的函数不会使用索引 - 不可分割。
-
@cloudsafe 但是
EAN_CODE <> ''会使用你的索引。 -
所以不要使用函数?就像我说的那样,您提出的解决方案包含在
WHERE EAN_CODE <> ''中,它 1) 通过与实际值进行比较来排除NULL和 2) 通过尾随空白规则和 3) 允许使用指数。请注意,如果您的大多数值不是空白(如您所料),SQL Server 可能仍然有效地只是扫描索引而不是查找它,因为查询不是选择性的,但这是另一个问题。如果这是你的问题,那么无论如何你都需要一个不同的策略。 -
@JeroenMostert 你是绝对正确的。这将节省大量时间、精力和性能。
标签: sql-server indexing sql-server-2012