首页 > 数据库 >8.6 SQL Server筛选索引

8.6 SQL Server筛选索引

时间:2023-01-30 10:34:59浏览次数:43  
标签:name 8.6 phone Server 索引 SQL 筛选 NULL WHERE

SQL Server 筛选索引

目录

简介

如果使用得当,非聚集索引可以大大提高查询性能。然而,非聚集索引的好处是有代价的:存储和维护。

  • 首先,它需要额外的存储空间来存储索引键列的数据副本。
  • 其次,当从表中插入、更新或删除行时,SQL Server需要更新关联的非聚集索引。

如果应用程序只查询表的一部分行,那么效率会很低。此时筛选索引便可以发挥作用了。

筛选索引是带有谓词(条件表达式)的非聚集索引,该谓词允许您指定应将哪些行添加到索引中。

语法:

CREATE INDEX index_name
ON table_name(column_list)
WHERE predicate;

其中,使用带有谓词的WHERE子句来指定索引中应包括表的哪些行。

示例

有如下客户表:

表中的phone字段有很多NULL值:

SELECT 
    SUM(CASE
            WHEN phone IS NULL
            THEN 1
            ELSE 0
        END) AS [Has Phone], 
    SUM(CASE
            WHEN phone IS NULL
            THEN 0
            ELSE 1
        END) AS [No Phone]
FROM 
    sales.customers;
Has Phone   No Phone
----------- -----------
1267        178

(1 row affected)

phone非常适合做过滤索引

phone字段上创建过滤索引:

CREATE INDEX ix_cust_phone
ON sales.customers(phone)
WHERE phone IS NOT NULL;

查找电话号为(281) 363-3309的客户:

SELECT    
    first_name,
    last_name, 
    phone
FROM    
    sales.customers
WHERE phone = '(281) 363-3309';

可见,查询优化器可以利用筛选索引ix_cust_phone进行搜索。

请注意,要改进键查找,可以使用包含列的索引,其中包含索引中的first_namelast_name列,这个在上一篇讲过。

CREATE INDEX ix_cust_phone
ON sales.customers(phone)
INCLUDE (first_name, last_name)
WHERE phone IS NOT NULL;

筛选索引的优点

如前所述,过滤索引可以帮助您节省空间,特别是当索引键列稀疏时。稀疏列是具有许多NULL值的列。

此外,筛选索引可以降低维护成本,因为当关联表中的数据发生更改时,只需要更新部分数据行,而不是全部数据行。

标签:name,8.6,phone,Server,索引,SQL,筛选,NULL,WHERE
From: https://www.cnblogs.com/michaelshen/p/17074717.html

相关文章

  • 8.7 SQL Server计算列上的索引
    SQLServer计算列上的索引目录SQLServer计算列上的索引简介计算列索引的要求简介有如下客户表:查找居住在garry.espinoza的客户:SELECTfirst_name,last......
  • 让Windows Server 2008r2 IIS7.5 ASP.NET 支持10万并发请求
    由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误。为了避免这样的错误,我们根据相关文档调整了......
  • docker mysql
    dockerpullmysqldockerrun-itd--namemysql-p3307:3306-eMYSQL_ROOT_PASSWORD=123456mysql--character-set-server=utf8mb4--collation-server=utf8......
  • SQL Server 返回了错误 21(设备未就绪。) 解决方法
    https://www.cnblogs.com/xx_cs/archive/2013/05/31/3110881.html在文件'G:\LedDB\LedDB.mdf' 中、偏移量为0x00000001a9a000 的位置执行 读取 期间,操作系统已经向SQL......
  • MysqlDump导出
    mysqldump常用选项--no-create-db,---取消创建数据库sql(默认存在)--no-create-info,---取消创建表sql(默认存在)--no-data---不导出数据(默认导出)--add-drop......
  • MGR复制架构+自动化运维平台,汽车之家MySQL高可用建设实践
    前言 MySQL具有开源免费,运维简单,性能好等优点,是在汽车之家使用最多的一种数据库。数据库作为应用的后端存储,承担着数据持久化存储的功能,是应用可以正常对外提......
  • mysql第二天
    mysql5.7修改默认字符集由于5.7版本的mysql默认使用latin的字符集,所以在创建表成功后向表中插入中文数据会失败。所以要修改编码方式。在存放mysql的数据文件中找到my.......
  • Mysql数据库插入数据时出现Unknown column ‘admin‘ in ‘field list‘错误
    报错内容  报错原因字段和插入的值所用的引号不对 解决方案 insertintot_user(`username`,`password`,`email`)VALUES(`admin`,`admin`,`[email protected]......
  • mysql第一天
    mysql启动和停止命令netstartmysqlnetstopmysql电脑安装两个mysql数据库下分情况登录旧版本和新版本:使用命令:mysql-uroot-P(端口号)-p根据端口号的不同登录......
  • docker安装mysql:5.7
    1.搜索mysqldockersearchmysql:5.72.拉取mysqldockerpullmysql:5.73.运行mysqldockerrun-d-p3310:3306--restart=always-v/home/mysql/conf:/etc/mysql/......