在SQL Server中索引左操作

在SQL Server中索引左操作,sql,sql-server,indexing,Sql,Sql Server,Indexing,我有一个E.164呼叫代码的数据库表(例如美国/加拿大的1,英国的44,等等)。这是桌子的设计: CREATE TABLE CountryCosts ( CallingCode varchar(5) PK NOT NULL IsFree bit NOT NULL ) 我有一个标量函数,它接受完整的电话号码,并指示表中的任何国家代码是否与号码匹配(只需检查号码是否以表中的任何CountryCode开头),并指示IsFree是否为真 选择 第一名 呼叫

我有一个E.164呼叫代码的数据库表(例如美国/加拿大的
1
,英国的
44
,等等)。这是桌子的设计:

CREATE TABLE CountryCosts (
    CallingCode varchar(5) PK NOT NULL
    IsFree      bit           NOT NULL
)
我有一个标量函数,它接受完整的电话号码,并指示表中的任何国家代码是否与号码匹配(只需检查号码是否以表中的任何
CountryCode
开头),并指示
IsFree
是否为真

选择
第一名
呼叫代码,
格纹
从…起
农村成本
哪里
格线=1
和
左(@recipient,LEN(CallingCode))=CallingCode
(存在变体,包括在
选择案例中使用
选择计数(1)
,当存在时使用
选择案例,以及使用
@recipient-LIKE-CONCAT(称为“%”)
作为谓词)

实际执行计划报告的主要费用是聚集PK索引的聚集索引扫描


我想知道是否有任何方法可以通过添加另一个索引来提高性能,是否有任何索引可以在
varchar
列上工作,SQL Server可以使用这些索引来优化
LEFT
谓词?

一个包含code和isfree的PK似乎是合乎逻辑的,并且使用某种填充方案来删除LEN()打电话到WHERE clauseI,我对这个方案不太了解,但大概可以确保没有歧义?e、 g.例如,只有美国/加拿大可以以
'1'
开头,没有以
'123'
开头的代码?在这种情况下,您可以搜索
TOP 1 CallingCode@Martin Smith更正,具有相同初始数字的国家代码具有相同的长度,因此
12
不是国家代码,因为
1
属于美国/加拿大
44
是英国,但是
4
本身不是代码,同样地
443
也不是代码。@MartinSmith,这也是一个天才的建议!我要试试看@Martin Smith是的,这是一个变体:there解释的在任何数据库中都有效。