SQLServer索引结构及其使用(三)

合集下载

sql server的left join的using用法-概述说明以及解释

sql server的left join的using用法-概述说明以及解释

sql server的left join的using用法-概述说明以及解释1.引言1.1 概述:在SQL Server中,LEFT JOIN是一种常用的连接操作,用来在两个表之间建立关联关系,并且保留左表的所有记录。

使用LEFT JOIN可以实现查询主表中的所有数据,即使在关联的从表中没有匹配的记录。

本文将重点介绍LEFT JOIN的Using用法,帮助读者更好地理解如何在SQL Server中使用Using子句进行左连接操作。

通过学习本文,读者将了解到Using用法的语法、特点以及适用场景,从而更好地运用LEFT JOIN来进行数据查询和分析。

1.2文章结构1.2 文章结构:本文将分为三个主要部分来讨论SQL Server中LEFT JOIN的Using 用法。

首先,我们将介绍SQL Server中LEFT JOIN的基本概念,包括LEFT JOIN的定义和与其他类型JOIN的区别。

接着,我们将重点讨论LEFT JOIN 的Using用法,探讨其语法和具体应用场景。

最后,我们将总结LEFT JOIN 的Using用法,提出一些实际应用中的注意事项,并展望其未来发展趋势。

通过本文的阐述,读者将能够全面了解SQL Server中LEFT JOIN的Using 用法及其在数据查询中的重要性和实际应用价值。

1.3 目的在本文中,我们将深入探讨SQL Server中LEFT JOIN的Using用法,通过分析其基本概念、语法结构和使用场景,帮助读者更好地理解和应用LEFT JOIN操作符。

通过学习本文,读者将能够掌握LEFT JOIN的Using 用法,提升对SQL Server的查询操作能力。

此外,我们还将总结实际应用中LEFT JOIN的Using用法的一些注意事项,帮助读者在实际项目中更加灵活、高效地运用LEFT JOIN操作符。

最后,我们还将展望未来LEFT JOIN的发展趋势,帮助读者跟上数据库领域的最新发展动态。

SQL Server 2005_索引

SQL Server 2005_索引

数据库
数据文件 .mdf或.ndf 事务日志文件 .ldf

区:64 KB 数据 页:8 KB
数据的查找
数据如何查找
表扫描
使用索引
数据页
Page 4
Con Funk White ... ... ... ... ... ... ...
Page 5
Rudd White Barr
... ... ... ... ... ... ...
Page 6
Akhtar Funk Smith Martin ...
... ... ... ... ...
Page 7
Smith Ota Jones
... ... ... ... ... ... ...
Page 8
Martin Phua Jones Smith ...
... ... ... ... ...
非聚集索引的结构示意图
object_id
根节点 上一页 下一页 索引行 非 索引页 聚 集 叶节点
键值+行定位符
index_id > 1
root_page
索 上一页 下一页 索引行 上一页 下一页 索引行 上一页 下一页 索引行 引
索引页
堆 数据页 或 上一页 下一页 上一页 下一页 聚
……
数据行
INSERT member (last name) VALUES lastname = ‘Jackson' Index Pages
Akhtar … Martin Akhtar Ganio Jackson … Lang Smith …
Non-Leaf Level
Leaf Level Leaf Level

SQLServer创建索引(index)

SQLServer创建索引(index)

SQLServer创建索引(index)索引的简介:索引分为聚集索引和⾮聚集索引,数据库中的索引类似于⼀本书的⽬录,在⼀本书中通过⽬录可以快速找到你想要的信息,⽽不需要读完全书。

索引主要⽬的是提⾼了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间。

但是索引对于提⾼查询性能也不是万能的,也不是建⽴越多的索引就越好。

索引建少了,⽤ WHERE ⼦句找数据效率低,不利于查找数据。

索引建多了,不利于新增、修改和删除等操作,因为做这些操作时,SQL SERVER 除了要更新数据表本⾝,还要连带⽴即更新所有的相关索引,⽽且过多的索引也会浪费硬盘空间。

索引的分类:索引就类似于中⽂字典前⾯的⽬录,按照拼⾳或部⾸都可以很快的定位到所要查找的字。

唯⼀索引(UNIQUE):每⼀⾏的索引值都是唯⼀的(创建了唯⼀约束,系统将⾃动创建唯⼀索引)主键索引:当创建表时指定的主键列,会⾃动创建主键索引,并且拥有唯⼀的特性。

聚集索引(CLUSTERED):聚集索引就相当于使⽤字典的拼⾳查找,因为聚集索引存储记录是物理上连续存在的,即拼⾳ a 过了后⾯肯定是 b ⼀样。

⾮聚集索引(NONCLUSTERED):⾮聚集索引就相当于使⽤字典的部⾸查找,⾮聚集索引是逻辑上的连续,物理存储并不连续。

PS:聚集索引⼀个表只能有⼀个,⽽⾮聚集索引⼀个表可以存在多个。

什么情况下使⽤索引:语法:CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_nameON <object> ( column_name [ ASC | DESC ] [ ,...n ] )[ WITH <backward_compatible_index_option> [ ,...n ] ][ ON { filegroup_name | "default" } ]<object> ::={[ database_name. [ owner_name ] . | owner_name. ]table_or_view_name}<backward_compatible_index_option> ::={PAD_INDEX| FILLFACTOR = fillfactor| SORT_IN_TEMPDB| IGNORE_DUP_KEY| STATISTICS_NORECOMPUTE| DROP_EXISTING}参数:UNIQUE:为表或视图创建唯⼀索引。

sql server加索引语句

sql server加索引语句

sql server加索引语句在 SQL Server 中创建索引是增加查询性能的关键。

通过使用索引,查询可以快速定位数据行,而不必扫描整个数据表。

本文将为您介绍如何在 SQL Server 中创建索引,以提高查询性能。

一、什么是索引索引是一种数据结构,用于快速访问数据库中的数据。

在数据库中,索引是一个单独的对象,可以存储在表中或独立于表之外。

索引可以是唯一的,也可以是非唯一的。

索引让数据库引擎更快地找到数据。

当执行查询时,数据库引擎使用索引而不是扫描整个表格进行查找。

索引可以大大提高查询性能,因为它可以将查询的成本从 O(n) 降低到 O(log n)。

二、创建索引要创建索引,您需要使用CREATE INDEX语句。

CREATE INDEX语句的语法如下:CREATE INDEX [index_name] ON [table_name] (column1,column2,...)例如,以下代码创建了一个名为“idx_last_name”的索引,用于表“employees”中的“last_name”列:如果您要创建一个唯一的索引,请在CREATE INDEX语句中添加UNIQUE关键字。

例如,以下代码创建一个唯一索引,用于表“employees”中的“employee_id”列:CREATE UNIQUE INDEX idx_employee_id ON employees (employee_id)三、使用索引一旦您创建了索引,就可以使用它来加速查询。

例如,以下查询将使用名为“idx_last_name”的索引来查找员工名为“Smith”的记录:SELECT * FROM employees WHERE last_name = 'Smith'查询优化器将使用索引来查找所有姓氏为“Smith”的员工,并返回它们的记录。

如果没有索引,查询将扫描整个表,这可能需要更长时间。

虽然索引可以大大提高查询性能,但过多的索引可能会降低性能。

SQLServer-索引详细教程(聚集索引,非聚集索引)

SQLServer-索引详细教程(聚集索引,非聚集索引)

SQLServer-索引详细教程(聚集索引,⾮聚集索引)作者:(⼀)必读:深⼊浅出理解索引结构实际上,您可以把索引理解为⼀种特殊的⽬录。

微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和⾮聚集索引(nonclustered index,也称⾮聚类索引、⾮簇集索引)。

下⾯,我们举例来说明⼀下聚集索引和⾮聚集索引的区别:其实,我们的汉语字典的正⽂本⾝就是⼀个聚集索引。

⽐如,我们要查“安”字,就会很⾃然地翻开字典的前⼏页,因为“安”的拼⾳是“an”,⽽按照拼⾳排序汉字的字典是以英⽂字母“a”开头并以“z”结尾的,那么“安”字就⾃然地排在字典的前部。

如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼⾳是“zhang”。

也就是说,字典的正⽂部分本⾝就是⼀个⽬录,您不需要再去查其他⽬录来找到您需要找的内容。

我们把这种正⽂内容本⾝就是⼀种按照⼀定规则排列的⽬录称为“聚集索引”。

如果您认识某个字,您可以快速地从⾃动中查到这个字。

但您也可能会遇到您不认识的字,不知道它的发⾳,这时候,您就不能按照刚才的⽅法找到您要查的字,⽽需要去根据“偏旁部⾸”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。

但您结合“部⾸⽬录”和“检字表”⽽查到的字的排序并不是真正的正⽂的排序⽅法,⽐如您查“张”字,我们可以看到在查部⾸之后的检字表中“张”的页码是672页,检字表中“张”的上⾯是“驰”字,但页码却是63页,“张”的下⾯是“弩”字,页⾯是390页。

很显然,这些字并不是真正的分别位于“张”字的上下⽅,现在您看到的连续的“驰、张、弩”三字实际上就是他们在⾮聚集索引中的排序,是字典正⽂中的字在⾮聚集索引中的映射。

我们可以通过这种⽅式来找到您所需要的字,但它需要两个过程,先找到⽬录中的结果,然后再翻到您所需要的页码。

SQLSERVER聚集索引非聚集索引区别

SQLSERVER聚集索引非聚集索引区别

SQLSERVER聚集索引⾮聚集索引区别⼀、理解索引的结构 索引在数据库中的作⽤类似于⽬录在书籍中的作⽤,⽤来提⾼查找信息的速度。

使⽤索引查找数据,⽆需对整表进⾏扫描,可以快速找到所需数据。

微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和⾮聚集索引(nonclustered index,也称⾮聚类索引、⾮簇集索引)。

SQL Server 中数据存储的基本单位是页(Page)。

数据库中的数据⽂件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0到 n 连续编号)。

磁盘 I/O 操作在页级执⾏。

也就是说,SQL Server 每次读取或写⼊数据的最少数据单位是数据页。

下⾯我们先简单的了解⼀下索引的体系结构: 1. 聚集索引结构 在 SQL Server 中,索引是按 B 树结构进⾏组织的。

聚集索引单个分区中的结构:--建⽴UserAddDate聚集索引CREATE CLUSTERED INDEX [IX_AddDate] ON [User]([AddDate] ASC) 聚集索引的叶节点就是实际的数据页聚集索引中的排序顺序仅仅表⽰数据页链在逻辑上是有序的。

⽽不是按照顺序物理的存储在磁盘上⾏的物理位置和⾏在索引中的位置是相同的每个表只能有⼀个聚集索引聚集索引的平均⼤⼩⼤约为表⼤⼩的5%左右 2. ⾮聚集索引结构 ⾮聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 1. 基础表的数据⾏不按⾮聚集键的顺序排序和存储。

2. ⾮聚集索引的叶层是由索引页⽽不是由数据页组成。

下图⽰意了单个分区中的⾮聚集索引结构: 包含列的索引 通过将包含列(称为⾮键列)添加到索引的叶级,可以扩展⾮聚集索引的功能。

键列存储在⾮聚集索引的所有级别,⽽⾮键列仅存储在叶级别。

下⾯举个简单的例⼦来说明⼀下聚集索引和⾮聚集索引的区别: 我们有⼀本汉语字典,可以把它的正⽂本⾝看做是⼀个聚集索引,它是按照汉字拼⾳的开头字母排序的,不再需要查找其他⽬录。

sqlserver 空字段 索引

sqlserver 空字段 索引

标题:SQL Server中空字段索引的使用及其优化方法目录1. SQL Server中空字段索引的作用2. SQL Server中空字段索引的使用方法3. SQL Server中空字段索引的优化方法一、SQL Server中空字段索引的作用在SQL Server数据库中,索引是一种用于加快数据查询速度的重要技术。

空字段索引是指在数据库表中对某个字段建立的索引,该字段允许为空值。

空字段索引的作用在于提高查询速度、优化数据检索效率,同时对于包含大量空值的字段,可以节约存储空间。

二、SQL Server中空字段索引的使用方法在SQL Server中,可以通过以下步骤对空字段建立索引:1. 分析数据表结构,确定哪些字段允许为空值且需要建立索引。

2. 使用CREATE INDEX语句来创建空字段索引,例如:```sqlCREATE INDEX idx_name ON table_name (column_name);```3. 使用SQL Server Management Studio(SSMS)或其他数据库管理工具来验证空字段索引的创建情况,并进行必要的优化和调整。

三、SQL Server中空字段索引的优化方法在使用空字段索引的过程中,可以通过以下方法来优化其性能:1. 确保索引列的数据类型和长度合理。

索引列的数据类型应尽量选择较小的类型,避免浪费存储空间。

2. 定期对空字段索引进行重新组织或重建。

由于数据的增删改会导致索引碎片化,因此需要定期对索引进行维护,以提高查询性能。

3. 根据业务需求和实际查询情况,合理选择索引类型。

在SQL Server 中,可以使用聚集索引、非聚集索引、覆盖索引等不同类型的索引,根据查询需求来选择最合适的索引类型。

4. 考虑在查询条件中对空字段进行合理的处理。

对于可能涉及到空字段的查询条件,需要针对性地优化查询语句,避免性能损耗。

总结在SQL Server中,空字段索引可以有效提高数据查询的速度和效率,但在使用过程中需要注意合理选择索引列、定期维护索引以及优化查询语句,以达到最佳的性能效果。

sqlserver基本语法

sqlserver基本语法

SQL Server基本语法一、SQL Server简介在开始讨论SQL Server基本语法之前,我们先简要介绍一下SQL Server。

SQL Server是由Microsoft开发的关系型数据库管理系统(RDBMS),它是一种可靠、高效且安全的数据库解决方案。

SQL Server支持广泛的企业级应用,并提供了强大的数据管理和查询功能。

二、SQL Server安装在使用SQL Server之前,我们需要先进行安装和配置。

以下是SQL Server安装的一般步骤:1.下载SQL Server安装包,并运行安装程序。

2.选择安装类型(如开发人员、评估版或正式版)。

3.设置安装规则,包括实例名称、安装路径等。

4.配置身份验证方式,可以选择Windows身份验证或SQL Server身份验证。

5.选择要安装的组件,如数据库引擎、分析服务等。

6.进行一些其他配置,如临时数据库路径、自动维护计划等。

7.等待安装完成,并根据需要安装补丁和更新。

三、SQL Server连接安装完成后,我们可以使用SQL Server Management Studio(SSMS)来连接和管理数据库。

以下是连接SQL Server的基本步骤:1.打开SQL Server Management Studio。

2.在连接对话框中输入服务器名称和身份验证方式。

3.如果选择Windows身份验证,直接输入Windows账户信息即可。

4.如果选择SQL Server身份验证,输入用户名和密码。

5.点击“连接”按钮,成功连接到SQL Server。

四、SQL语句基础SQL Server支持使用SQL语句来管理数据库和执行查询操作。

以下是一些常用的SQL语句:1. 创建数据库CREATE DATABASE database_name;使用CREATE DATABASE语句可以创建一个新的数据库,需要指定数据库名称。

2. 创建表CREATE TABLE table_name (column1 datatype,column2 datatype,...);使用CREATE TABLE语句可以创建一个新的表,需要指定表名称和列及其数据类型。

当sqlserver数据量很大时,如何优化表格能加快处理速度

当sqlserver数据量很大时,如何优化表格能加快处理速度

表设计和查询的一些参考1.合理使用索引索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。

现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。

索引的使用要恰到好处,其使用原则如下:●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。

●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。

比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。

如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。

● 使用系统工具。

如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。

在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。

另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。

2.避免或简化排序应当简化或避免对大型表进行重复的排序。

当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。

以下是一些影响因素:●索引中不包括一个或几个待排序的列;●group by或order by子句中列的次序与索引的次序不一样;●排序的列来自不同的表。

为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。

如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。

3.消除对大型表行数据的顺序存取在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。

比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。

SqlServer基本常学语法(索性,触发器等都有)

SqlServer基本常学语法(索性,触发器等都有)

S2_Sql 端口1433第1章1、创建一个数据文件和一个日志文件.create database StuDB--数据裤名称on primary--primary指定是主数据裤文件(name='StuDB_data',--name为数据文件的逻辑称filename='f:\冯建\StuDB_data.mdf',--数据文件的物理名称size=3mb,--数据文件的初始大小maxsize=100mb,--数据文件增长的最大值filegrowth=10%--数据文件的增长率)log on--日志文件,各参数含义同上(name='stuDB_log',filename='f:\冯建\StuDB_log.ldf',size=2mb,filegrowth=1mb)2、删除数据裤..drop database 数据裤名Sql Server 将数据裤的清单存放在master系统数据裤的sysdatabases表中,只需要查看该表中是否存于该数据库中就可以了。

use master--设置当前的数据库为master,以便访问sysdatabases表goif exists(select*from sysdatabases where name='stuDB')drop database stuDBcreate database stuDBon()log on()Exists(查询语句)检测某个查询是否存在。

如果查询语句返回的记录结果不为空,则表示存在;否则表示不存在。

3、创建学员信息表和删除学员信息表--创建学员信息表/*语法carate table 表名(字段 1数据类型列的特征字段2 数据类型列的特征....)*/use stuDBgoif exists(select*from sysobjects where type='u'and name=StuInfo) drop table StuInfo –-删除表的语句create table StuInfo(stuname varchar(20)not null,--学员姓名,非空stuNo char(6)not null,--学号,非空StuID numeric(18,0), --身份证号码,numeric(18,0)代表位数字,小数位数为位stuSeat smallint identity(1,1),--座位号,自动编号(标识列),identity(起始值,递增量)stuAddress text--允许为,住址)4、使用sql语句创建和删除约束添加约束语法:Alter table 表名Add constraint 约束名约束类型具体的约束说明删除约束语法:alter table stuInfodrop constraint 约束名--添加主键约束将stuNO作为主键alter table stuInfoadd constraint PK_stuNo primary key(stuNo)--添加唯一约束(身份证号唯一,建立唯一约束)alter table stuInfoadd constraint UQ_StuID unique(stuID)--添加默认约束(地址默认为“地址不详”)alter table stuInfoadd constraint DF_stuAddress default('地址不详')for stuAddress--添加检查约束(年龄)alter table stuInfoadd constraint CK_stuAge check(Stuage between 15 and 40)--添加外键约束(主表stuInfo和从表StuMarks建立关系,关系字段为stuNO)alter table stuMarksadd constraint FK_stuNO foreign key(stuNO) references stuInfo(stuNO)5.使用SQL语句创建登录1、创建windows登录账户语法:exec sp_grantlogin‘windows域名\域账户’2、创建sql登录账户语法:exec sp_addlogin‘账户名’,’密码’3、创建数据库用户:需调用系统存储过程sp_grantdbaccessexec sp_grantdbaccess ‘登录账户’,’数据库用户’4、给数据库用户授权:常用的权限包括insert,delete,update,select,create table等等语法:grant权限[on 表名] to 数据库用户6、视图和索引---创建索引的语法if exists(select*from sysindexes where name='index_name')create [unique] [clustered] [nonclustered]index index_name on table_name(指定的字段)[withfillfactor=X]--指定按索引查询select*from table_name with(index_name)where [......]--创建视图的语法create view view_nameas<select语句>7、触发器1、语法: if exists(select * from sysobjects where name='trigger_name')drop trigger trigger_namegocreate trigger trigger_nameon table_name[with encryption]for [delete,insert,update]asT-SQL语句Go2、instead of 触发器---以下删除使用instead of触发器实现,原因:after触发器不能删除有主外键关系表的数据create trigger cardInfoDeleteon cardInfoinstead of deleteasset nocount onbegindeclare @cardid char(19)select @cardid=cardid from deletedbegin trandeclare @error intdelete from transinfo where cardid=@cardidset @error=@@errordelete from cardInfo where cardid=@cardidset @error=@@error+@errorif(@error<>0)beginraiserror('删除时出错,',16,1)rollbackendelseendset nocount off3、8、时间查询datediff(时间类型,前面比较小的时间,后面比较大的时间)<=datepart(dw,getdate())。

sql server索引的用法

sql server索引的用法

sql server索引的用法SQL Server索引是一种用于提高查询性能的数据结构。

它可以加速数据的访问速度,减少查询的响应时间。

使用SQL Server索引的主要目的是加快查询操作的速度。

索引可以按照某列或几列的值来排序,这样查询时可以快速定位到需要的数据,而不必扫描整个表。

以下是SQL Server索引的一些常见用法:1. 创建索引:可以通过CREATE INDEX语句在表中创建索引。

可以选择创建唯一索引、聚簇索引、非聚簇索引等不同类型的索引。

2. 删除索引:可以使用DROP INDEX语句删除表中的索引。

删除不再需要的索引可以减少资源的使用和维护成本。

3. 聚簇索引的使用:聚簇索引是按照表的主键创建的一种索引,它决定了表的物理存储顺序。

使用聚簇索引可以提高主键查询的性能。

4. 非聚簇索引的使用:非聚簇索引是按照非主键列的值来创建的索引。

可以根据查询的需要选择适当的列创建索引,以提高查询速度。

5. 覆盖索引的使用:覆盖索引是指包含了查询所需的数据列的索引。

当查询只需要从索引中获取数据时,可以节省I/O操作,提高查询性能。

6. 索引的优化:可以通过查看查询计划和性能监视器等工具,分析索引的使用情况。

根据需要进行索引优化,如添加新索引,删除无用索引,调整索引的顺序等。

7. 统计信息的更新:SQL Server对索引的查询优化依赖于统计信息。

可以使用UPDATE STATISTICS语句更新索引的统计信息,以提高查询计划的准确性。

需要注意的是,索引并不是越多越好,过多的索引可能会增加写操作的开销和存储空间的占用。

在创建索引时需要权衡查询性能和维护成本,并选择合适的索引策略。

SQLServer索引的维护-索引碎片、填充因子第三篇

SQLServer索引的维护-索引碎片、填充因子第三篇

SQLServer索引的维护-索引碎⽚、填充因⼦第三篇 实际上,索引的维护主要包括以下两个⽅⾯: 页拆分 碎⽚ 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故障排除⼯具是⼀样的,因为处理是相同的。

对于⾮常⼩的表(⽐64KB⼩得多),⼀个区中的页⾯可能属于多余⼀个的索引或表---这被称为混合区。

如果数据库中有太多的⼩表,混合区帮助SQL Server节约磁盘空间。

随着表(或索引)增长并且请求超过8个页⾯,SQL Server创建专⽤于该表(或索引)的区并且从该区中分配页⾯。

这样⼀个区被称为统⼀区,它可以为多达8个相同表或索引的页⾯请求服务。

当数据库增长,页拆分,然后删除数据时,就会产⽣碎⽚。

从增长的⽅⾯看,平衡树处理得很不错。

但是对于删除⽅⾯,它并没有太⼤的作⽤。

最终可能会出现这种情况,⼀个页上有⼀条记录,⽽另⼀个页上有⼏个记录。

在这种情况下,⼀个页上保存的数据量只是它能够保存总数据量的⼀⼩部分。

1、碎⽚会造成空间的浪费,SQL Server每次会分配⼀个区段,如果⼀个页上只有⼀条记录,则仍然会分配整个区段。

2、散布在各处的数据会造成数据检索时的额外系统开销。

为了获取需要的10⾏记录,SQL Server不是只加载⼀个页,⽽是可能必须加载10个页来获取相同的信息。

并不只是读取⾏导致了这⼀结果,在读取⾏前,SQL Server必须先读取页。

更多的页意味着更多的⼯作量。

但是碎⽚也不只是有坏处,⽐如⼀个插⼊⾮常频繁的表就很喜欢碎⽚,因为在插⼊数据时⼏乎不⽤担⼼页拆分的问题。

所以⼤量的碎⽚意味着较差的读取性能,但也意味着极好的插⼊性能。

关于碎⽚的理解,找到了数据库⽜⼈CareySon的这篇⽂章,在这⾥消化⼀下 碎⽚分两种,外部碎⽚和内部碎⽚ 外部碎⽚: 外部碎⽚指的是页拆分⽽产⽣的碎⽚。

如向表中插⼊⼀⾏,⽽这⼀⾏导致现有的页空间⽆法容纳新插⼊的⾏,则导致页拆分。

新的页不断随数据的增长⽽产⽣,⽽聚集索引要求⾏之间连续,所以如果聚集索引不是⾃增列,页拆分后和原来的页在磁盘上并不连续-这就是外部碎⽚。

sqlserver update rowindex 语句-概述说明以及解释

sqlserver update rowindex 语句-概述说明以及解释

sqlserver update rowindex 语句-概述说明以及解释1.引言1.1 概述:在SQL Server数据库中,索引起着非常重要的作用,它能够提高查询效率并优化数据检索过程。

索引可以帮助数据库引擎更快地定位和获取所需的数据,从而提升数据库性能。

在实际应用中,我们可能会遇到需要更新索引行号的情况。

这时候就需要使用UPDATE ROWINDEX语句来实现对索引的更新操作。

通过这篇文章,我们将介绍SQL Server中UPDATE ROWINDEX语句的用法,以及在使用该语句时需要注意的事项。

通过学习本文内容,读者将能够更好地掌握SQL Server数据库索引的更新操作,为实际应用提供帮助和指导。

1.2 文章结构:本文将围绕SQL Server中的更新行索引(UPDATE ROWINDEX)语句展开,逐步介绍SQL Server索引的概念和UPDATE ROWINDEX语句的用法。

首先,我们将对SQL Server索引进行概述,包括索引的作用、种类以及在数据库中的重要性。

接着,我们将详细介绍UPDATE ROWINDEX语句的用法,包括语法结构、参数设置和示例操作。

最后,我们将提出使用UPDATE ROWINDEX语句时需要注意的事项,以帮助读者更好地理解和应用该语句。

通过本文的阐述,读者将能够全面了解SQL Server索引和UPDATE ROWINDEX语句的相关知识,并能够正确地应用于实际的数据库管理中。

1.3 目的本文的主要目的是介绍在SQL Server中使用UPDATE ROWINDEX 语句的方法和注意事项。

通过本文的阐述,读者可以了解到如何在SQL Server中更新行索引以优化数据库性能和提高查询效率。

同时,本文还旨在帮助读者更好地理解SQL Server中索引的概念,并提供一些实用的应用建议,帮助读者更好地应用UPDATE ROWINDEX语句进行数据库优化。

通过本文的阐述,读者可以更好地掌握SQL Server中更新行索引的技巧,提高数据库管理的效率和准确性。

sqlserver 数据库加索引语句-概述说明以及解释

sqlserver 数据库加索引语句-概述说明以及解释

sqlserver 数据库加索引语句-概述说明以及解释1.引言1.1 概述数据库索引是一种重要的数据库对象,用于提高数据库查询性能并加速数据检索过程。

在SQL Server数据库中,索引可以被理解为一种排好序的数据结构,它能够快速定位和访问存储在数据库表中的数据行。

通过在数据库表中创建索引,可以大大降低查询的时间复杂度,提高数据库的响应速度。

本文将重点介绍SQL Server数据库中的索引是什么,为什么要使用索引以及如何在数据库中添加索引,旨在帮助读者更好地理解数据库索引的作用和使用方法。

1.2 文章结构"文章结构"部分将介绍整篇文章的组织和内容安排。

通过本部分,读者将了解到文章的逻辑结构和各个章节的主要内容。

在本文中,我们将首先介绍数据库索引的概念和作用,然后重点讨论在SQL Server数据库中为什么需要使用索引。

接着,我们将详细讲解如何在SQL Server数据库中添加索引,包括创建、管理和优化索引的具体步骤。

通过这样的结构安排,读者可以清晰地了解到数据库索引在SQL Server中的重要性和应用方法,从而更好地运用索引来提升数据库的性能和效率。

1.3 目的本文的目的是帮助读者了解在SQL Server 数据库中如何使用索引来提高查询性能。

通过深入探讨数据库索引的概念、作用和添加方法,读者可以学习到如何利用索引来优化数据库查询操作,提高数据的检索速度和查询效率。

同时,读者也能够了解到索引在数据库中的重要性,以及如何根据实际需求和场景来选择合适的索引类型并进行优化,从而更好地实现数据管理和处理的目的。

通过本文的学习,读者将能够深入了解索引在数据库中的应用及其优势,为数据库的设计和性能优化提供有力的支持。

2.正文2.1 什么是数据库索引数据库索引是一种数据结构,用于快速查找数据库表中的特定数据。

索引类似于书籍的目录,它可以帮助数据库引擎快速找到表中特定列的数据。

通过创建索引,可以大大减少数据库查询的时间,提高数据库的性能。

第5章 索引

第5章 索引

第5章 索引 章 下面将分别介绍这几种索引. 1.聚集索引(Clustered Index) 聚集索引是一种指明表数据物理存储顺序的索引. 在聚集索引中,行的物理存储顺序与索引顺序完全相同, 即索引的顺序决定了表中行的存储顺序.表数据按照指 定作为聚集索引的一个或多个键列排序并存储.聚集索 引类似于一本字典,字典按照字母顺序存储信息,并提 供引导字帮助用户快速定位信息的位置,在同一页上找 到数据和它的引导字.相似的,聚集索引含有索引页和 实际数据页,数据页组成聚集索引的最底层(叶子节点), 如图5-3所示.
第5章 索引 章 SELECT 学生图书借阅管理系统 FROM 图书信息 WHERE 图书名称 ='SQL Server 2000数据库实训教程' 如果"图书名称"列上没有索引,那么SQL Server就会 按照表中行的存储顺序一行一行地查询,查看每一行"图 书名称"列是否符合查询条件,这样为了找出满足查询条 件的记录必须访问表中的每一行.对于一个具有成千上万 行的大型表来说,这种全表搜索可能要花费数小时的时间.
第5章 索引 章 当然,并不一定每个节点都如图5-1所示只包含两个 指针.实际上,节点中的每条索引行都含有一个指向其 他节点的指针.图5-2是常规索引结构示意图.
索索索索 1
A~D A~B C~D E~F
A~H 根节节 ቤተ መጻሕፍቲ ባይዱ~H
2
分分 节节
3 G~H
4
A
B
C
D
E
F
G
H
叶叶 节节
图5-1 索引示例
第5章 索引 章
第5章 索引 章
A~B 根 C~D 节 E~F 节 G~H A B … G H

sqlserver创建索引的5种方法

sqlserver创建索引的5种方法

sqlserver创建索引的5种方法一、前言在SQL Server中,索引是提高查询性能的重要手段。

但是,不同的索引创建方式对性能的影响是不同的。

因此,在创建索引时,我们需要根据具体情况选择不同的方式进行操作。

本文将介绍SQL Server中创建索引的5种方法,并详细说明它们的优缺点和适用场景。

二、基础知识在介绍具体方法之前,我们需要了解一些基础知识:1. 索引类型:SQL Server支持聚集索引和非聚集索引两种类型。

2. 索引列:创建索引时需要指定一个或多个列作为索引列。

通常选择经常用于查询条件、排序或分组操作的列作为索引列。

3. 唯一性:唯一性约束可以保证在一个表中每个值只出现一次。

当我们需要根据某个列进行唯一性检查时,可以使用唯一性约束来创建唯一非聚集索引。

4. 覆盖索引:如果查询语句所需的数据都包含在某个非聚集索引中,那么就可以使用该索引来避免扫描整个表而直接返回结果。

这种情况下,该非聚集索引就被称为覆盖索引。

三、方法1:CREATE INDEX语句CREATE INDEX语句是创建索引最基本的方法。

它的语法如下:CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_nameON table_name (column1 [ASC | DESC], column2 [ASC | DESC], ...);其中,index_name是索引名称,table_name是表名,column1、column2等是要作为索引列的列名。

优点:1. 可以根据需要创建聚集索引或非聚集索引。

2. 可以在多个列上创建复合索引。

3. 可以指定索引的唯一性。

缺点:1. 需要手动编写SQL语句,不够方便。

2. 如果需要在多个表中创建相同的索引,需要多次编写SQL语句。

适用场景:CREATE INDEX语句适用于需要自定义索引名称、类型和唯一性约束的情况。

如果只需要简单地为一个表中的某个列创建普通非聚集索引,则可以使用方法2或方法3。

sqlserver 索引的结构

sqlserver 索引的结构

sqlserver 索引的结构
SQL Server索引的结构包括:
1. B树索引结构:这是最常用的索引结构,它使用B树数据结构来存储索引键和相关记录的指针。

B树结构可以让SQL Server快速地查找和检索数据。

2. 哈希索引结构:这种索引结构使用哈希表进行索引,通过计算哈希值找到相关记录。

哈希索引适用于均匀分布的数据集,但是对于有序数据集的查询效率较低。

3. 空间索引结构:这种索引结构适用于带有空间数据类型(如地理信息、二维坐标等)的列。

空间索引使用的是R树或者Q树等数据结构。

4. 全文索引结构:这种索引结构适用于对文本数据进行全文搜索的场景,如文章、博客、论坛等。

全文索引使用的是反向索引。

5. XML索引结构:这种索引结构适用于对XML数据类型进行查询和检索。

XML索引使用的是XPath语言。

SQLServer使用TSQL语句创建索引

SQLServer使用TSQL语句创建索引

SQLServer使用T-SQL语句创建索引CREATE [UNIQUE] [CLUSTERED│NONCLUSTERED]INDEX index_name ON {table│view} (column [ASC│DESC] [,…n])例1:为表jbxx创建一个非聚集索引,索引字段为employee_name,索引名为i_employeenamecreate index i_employeename on jbxx(employee_name)例2:新建一个表,名称为temp,为此表创建一个惟一聚集索引,索引字段为temp_number,索引名为i_temp_number。

use studentCreate table t_temp(temp_number int,temp_name char(10),temp_age int)create unique clustered index i_temp_numberon t_temp(temp_number)例3:为表s创建一个复合索引,使用sex和birthday字段。

Use studentCreate index i_s on s(sex,birthday)(一) 使用企业管理器查看、修改和删除索引的操作在企业管理器中,展开指定的服务器和数据库,右击要创建索引的表,从弹出的快捷菜单中依次选择“所有任务|管理索引”选项,在出现的管理索引对话框中,选择要查看或修改的索引,单击“编辑”按钮,出现“编辑现有索引”对话框。

在该对话框中,可以修改索引的大部分设置,还可以直接修改其SQL脚本,只需单击“编辑SQL”按钮,即可出现“编辑Transact_SQl脚本”对话框,在此可以编辑、分析、执行索引的Transact_SQl脚本。

要在企业管理器中修改索引的名称,需要在表的“属性”对话框中进行。

在企业管理器中,右击要修改名称的表,从弹出的快捷菜单中选择“设计表”选项,在打开的设计表的窗口中,打开表的“属性”对话框,选择“索引/键”选项卡,在此对话框中,先选定要修改索引名称的索引,然后直接在“索引名”文本框中输入心得索引名称替换原来的索引名称。

SQLServer中的聚集索引

SQLServer中的聚集索引

介绍关于聚集索引的一些知识,这里我们使用SQL Server 2008 R2作为开发环境,使用至曲勺示例数据库请到微软官方下载即可。

当一个请求到达数据库的时候,有可能是select ,或者insert,或者update,或者delete , SQL Server只有三种访问数据的方式:1. 访问非聚集索引,避免访问表。

这只发生在索引包含了请求中的所有数据。

2. 通过索引键访问非聚集索引,然后使用标签访问表中的行数据。

3. 忽略非聚集索引,扫描表找到请求的行数据。

这里我们讨论一下clustered in dexes 聚集索引,一个在第二级中提到但是没有展开|的概念。

我们的例子使用的是AdventureWorks数据库的SalesOrderDetail 表,有121317行数据,足够用来显示在一张表中包含聚集索引是多么的好。

表中有两个主键,足够复杂,来证明你在使用聚集索引的时候的一些设计取舍。

示例数据库对于AdventureWorks示例数据库,我们主要使用销售订单部门。

包含5张表:Customer,SalesPers on. Product, SalesOrderHeader, SalesOrderDetailAdventureWorks是微软专门设计的模型数据库,设计的很规范,销售人的信息在三张表中都有:SalesPerson , Employee, Con tact。

在某些情况下,我们会把他们看成是一张表。

下图是这些表之间的关系。

聚集索引我们首先提出下面的问题:如果没有用到非聚集索引,找到表中的一行数据需要做多少工作?在一个没有排序的表中,是不是就需要扫描每一行来查找数据呢?又或者SQLServer的表中的行永远都是有序的,方便快速的定位要查询的数据,就像使用非聚集索引那样通过入口来快速定位数据呢?答案依赖于你是否在SQL Server的表中建立了聚集索引。

不同于非聚集索引,非聚集索引是独立的对象,有自己的存储空间,聚集索引和表是同一个。

SQL Server基础:索引

SQL Server基础:索引
字段上只有【男】或【女】两个不同值,因此就无需建立索引,如建立索引,不但不会提高查询效率,反而会严重降低更新速度。
具有以下特点的查询可以考虑使用非聚集索引:
(1).使用JOIN或者GROUP BY子句,应为连接和分组操作中所涉及的列创建多个非聚集索引,为任何外键创建一个聚集索引.
(2).包含大量唯一值的字段。
(3).不返回大型结果集的查询。创建筛选索引以覆盖从大型表中返回定义完善的的行子集的查询。
(4).经常包含在查询的搜索条件(如返回完全匹配的WHERE子句)中的列。
2.非聚集索引
非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页中的数据按列排序,非聚集索引包含索引键值和指向表数据存储位置的行定位器。
可以对表或索引视图创建多个非聚集索引。通常,设计非聚集索引是为了改善经常使用的、没有建立聚集索引的查询的性能。
查询优化器在搜索数据值时,先搜索非聚集索引以找到数据值在表中的位置,然后直接从该位置检索数据。这使得非聚集索引成为完全匹配查询的最佳选择,因为索引中包含搜索的数据值在表中的精确位置的项。
XML索引:是与XML数据关联的索引形式,是XML二进制大对象(BLOB)的已拆分持久表示形式,XML索引可以分为主索引和辅助索引。
三:索引的设计原则
索引设计不合理或者缺少索引都会对数据库和应用程序的性能造成障碍,高效的索引对于获得良好的性能非常重要。设计索引时,应该考虑以下原则:
(1).索引并非越多越好,一个表中如果有大量的索引,不仅占用大量的磁盘空间,而且会影响INSERT、DELETE、UPDATE等语句的性能。因为当表中数据更改的同时,索引也会进行调整和更新。
回到顶部
二:索引的分类
不同数据库中提供了不同的索引类型,SQL Server中的索引有两种:聚集索引和非聚集索引。它们的区别是在物理数据的存储方式上。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SQLServer索引结构及其使用(三)实现小数据量和海量数据的通用分页显示存储过程建立一个 Web 应用,分页浏览功能必不可少。

这个问题是数据库处理中十分常见的问题。

经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。

但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存。

游标一建立,就将相关的记录锁住,直到取消游标。

游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作。

而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等待甚至死机。

更重要的是,对于非常大的数据模型而言,分页检索时,如果按照传统的每次都加载整个数据源的方法是非常浪费资源的。

现在流行的分页方法一般是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。

最早较好地实现这种根据页面大小和页码来提取数据的方法大概就是“俄罗斯存储过程”。

这个存储过程用了游标,由于游标的局限性,所以这个方法并没有得到大家的普遍认可。

后来,网上有人改造了此存储过程,下面的存储过程就是结合我们的办公自动化实例写的分页存储过程:CREATE procedure pagination1(@pagesize int, --页面大小,如每页存储20条记录@pageindex int --当前页码)asset nocount onbegindeclare @indextable table(id int identity(1,1),nid int) --定义表变量declare @PageLowerBound int --定义此页的底码declare @PageUpperBound int --定义此页的顶码set @PageLowerBound=(@pageindex-1)*@pagesizeset @PageUpperBound=@PageLowerBound+@pagesizeset rowcount @PageUpperBoundinsert into @indextable(nid) select gid from TGongwenwhere fariqi >dateadd(day,-365,getdate()) order by fariqi desc select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t where O.gid=t.nid and t.id>@PageLowerBoundand t.id<=@PageUpperBound order by t.idendset nocount off以上存储过程运用了SQL SERVER的最新技术――表变量。

应该说这个存储过程也是一个非常优秀的分页存储过程。

当然,在这个过程中,您也可以把其中的表变量写成临时表:CREATE TABLE #Temp。

但很明显,在SQL SERVER中,用临时表是没有用表变量快的。

所以笔者刚开始使用这个存储过程时,感觉非常的不错,速度也比原来的ADO的好。

但后来,我又发现了比此方法更好的方法。

笔者曾在网上看到了一篇小短文《从数据表中取出第n条到第m条的记录的方法》,全文如下:从publish 表中取出第 n 条到第 m 条的记录:SELECT m-n+1 *FROM publishWHERE (id NOT IN(SELECT n-1 idFROM publish))id 为publish 表的关键字我当时看到这篇文章的时候,真的是精神为之一振,觉得思路非常得好。

等到后来,我在作办公自动化系统(+ C#+SQL SERVER)的时候,忽然想起了这篇文章,我想如果把这个语句改造一下,这就可能是一个非常好的分页存储过程。

于是我就满网上找这篇文章,没想到,文章还没找到,却找到了一篇根据此语句写的一个分页存储过程,这个存储过程也是目前较为流行的一种分页存储过程,我很后悔没有争先把这段文字改造成存储过程:CREATE PROCEDURE pagination2(@SQL nVARCHAR(4000), --不带排序语句的SQL语句@Page int, --页码@RecsPerPage int, --每页容纳的记录数@ID VARCHAR(255), --需要排序的不重复的ID号@Sort VARCHAR(255) --排序字段及规则)ASDECLARE @Str nVARCHAR(4000)SET @Str=''SELECT ''+CAST(@RecsPerPage AS VARCHAR(20))+'' * FROM(''+@SQL+'') T WHERE T.''+@ID+''NOT IN (SELECT ''+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+'' ''+@ID+'' FROM (''+@SQL+'') T9 ORDER BY ''+@Sort+'') ORDER BY ''+@SortPRINT @StrEXEC sp_ExecuteSql @StrGO其实,以上语句可以简化为:SELECT 页大小 *FROM Table1 WHERE (ID NOT IN (SELECT 页大小*页数 id FROM 表 ORDER BY id)) ORDER BY ID但这个存储过程有一个致命的缺点,就是它含有NOT IN字样。

虽然我可以把它改造为:SELECT 页大小 *FROM Table1 WHERE not exists(select * from (select top (页大小*页数) * from table1 order by id) b where b.id=a.id )order by id即,用not exists来代替not in,但我们前面已经谈过了,二者的执行效率实际上是没有区别的。

既便如此,用结合NOT IN的这个方法还是比用游标要来得快一些。

虽然用not exists并不能挽救上个存储过程的效率,但使用SQL SERVER中的关键字却是一个非常明智的选择。

因为分页优化的最终目的就是避免产生过大的记录集,而我们在前面也已经提到了的优势,通过即可实现对数据量的控制。

在分页算法中,影响我们查询速度的关键因素有两点:和NOT IN。

可以提高我们的查询速度,而NOT IN会减慢我们的查询速度,所以要提高我们整个分页算法的速度,就要彻底改造NOT IN,同其他方法来替代它。

我们知道,几乎任何字段,我们都可以通过max(字段)或min(字段)来提取某个字段中的或最小值,所以如果这个字段不重复,那么就可以利用这些不重复的字段的max或min 作为分水岭,使其成为分页算法中分开每页的参照物。

在这里,我们可以用操作符“>”或“<”号来完成这个使命,使查询语句符合SARG形式。

如:Select top 10 * from table1 where id>200于是就有了如下分页方案:select top 页大小 *from table1where id>(select max (id) from(select top ((页码-1)*页大小) id from table1 order by id) as T)order by id在选择即不重复值,又容易分辨大小的列时,我们通常会选择主键。

下表列出了笔者用有着1000万数据的办公自动化系统中的表,在以GID(GID是主键,但并不是聚集索引。

)为排序列、提取gid,fariqi,title字段,分别以第1、10、100、500、1000、1万、10万、25万、50万页为例,测试以上三种分页方案的执行速度:(单位:毫秒)页码方案1 方案2 方案3 1 60 30 76 10 46 16 63 100 1076 720 130 500 540 12943 83 1000 17110 470 250 10000 24796 4500 140 100000 38326 42283 1553 250000 28140 128720 2330 500000 121686 127846 7168 从上表中,我们可以看出,三种存储过程在执行100页以下的分页命令时,都是可以信任的,速度都很好。

但第一种方案在执行分页1000页以上后,速度就降了下来。

第二种方案大约是在执行分页1万页以上后速度开始降了下来。

而第三种方案却始终没有大的降势,后劲仍然很足。

在确定了第三种分页方案后,我们可以据此写一个存储过程。

大家知道SQL SERVER 的存储过程是事先编译好的SQL语句,它的执行效率要比通过WEB页面传来的SQL语句的执行效率要高。

下面的存储过程不仅含有分页方案,还会根据页面传来的参数来确定是否进行数据总数统计。

--获取指定页的数据:CREATE PROCEDURE pagination3@tblName varchar(255), -- 表名@strGetFields varchar(1000) = ''*'', -- 需要返回的列@fldName varchar(255)='''', -- 排序的字段名@PageSize int = 10, -- 页尺寸@PageIndex int = 1, -- 页码@doCount bit = 0, -- 返回记录总数, 非 0 值则返回@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序@strWhere varchar(1500) = '''' -- 查询条件 (注意: 不要加 where)ASdeclare @strSQL varchar(5000) -- 主语句declare @strTmp varchar(110) -- 临时变量declare @strOrder varchar(400) -- 排序类型if @doCount != 0beginif @strWhere !=''''set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere elseset @strSQL = "select count(*) as Total from [" + @tblName + "]"end--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。

相关文档
最新文档