在SQL Server中索引左操作
我有一个E.164呼叫代码的数据库表(例如美国/加拿大的在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是否为真 选择 第一名 呼叫
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解释的在任何数据库中都有效。