将整型字段转换为varchar时,mssql索引搜索失败

将整型字段转换为varchar时,mssql索引搜索失败,sql,sql-server,search,indexing,Sql,Sql Server,Search,Indexing,场景:mssql server 2008(重要提示:我无法修改数据库) 这句话: select top 100 p.*,m.* from p left join MODEL m on p.MODEL= CAST(m.cvid as varchar(18))+ CAST(m.MODEL as varchar(18)) 执行表格扫描。为什么? 我还尝试过CAST(m.cvid as varchar)+CAST(m.MODEL as varchar),但没有成功 加: 我有几千个p和几千个m。索

场景:mssql server 2008(重要提示:我无法修改数据库)

这句话:

select top 100 p.*,m.* from p
left join MODEL m  on p.MODEL= CAST(m.cvid as varchar(18))+ CAST(m.MODEL as varchar(18)) 
执行表格扫描。为什么? 我还尝试过CAST(m.cvid as varchar)+CAST(m.MODEL as varchar),但没有成功

加:
我有几千个p和几千个m。索引是相关的。

它对
产品执行表扫描,因为您没有
ORDER BY
来指定订单,也没有
WHERE
子句来过滤数据


它在
model
上执行表扫描,因为在连接条件
CAST(m.cvid为varchar(18))+CAST(m.model为varchar(18))

上没有索引,所以您根本不使用任何过滤器,也使用
*
,这意味着您需要该表中的每一行和每一列。在这种情况下,使用索引是最糟糕的选择。你说得对。我的场景没有完成-猜测现在完成了。(事实上,我有三个表:模型、品牌和材料,它们与产品连接)。我不知道这会如何改变场景选择前100名:如果我在“p”上有100万条记录,在“m”上有100万条记录,并且我要求前100条“p”连接“m”记录,引擎不必对“m”百万条记录进行100次表扫描。。。引擎必须搜索索引才能执行该任务。这就是场景。但是引擎必须(?)搜索索引来完成这项任务。“m”的索引包含id+model=“123456”(如我在示例中所示),而“p”的字段模型包含“123456”。一个字段是数字,另一个是varchar,但两者都有相同的值“123456”。将复合索引转换为串联字符串不能是可搜索的-您可以添加一个进行字符串串联的索引,或者更改比较以将字符串拆分为两个数字。在“索引id整数(18),模型整数(18)”中逗号表示加号。很抱歉。我纠正了它。但是这个想法还不清楚吗?如何让sql识别并使用索引,而不强制执行它?施放varchar?,转换?创建一个带有特刊的索引?这样您的索引就位于
id
+
model
,而不是复合索引?这将给你一个数值结果(例如,id=18,model=30将给出一个48的“索引”值。正如我所说,你要么需要添加一个带有串联的索引,要么将字符串分解成两个数字。
select top 100 p.*,m.* from p
left join MODEL m  on p.MODEL= CAST(m.cvid as varchar(18))+ CAST(m.MODEL as varchar(18))