首页 > 数据库 >8.7 SQL Server计算列上的索引

8.7 SQL Server计算列上的索引

时间:2023-01-30 10:33:05浏览次数:41  
标签:8.7 列上 Server 索引 part 计算 local email 表达式

SQL Server计算列上的索引

目录

简介

有如下客户表:

查找居住在garry.espinoza的客户:

SELECT    
    first_name,
    last_name,
    email
FROM    
    sales.customers
WHERE 
    SUBSTRING(email, 0, 
        CHARINDEX('@', email, 0)
    ) = 'garry.espinoza';

输出中清楚显示,查询优化器需要扫描整个聚集索引来定位客户,效率很低。

使用过 Oracle 或 PostgreSQL的可能知道 Oracle 支持基于函数的索引,而 PostgreSQL 支持基于表达式的索引。这些类型的索引允许对函数或表达式的结果进行索引,这将提高其 WHERE 子句包含函数和表达式的查询的性能。

在SQL Server中,可以使用计算列上的索引来实现类似基于函数的索引的效果:

  • 首先,基于WHERE子句上的表达式创建一个计算列。
  • 其次,为计算列创建非聚集索引。

例如,要根据客户电子邮件地址的本地部分(@部分)搜索客户,可以使用以下步骤:
先给表customers创建一个计算列:

ALTER TABLE sales.customers
ADD 
    email_local_part AS 
        SUBSTRING(email, 
            0, 
            CHARINDEX('@', email, 0)
        );

然后再在这个计算列上创建索引:

CREATE INDEX ix_cust_email_local_part
ON sales.customers(email_local_part);

现在,您可以使用email_local_part列而不是WHERE子句中的表达式来通过电子邮件地址的本地部分查找客户:

SELECT    
    first_name,
    last_name,
    email
FROM    
    sales.customers
WHERE 
    email_local_part = 'garry.espinoza';

查询优化器使用ix_cust_email_local_part索引进行查找操作,提高了查询速度,如下图所示:

计算列索引的要求

要在计算列上创建索引,必须满足以下要求:

  • 计算列表达式中涉及的函数必须与表具有相同的所有者。
  • 计算列表达式必须具有确定性。这意味着对于给定的一组输入,表达式总是返回相同的结果。
  • 计算列必须是精确数据类型,这意味着其表达式不能包含任何FLOATREAL数据类型。
  • 计算列表达式的结果无法计算为TEXTNTEXTIMAGE数据类型,因为这样类型无法建索引。
  • 当使用CREAT TABLEALTER TABLE语句定义计算列时,必须设置ANSI_NULLS选项。此外,还必须设置选项ANSI_PADDINGANSI_WARNINGSARITHABORTQUERDED_IDENIFIERCONCAT_NULL_YIELDS_NULLS_NULL,并且必须将NUMERIC_ROUNDABORT设置为OFF

标签:8.7,列上,Server,索引,part,计算,local,email,表达式
From: https://www.cnblogs.com/michaelshen/p/17074719.html

相关文章

  • 让Windows Server 2008r2 IIS7.5 ASP.NET 支持10万并发请求
    由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误。为了避免这样的错误,我们根据相关文档调整了......
  • SQL Server 返回了错误 21(设备未就绪。) 解决方法
    https://www.cnblogs.com/xx_cs/archive/2013/05/31/3110881.html在文件'G:\LedDB\LedDB.mdf' 中、偏移量为0x00000001a9a000 的位置执行 读取 期间,操作系统已经向SQL......
  • Kubernetes监控手册06-监控APIServer
    写在前面如果是用的公有云托管的Kubernetes集群,控制面的组件都交由云厂商托管的,那作为客户的我们就省事了,基本不用操心APIServer的运维。个人也推荐使用云厂商这个服......
  • IdentityServer4源码解析_2_元数据接口
    1|0目录IdentityServer4源码解析_1_项目结构IdentityServer4源码解析_2_元数据接口IdentityServer4源码解析_3_认证接口IdentityServer4源码解析_4_令牌发放接口Id......
  • 华为云发布冷启动加速解决方案:助力Serverless计算速度提升90%+
    摘要:本文介绍了华为云对冷启动优化这一业界难题的探索之路,创新提出了基于进程级快照的优化方案。作者信息——子游:华为元戎高级工程师平山:华为云中间件Serverless负责......
  • SQL Server STUFF() 函数
    STUFF()在SQLServer中,stuff()函数用于从源字符串中删除给定长度的字符序列,并从指定的起始索引插入给定的字符序列。STUFF(source_string,start,length,change_st......
  • 人人都在聊的云原生数据库Serverless到底是什么?
    摘要:华为云数据库营销专家TonyChen和华为云数据库高级产品经理佳恩开展了一场关于云原生数据库与Serverless结合的直播对话。云计算的迅猛发展推动了数据库的变革,云原生数......
  • 7.14 SQL Server子查询
    SQLServer子查询目录SQLServer子查询简介嵌套子查询SQLServer子查询类型SQLServer子查询用于代替表达式SQLServer子查询与IN运算符一起使用SQLServer子查询与ANY运......
  • 7.15 SQL Server UNION联合查询(并集)
    SQLServerUNION(并集)目录SQLServerUNION(并集)简介UNION与UNIONALLUNION(联合)与JOIN(联接)示例UNION与ORDERBY示例简介SQLServer联合查询SQLServerUNION是一......
  • 7.16 SQL Server EXCEPT(补集)
    SQLServerEXCEPT目录SQLServerEXCEPT简介示例A)EXCEPT简单示例B)EXCEPT与ORDERBY示例简介SQLServerEXCEPT比较两个查询的结果集,并返回第一个查询中未出现在第二个......