【问题标题】:fastest way to compare two columns with different data types比较具有不同数据类型的两列的最快方法
【发布时间】:2016-10-14 13:21:18
【问题描述】:

我有两个表需要通过链接服务器加入,但我现在遇到的源数据有问题。

我需要加入的列名分别是account_numbermember_number

我的问题是 account_numbervarchar(10) 并且总是用前导零填充,但 member_numbervarchar(12) (不要问为什么,最后两个从未使用过)但没有填充带前导零。

如果我们说account_numberA中,member_numberB中,我想出了以下解决方案:

SELECT * FROM 
  A INNER JOIN B 
  ON CAST(A.account_number AS BIGINT) = CAST(B.member_number AS BIGINT)

SELECT * FROM 
  A INNER JOIN B 
  ON A.account_number = RIGHT('0000000000'+B.member_number, 10)

问题是它们超级慢!

这一定是函数强制进行表扫描的事实,但我不知道还能做些什么。有什么方法可以更快地进行这种比较?也许有like 的一些变化或什么?

【问题讨论】:

  • 您是否考虑过访问远程服务器上的统计信息的权限不足?什么版本的 SQL Server?
  • @MitchWheat 这是 SQL Server 2012
  • @MitchWheat SP3。体验缓慢的不只是我。实际上是运行查询的数据库管理员向我抱怨。

标签: sql tsql optimization indexing query-optimization


【解决方案1】:

最快的方法是创建一个计算列,使它们具有相同的类型,然后在该列上建立索引。比如:

alter table b add account_number as ( RIGHT('0000000000'+B.member_number, 10) );

create index b_acount_number on b(account_number);

然后将查询运行为:

SELECT *
FROM A INNER JOIN
     B 
     ON A.account_number = b.account_number;

这可能是你能得到的最快速度。

【讨论】:

  • 计算列,需要持久化。
  • @FLICKER。 . .该列仅在不精确时才需要声明为持久的。这不使用浮点数,因此它看起来很精确,因此可以用作索引的键。但是,声明它是持久的并没有什么坏处,因为目标是索引列。
  • 你是对的。我以为有索引,应该坚持下去。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2015-07-04
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多