我有一个连接两个未编制索引的表的查询,性能很差.因为我连接的是来自不同来源的电话号码,所以我在连接条件上使用Right(),并通过每个表上的子查询进行一些字符串操作. 在这种情况下,索引是否有助于提高性能?下面的示例

WITH ds_One AS (
  SELECT REPLACE(PhoneNumber,'+44', '0') AS PhoneNumber
  FROM PhoneNumbers
)

,ds_Two AS (
    SELECT REPLACE(PhoneNumber,'+44', '0') AS PhoneNumber
    ,CustomerName
    FROM PhoneNumbers2
)

SELECT two.CustomerName
FROM ds_Two two
INNER JOIN ds_One one
ON RIGHT(one.PhoneNumber,10) = RIGHT(two.PhoneNumber,10)

推荐答案

不是的.在这里,PhoneNumber上的索引对您没有帮助.

这是不可磨灭的.

如果它使用的是LEFT而不是RIGHT(并且没有初始的REPLACE),则可以通过将联接条件表示为LIKE来使其具有一定的sargable(在其中一个表上),但这在这里不适用.

您可能会在两个表中的表达式RIGHT(REPLACE(PhoneNumber,'+44', '0'),10)上创建一个计算列,然后对该列进行索引(INCLUDE-ing CustomerNamePhoneNumbers2上的索引中),并对该列进行联接.

但是,如果这只是一次性任务,这可能根本没有多大帮助(就总体执行时间而言,包括创建索引所用的时间).

Sql相关问答推荐

当有空单元格时,如何连接列

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

使用占位符向SQL INSERT查询添加 case

删除事务中的本地临时表

为什么我的SQL标量函数有时会抛出";子查询返回多个值.这是不允许的.

仅在日期相隔时递增(Oracle SQL)

从类似JSON的字符串列创建新列

PostgreSQL:查找继承表中的特定记录属于哪个表

此过程如何在不引用传递的参数值的情况下执行工作?

使用特定的Order By子句随机化SQL输出

SQL SUM Filter逻辑解释

将空 JSON 数组添加到 SQL Server 表列中的 JSON 字符串

如何在TSQL中编写此窗口查询

在where语句中使用CTE非常缓慢

如何显示最常引用条目的详细信息

如何计算每行出现的次数并显示在另一个表中?

如何找到特定时间间隔内的最大和最小日期?

将单行中的多个行值转换为列

ACCESS SQL - 有没有办法使用通配符仅 Select 字段的特定部分?

postgreSQL 中的循环表