SQL Server索引进阶第五篇:索引包含列


SQL Server索引进阶第五篇:索引包含列

索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其反,可以说“成也索引,败也索引”。


本系列文章来自Stairway to SQL Server Indexes,然后经过我们团队的理解和整理发布在agilesharp,希望对广大的技术朋友在如何使用索引上有所帮助。


包含列解析


所谓的包含列就是包含在非聚集索引中,并且不是索引列中的列。或者说的更通俗一点就是:把一些底层数据表的数据列包含在非聚集索引的索引页中,而这些数据列又不是索引列,那么这些列就是包含列。同时,这些包含列并不会对索引中的条目有影响。

好吧,为了使得问题稍微清楚一点,我用个简单的图示说明一下:



20120828230517.png (39.88 K)
9/9/2012 11:15:45 AM

我们可以用下面的语句在创建索引的时候加入包含列,代码如下:

  1. CREATE NONCLUSTERED INDEX FK_ProductID_ ModifiedDate
  2. ON Sales.SalesOrderDetail (ProductID, ModifiedDate)
  3. INCLUDE (OrderQty, UnitPrice, LineTotal)
复制代码

在上述的代码中,ProductID和ModifiedDate包含在索引键中,而OrderQty, UnitPrice, LineTotal作为包含列。

下面,我们就稍微深入到页级别来看看建立索引前后的状态。首先,我们看看,当建立非聚集索引,但是,索引中没有包含列的时候,索引中的索引页的详细如下:

20120828230709.png (68.84 K)
9/9/2012 11:15:45 AM

在上图中可以看到,上面两个索引页是整个索引结构中的一部分,此时就包含了2个字段,而且这两个字段都是索引键,另外一个Bookmark是指向底层数据表中数据行的一个指针。

下面,我们再来看看,我们建立了有包含列的非聚集索引之后,索引页的情况,如下图:

03.png (120.39 K)
9/9/2012 11:15:45 AM

很明显,原本的2个索引页被拆分成为了3个,因为一部分底层数据行的数据的数据包含在了索引页中。从这里就可以知道一点:加入包含列到非聚集索引中,增大了索引结构中页的个数,进而在使用的时候会占用更多的磁盘空间和内存空间。


其实把一些列作为包含列放在索引结构中就是一种用“空间换时间”的策略

这个时候,大家可能就会问了:“何必把列放在包含列中这么麻烦,为什么不直接放在索引中?”。


其实把那三个列放在包含列而不是索引列中有以下几个好处:


1.可以使得索引键变化引起的波动更小。举个例子,如果索引列中的ProductID或者ModifiedDate发生变化,那么索引结构就会要调整,重新定位到底层的数据行。但是,如果UnitPrice的值发生了变化,整个索引的结构不会发生变化,只是在包含列中的UnitPrice的值进行更新而已。

2.索引中的数据列越少,数据分布的统计维护的成本就越小。

是否把一些作为索引列还是包含了其实也和数据库的类型和用途有很大的关系。例如在OLTP的数据库中,有很多的数据的增删改写的操作,那么建议索引中的列不要太多。如果是Warehouse类型的数据,那么就以大量数据的读取为主,那么可以考虑把很一些列包含在索引列中。


包含列实例演示一


下面通过是三个不同的小例子作为比较演示,并且以AdventureWorks中的SalesOrderDetail示例数据表:

1.演示没有非聚集索引的例子。

2.演示使用非聚集索引,但是没有包含列的例子

3.演示有非聚集索引和包含列的例子

在讲述的过程中,我们会结合实际的执行详情说明问题。


示例一:没有非聚集索引

执行语句如下:

  1. SET STATISTICS IO ON

  2. SELECT ProductID ,
  3. ModifiedDate ,
  4. SUM(OrderQty) AS 'No of Items' ,
  5. AVG(UnitPrice) 'Avg Price' ,
  6. SUM(LineTotal) 'Total Value'
  7. FROM Sales.SalesOrderDetail
  8. WHERE ProductID = 888
  9. GROUP BY ProductID ,
  10. ModifiedDate ;

  11. SET STATISTICS IO OFF
复制代码


数据结果如下:


20120828231032.png (68.18 K)
9/9/2012 11:15:45 AM

示例二:使用非聚集索引,但是没有包含列

首先运行下面的语句,建立索引:

  1. IF EXISTS ( SELECT 1 FROM sys.indexes
  2. WHERE name = 'FK_ProductID_ModifiedDate'
  3. AND OBJECT_ID = OBJECT_ID('Sales.SalesOrderDetail') )
  4. DROP INDEX Sales.SalesOrderDetail.FK_ProductID_ModifiedDate


  5. CREATE NONCLUSTERED INDEX
  6. FK_ProductID_ModifiedDateON Sales.SalesOrderDetail (ProductID, ModifiedDate)
复制代码


然后再次运行示例中的查询。


示例三:有非聚集索引和包含列

首先执行下面的代码:

  1. IF EXISTS ( SELECT 1 FROM sys.indexes
  2. WHERE name = 'FK_ProductID_ModifiedDate'
  3. AND OBJECT_ID = OBJECT_ID('Sales.SalesOrderDetail') )
  4. DROP INDEX Sales.SalesOrderDetail.FK_ProductID_ModifiedDate

  5. CREATE NONCLUSTERED INDEX FK_ProductID_ModifiedDateON Sales.SalesOrderDetail
  6. (ProductID, ModifiedDate) INCLUDE (OrderQty, UnitPrice, LineTotal) ;
复制代码

然后再次运行之前的查询。

好了,三个例子完成之后,我们就来比较一下结果,如下:

示例 1:No Nonclustered IndexTable 'SalesOrderDetail'. Scan count 1, logical reads 1238.Non read activity:  8%.
示例2:Index – No Included Columns   Table 'SalesOrderDetail'. Scan count 1, logical reads 131.Non read activity:  0%.
示例3:With Included ColumnsTable 'SalesOrderDetail'. Scan count 1, logical reads 3.Non read activity:  1%.


总结如下:

1.示例1中对整个表进行扫描,每一个行都要进行扫描,所以进行大量的IO活动。

2.例2首先使用非聚集索引找到ProductID的数据,然后通过书签查找找到查询中请求的其他的数据列。

3.示例3,只要在非聚集索引中查找需要的数据就行了,因为查询中所有列的数据都在里面了,不用查找底层的数据表,所以查询只是查找了索引结构,消耗的IO最少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
推荐:学习SQL编程,必备书籍,从入门到进阶/精通,实例与理论同步,比较优秀作品!(共分压5部分)目录: 第1章 了解SQL... 1 1.1 数据库基础..... 1 1.1.1 什么是数据库..... 2 1.1.2 表..... 2 1.1.3 和数据类型..... 3 1.1.4 行..... 4 1.1.5 主键..... 4 1.2 什么是SQL... 5 1.3 动手实践..... 6 1.4 小结..... 7 第2章 检索数据...... 8 2.1 SELECT语句..... 8 2.2 检索单个..... 9 2.3 检索多个..... 10 2.4 检索所有..... 11 2.5 小结..... 12 第3章 排序检索数据...... 13 3.1 排序数据..... 13 3.2 按多个排序..... 15 3.3 按位置排序..... 15 3.4 指定排序方向..... 16 3.5 小结..... 18 第4章 过滤数据...... 19 4.1 使用WHERE子句..... 19 4.2 WHERE子句操作符..... 20 4.2.1 检查单个值..... 21 4.2.2 不匹配检查..... 22 4.2.3 范围值检查..... 22 4.2.4 空值检查..... 23 4.3 小结..... 24 第5章 高级数据过滤...... 25 5.1 组合WHERE子句..... 25 5.1.1 AND操作符..... 25 5.1.2 OR操作符..... 26 5.1.3 计算次序..... 26 5.2 IN操作符..... 28 5.3 NOT操作符..... 29 5.4 小结..... 30 第6章 用通配符进行过滤...... 31 6.1 LIKE操作符..... 31 6.1.1 百分号(%) 通配符..... 32 6.1.2 下划线(_) 通配符..... 33 6.1.3 方括号([ ]) 通配符..... 34 6.2 使用通配符的技巧..... 36 6.3 小结..... 36 第7章 创建计算字段...... 37 7.1 计算字段..... 37 7.2 拼接字段..... 38 7.3 执行算术计算..... 42 7.4 小结..... 43 第8章 使用数据处理函数...... 44 8.1 函数..... 44 8.2 使用函数..... 45 8.2.1 文本处理函数..... 46 8.2.2 日期和时间处理 函数..... 47 8.2.3 数值处理函数..... 50 8.3 小结..... 50 第9章 汇总数据...... 51 9.1 聚集函数..... 51 9.1.1 AVG()函数..... 52 9.1.2 COUNT()函数..... 53 9.1.3 MAX()函数..... 54 9.1.4 MIN()函数..... 54 9.1.5 SUM()函数..... 55 9.2 聚集不同值..... 56 9.3 组合聚集函数..... 57 9.4 小结..... 58 第10章 分组数据...... 59 10.1 数据分组..... 59 10.2 创建分组..... 59 10.3 过滤分组..... 61 10.4 分组和排序..... 63 10.5 SELECT子句顺序..... 65 10.6 小结..... 65 第11章 使用子查询...... 66 11.1 子查询..... 66 11.2 利用子查询进行过滤..... 66 11.3 作为计算字段使用子 查询..... 69 11.4 小结..... 71 第12章 联结表...... 72 12.1 联结..... 72 12.1.1 关系表..... 72 12.1.2 为什么要 使用联结..... 74 12.2 创建联结..... 74 12.2.1 WHERE子句 的重要性..... 75 12.2.2 内部联结..... 77 12.2.3 联结多个表..... 78 12.3 小结..... 80 第13章 创建高级联结...... 81 13.1 使用表别名..... 81 13.2 使用不同类型的联结..... 82 13.2.1 自联结..... 82 13.2.2 自然联结..... 84 13.2.3 外部联结..... 84 13.3 使用带聚集函数的联结..... 87 13.4 使用联结和联结条件..... 88 13.5 小结..... 88 第14章
网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。   Bootcfg   bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。   含有下参数的 bootcfg 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 bootcfg 命令。   用法:   bootcfg /default  设置默认引导项。   bootcfg /add    向引导表中添加 Windows 安装。   bootcfg /rebuild  重复全部 Windows 安装过程并允许用户选择要添加的内容。   注意:使用 bootcfg /rebuild 之前,应先通过 bootcfg /copy 命令备份 boot.ini 文件。   bootcfg /scan    扫描用于 Windows 安装的所有磁盘并显示结果。   注意:这些结果被静态存储,并用于本次会话。如果在本次会话期间磁盘配置发生变化,为获得更新的扫描,必须先重新启动计算机,然后再次扫描磁盘。   bootcfg /list   出引导表中已有的条目。   bootcfg /disableredirect 在启动引导程序中禁用重定向。   bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings]   在启动引导程序中通过指定配置启用重定向。   范例: bootcfg /redirect com1 115200 bootcfg /redirect useBiosSettings   hkdsk   创建并显示磁盘的状态报告。Chkdsk 命令还可出并纠正磁盘上的错误。   含有下参数的 chkdsk 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 chkdsk 命令。   vol [drive:] [ chkdsk [drive:] [/p] [/r]   参数  无   如果不带任何参数,chkdsk 将显示当前驱动器中的磁盘状态。 drive: 指定要 chkdsk 检查的驱动器。 /p   即使驱动器不在 chkdsk 的检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。 /r   找到坏扇区并恢复可读取的信息。隐含着 /p 参数。   注意 Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart   创建和删除硬盘驱动器上的分区。diskpart 命令仅在使用故障恢复控制台时才可用。   diskpart [ /add |/delete] [device_name |drive_name |partition_name] [size]   参数 无   如果不带任何参数,diskpart 命令将启动 diskpart 的 Windows 字符模式版本。   /add   创建新的分区。   /delete   删除现有分区。   device_name   要创建或删除分区的设备。设备名称可从 map 命令的输出获得。例如,设备名称:   DeviceHardDisk0   drive_name   以驱动器号表示的待删除分区。仅与 /delete 同时使用。以下是驱动器名称的范例:   D:   partition_name   以分区名称表示的待删除分区。可代替 drive_name 使用。仅与 /delete 同时使用。以下是分区名称的范例:   DeviceHardDisk0Partition1    大小   要创建的分区大小,以兆字节 (MB)表示。仅与 /add 同时使用。   范例   下例将删除分区: diskpart /delete Device HardDisk0 Partition3 diskpart /delete F:   下例将在硬盘上添加一个 20 MB 的分区:   diskpart /add Device HardDisk0 20   Fixboot
最好的sql教程 轻举技术之“纲”,张合用之“目”,锻造SQL高可用性数据库应用指南从理论到实践,凝聚SQL主流数据库最前沿的技术要领,本书将深入浅出讨论。   本书特色:主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在MySQL、MS SQL Server、Oracle和DB2中的差异进行了分析;详细讲解数据库对增、删、改、查等SQL的支持并给出了相应的SQL应用案例;透彻分析函数、子查询、表连接、不同DBMS中的SQL语法差异、SQL调优、NULL值处理、事务、开窗函数等高级技术;通过对实际案例开发过程的详细分析,使读者掌握 SQL的综合应用技巧。 内容简介 本书主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在MySQL、MS SQL Server、Oracle和DB2中的差异进行了分析。本书分为3部分:第1部分为基础篇,主要讲解数据库对增、删、改、查等SQL的支持,给出了这些 SQL的应用案例;第2部分为进阶篇,讲解了函数、子查询、表连接、不同DBMS中的SQL语法差异、SQL调优、NULL值处理、事务、开窗函数等高级技术;第3部分为案例篇,对前两部分的知识进行了综合运用。   本书适合程序开发人员及数据库工程师参考学习,也可作为高等院校相关专业师生的参考书。 目录 第1章 数据库入门  1.1 数据库概述   1.1.1 数据库与数据库管理系统   1.1.2 数据库能做什么   1.1.3 主流数据库管理系统介绍  1.2 数据库基础概念   1.2.1 Catalog   1.2.2 表(Table)   1.2.3 (Column)   1.2.4 数据类型(DataType)   1.2.5 记录(Record)   1.2.6 主键(PrimaryKey)   1.2.7 索引(Index)   1.2.8 表关联   1.2.9 数据库的语言——SQL   1.2.10 DBA与程序员 第2章 数据表的创建和管理  2.1 数据类型   2.1.1 整数类型   2.1.2 数值类型   2.1.3 字符相关类型   2.1.4 日期时间类型   2.1.5 二进制类型  2.2 通过SQL语句管理数据表   2.2.1 创建数据表   2.2.2 定义非空约束   2.2.3 定义默认值   2.2.4 定义主键   2.2.5 定义外键   2.2.6 修改已有数据表   2.2.7 删除数据表   2.2.8 受限操作的变通解决方案 第3章 数据的增、删、改  3.1 数据的插入   3.1.1 简单的INSERT语句   3.1.2 简化的INSERT语句   3.1.3 非空约束对数据插入的影响   3.1.4 主键对数据插入的影响   3.1.5 外键对数据插入的影响  3.2 数据的更新   3.2.1 简单的数据更新   3.2.2 带WHERE子句的UPDATE语句   3.2.3 非空约束对数据更新的影响   3.2.4 主键对数据更新的影响   3.2.5 外键对数据更新的影响  3.3 数据的删除   3.3.1 简单的数据删除   3.3.2 带WHERE子句的DELETE语句 第4章 数据的检索  4.1 SELECT基本用法   4.1.1 简单的数据检索   4.1.2 检索出需要的   4.1.3 别名   4.1.4 按条件过滤   4.1.5 数据汇总   4.1.6 排序  4.2 高级数据过滤   4.2.1 通配符过滤   4.2.2 空值检测   4.2.3 反义运算符   4.2.4 多值检测   4.2.5 范围值检测   4.2.6 低效的“WHERE 1=1”  4.3 数据分组   4.3.1 数据分组入门   4.3.2 数据分组与聚合函数   4.3.3 HAVING语句  4.4 限制结果集行数   4.4.1 MySQL   4.4.2 MS SQL Server 2000   4.4.3 MS SQL Server 2005   4.4.4 Oracle   4.4.5 DB2   4.4.6 数据库分页  4.5 抑制数据重复  4.6 计算字段   4.6.1 常量字段   4.6.2 字段间的计算   4.6.3 数据处理函数   4.6.4 字符串的拼接   4.6.5 计算字段的其他用途  4.7 不从实体表中取的数据  4.8 联合结果集   4.8.1 简单的结果集联合   4.8.2 联合结果集的原则   4.8.3 UNION ALL   4.8.4 联合结果集应用举例 第5章 函数  5.1 数学函数   5.1.1 求绝对值   5.1.2 求指数   5.1.3 求平方根   5.1.4 求随机数   5.1.5 舍入到最大整数   5.1.6 舍入到最小整数   5.1.7 四舍五入   5.1.8 求正弦值   5.1.9 求余弦值   5.1.10 求反正弦值   5.1.11 求反余弦值   5.1.12 求正切值   5.1.13 求反正切值   5.1.14 求两个变量的反正切   5.1.15 求余切   5.1.16 求圆周率π值   5.1.17 弧度制转换为角度制   5.1.18 角度制转换为弧度制   5.1.19 求符号   5.1.20 求整除余数   5.1.21 求自然对数   5.1.22 求以10为底的对数   5.1.23 求幂  5.2 字符串函数   5.2.1 计算字符串长度   5.2.2 字符串转换为小写   5.2.3 字符串转换为大写   5.2.4 截去字符串左侧空格   5.2.5 截去字符串右侧空格   5.2.6 截去字符串两侧的空格   5.2.7 取子字符串   5.2.8 计算子字符串的位置   5.2.9 从左侧开始取子字符串   5.2.10 从右侧开始取子字符串   5.2.11 字符串替换   5.2.12 得到字符的ASCII码   5.2.13 得到一个ASCII码数字对应的字符   5.2.14 发音匹配度  5.3 日期时间函数   5.3.1 日期、时间、日期时间与时间戳   5.3.2 主流数据库系统中日期时间类型的表示方式   5.3.3 取得当前日期时间   5.3.4 日期增减   5.3.5 计算日期差额   5.3.6 计算一个日期是星期几   5.3.7 取得日期的指定部分  5.4 其他函数   5.4.1 类型转换   5.4.2 空值处理   5.4.3 CASE函数  5.5 各数据库系统独有函数   5.5.1 MySQL中的独有函数   5.5.2 MS SQL Server中的独有函数   5.5.3 Oracle中的独有函数 第6章 索引与约束  6.1 索引  6.2 约束   6.2.1 非空约束   6.2.2 唯一约束   6.2.3 CHECK约束   6.2.4 主键约束   6.2.5 外键约束 第7章 表连接  7.1 表连接简介  7.2 内连接(INNER JOIN)  7.3 不等值连接  7.4 交叉连接  7.5 自连接  7.6 外部连接   7.6.1 左外部连接   7.6.2 右外部连接   7.6.3 全外部连接 第8章 子查询  8.1 子查询入门   8.1.1 单值子查询   8.1.2 值子查询  8.2 SELECT表中的标量子查询  8.3 WHERE子句中的标量子查询  8.4 集合运算符与子查询   8.4.1 IN运算符   8.4.2 ANY和SOME运算符   8.4.3 ALL运算符   8.4.4 EXISTS运算符  8.5 在其他类型SQL语句中的子查询应用   8.5.1 子查询在INSERT语句中的应用   8.5.2 子查询在UPDATE语句中的应用   8.5.3 子查询在DELETE语句中的应用 第9章 主流数据库的SQL语法差异解决方案  9.1 SQL语法差异分析   9.1.1 数据类型的差异   9.1.2 运算符的差异   9.1.3 函数的差异   9.1.4 常用SQL的差异   9.1.5 取元数据信息的差异  9.2 消除差异性的方案   9.2.1 为每种数据库编写不同的SQL语句   9.2.2 使用语法交集   9.2.3 使用SQL实体对象   9.2.4 使用ORM工具   9.2.5 使用SQL翻译器  9.3 CowNewSQL翻译器   9.3.1 CowNewSQL支持的数据类型   9.3.2 CowNewSQL支持的SQL语法   9.3.3 CowNewSQL支持的函数   9.3.4 CowNewSQL的使用方法 第10章 高级话题  10.1 SQL注入漏洞攻防   10.1.1 SQL注入漏洞原理   10.1.2 过滤敏感字符   10.1.3 使用参数化SQL  10.2 SQL调优   10.2.1 SQL调优的基本原则   10.2.2 索引   10.2.3 全表扫描和索引查找   10.2.4 优化手法  10.3 事务   10.3.1 事务简介   10.3.2 事务的隔离   10.3.3 事务的隔离级别   10.3.4 事务的使用  10.4 自动增长字段   10.4.1 MySQL中的自动增长字段   10.4.2 MS SQL Server中的自动增长字段   10.4.3 Oracle中的自动增长字段   10.4.4 DB2中的自动增长字段  10.5 业务主键与逻辑主键  10.6 NULL的学问   10.6.1 NULL与比较运算符   10.6.2 NULL和计算字段   10.6.3 NULL和字符串   10.6.4 NULL和函数   10.6.5 NULL和聚合函数  10.7 开窗函数   10.7.1 开窗函数简介   10.7.2 PARTITION BY子句   10.7.3 ORDER BY子句   10.7.4 高级开窗函数  10.8 WITH子句与子查询 第11章 案例讲解  11.1 报表制作   11.1.1 显示制单人详细信息   11.1.2 显示销售单的详细信息   11.1.3 计算收益   11.1.4 产品销售额统计   11.1.5 统计销售记录的份额   11.1.6 为采购单分级   11.1.7 检索所有重叠日期销售单   11.1.8 为查询编号   11.1.9 标记所有单内最大销售量  11.2 排序   11.2.1 非字段排序规则   11.2.2 随机排序  11.3 表间比较   11.3.1 检索制作过采购单的人制作的销售单   11.3.2 检索没有制作过采购单的人制作的销售单  11.4 表复制   11.4.1 复制源表的结构并复制表中的数据   11.4.2 只复制源表的结构  11.5 计算字符在字符串中出现的次数  11.6 去除最高分、最低分   11.6.1 去除所有最低、最高值   11.6.2 只去除一个最低、最高值  11.7 与日期相关的应用   11.7.1 计算销售确认日和制单日之间相差的天数   11.7.2 计算两张销售单之间的时间间隔   11.7.3 计算销售单制单日期所在年份的天数   11.7.4 计算销售单制单日期所在月份的第一天和最后一天  11.8 结果集转置   11.8.1 将结果集转置为一行   11.8.2 把结果集转置为多行  11.9 递归查询   11.9.1 Oracle中的CONNECT BY子句   11.9.2 Oracle中的SYS_CONNECT_BY_PATH()函数   11.9.3 My SQL Server和DB2中递归查询 附录A 常用数据库系统的安装和使用  A.1 DB2的安装和使用  A.2 MySQL的安装和使用  A.3 Oracle的安装和使用  A.4 Microsoft SQL Server的安装和使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值