Sql 比较具有不同数据类型的两列的最快方法

Sql 比较具有不同数据类型的两列的最快方法,sql,tsql,optimization,indexing,query-optimization,Sql,Tsql,Optimization,Indexing,Query Optimization,我有两个表需要通过链接的服务器连接,但我现在使用的源数据有问题 我需要加入的列名分别是account\u number和member\u number 我的问题是account\u number是一个varchar(10)并且总是用前导零填充,但是member\u number是一个varchar(12)(不要问为什么,最后2个从未使用过)但没有用前导零填充 如果说account\u number在A中,而member\u number在B中,我提出了以下解决方案: SELECT * FROM

我有两个表需要通过链接的服务器连接,但我现在使用的源数据有问题

我需要加入的列名分别是
account\u number
member\u number

我的问题是
account\u number
是一个
varchar(10)
并且总是用前导零填充,但是
member\u number
是一个
varchar(12)
(不要问为什么,最后2个从未使用过)但没有用前导零填充

如果说
account\u number
A
中,而
member\u number
B
中,我提出了以下解决方案:

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

问题是它们的速度太慢了


这一定是因为函数正在强制执行表扫描,但我不确定还有什么其他方法可以解决这个问题。有什么方法可以更快地进行比较吗?也许有一些
的变化,比如
或者什么

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

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;

这可能是您能获得的最快速度。

您是否考虑过可能没有足够的权限访问远程服务器上的统计信息?什么版本的SQL Server?@MitchWheat这是SQL Server2012@MitchWheatSP3。不仅仅是我经历了缓慢。实际上是运行查询的DB管理员向我抱怨。计算列,需要持久化。@FLICKER。如果列不精确,则只需将其声明为持久。它不使用浮点数,因此看起来很精确,因此可以用作索引的键。但是,声明它是持久的并不有害,因为目标是为列编制索引。你是对的。我以为有索引,就应该坚持。谢谢
SELECT *
FROM A INNER JOIN
     B 
     ON A.account_number = b.account_number;