MSSQL常用SQL语句

0    170    1

Tags:

👉 本文共约8484个字,系统预计阅读时间或需32分钟。

目录

SQL Server对象查询(只查询当前数据库)

检查数据库完整性

通过加tablock提高速度

数据库重命名、修改恢复模式、修改用户模式

数据库重命名

设置数据库为完整恢复模式

只允许一个用户访问数据库

只有sysadmin,dbcreator,db_owner角色的成员可以访问数据库

多用户模式

移动文件

–由于在SQL Server中文件组、文件不能离线
–所以必须把整个数据库设置为离线

–修改文件名称

–把原来的文件复制到新的位置:‘D:\WC\WC_FG8.NDF’

–设置数据库在线

扩展数据库:增加文件组、增加文件、修改文件大小、修改文件的逻辑名称

添加文件组

添加数据文件

添加日志文件

修改数据文件的大小,增长大小,最大大小

修改数据文件或日志文件的逻辑名称

设置默认文件组、只读文件组

–设置默认文件组

–设为只读文件组
–如果文件已经是某个属性,不能再次设置相同属性

收缩数据库、收缩文件

–收缩数据库

–收缩文件

重新生成索引

查看实例名

查看数据库属性

查看数据库恢复模式

查看日志空间

系统函数

app_name()函数返回当前从SQL Server请求数据的应用程序名称。
SYSDATETIME()函数返回SQL Server上的当前时间。
host_name()函数确定是哪台工作站正在连接到SQL Server。
system_user函数提供正在连接的用户的登陆名
db_name()告诉你连接是哪个数据库

如:select app_name()

查看数据文件

查询缓存中具体的执行计划,及对应的SQL

–查看缓存中具体的执行计划,及对应的SQL语句

查询缓存的各类执行计划,及分别占了多少内存

–查看缓存的各类执行计划,及分别占了多少内存

查询当前数据库缓存的所有数据页面,哪些数据表,缓存的数据页面数量

查询SqlServer总体的内存使用情况

查询SQLSERVER内存使用情况

看BUFFER POOL中,都缓存了哪些表(当前数据库)的数据

查看缓存中重用次数少,占用内存大的查询语句(当前缓存中未释放的)–全局

查看当前占用 cpu 资源最高的会话和其中执行的语句(及时CPU)

查询会话中有多少个worker在等待

查看当前数据库用户连接

查看数据库大小

查看数据库可用大小,已使用大小

SQL优化相关、执行时间

查看索引碎片

也可由sys.dm_db_index_physical_stats视图来代替。

对上面的结果说明:

统计信息描述
扫描页数表或索引中的页数。
扫描区数表或索引中的区数。
区切换次数遍历表或索引的页时,DBCC 语句从一个区移动到另一个区的次数。
每个区的平均页数页链中每个区的页数。
扫描密度 [最佳计数:实际计数]百分比。 这是“最佳计数”与“实际计数”的比率。 如果所有内容都是连续的,则该值为 100;如果该值小于 100,则存在一些碎片。 “最佳计数”是指所有内容连续链接时理想的盘区更改次数。 “实际计数”是指实际的盘区更改次数。
逻辑扫描碎片扫描索引的叶级页时返回的出错页的百分比。 此数与堆无关。 对于出错页,分配给索引的下一个物理页不是当前叶级页中的下一页指针所指向的页。
区扫描碎片扫描索引的叶级页时出错区所占的百分比。 此数与堆无关。对于出错区,包含当前索引页的区在物理上不是包含上一个索引页的区的下一个区。 注意:如果索引涉及多个文件,则此数字毫无意义。
每页的平均可用字节数扫描的页上平均可用字节数。 此数字越大,则页的填充程度越低。 如果索引不会有很多随机插入,则数字越小越好。 此数字还受行大小影响:行越大,此数字就越大。
平均页密度(满)页的平均密度,以百分比表示。 该值会考虑行大小。 因此,该值可以更准确地指示页的填充程度。 百分比越大越好。

–如果指定了FAST,那么则显示以下几列信息:

  • 扫描页数
  • 区切换次数
  • 扫描密度 [最佳计数:实际计数]
  • 区扫描碎片
  • 逻辑扫描碎片

–如果指定了 TABLERESULTS,会多显示以下几列信息

统计信息描述
Object Name处理的表或视图的名称。
ObjectId对象名的 ID。
IndexName处理的索引的名称。 堆的 IndexName 为 NULL。
IndexId索引的 ID。 堆的 IndexId 为 0。
Level索引的级别。 级别 0 是索引的叶(或数据)级。堆的级别为 0。
Pages组成某个索引级别或整个堆的页数。
Rows某个索引级别上的数据或索引记录数。 对于堆,此值是整个堆中的数据记录数。对于堆,此函数返回的记录数可能与通过对堆运行 SELECT COUNT(*) 返回的行数不匹配。 这是因为一行可能包含多个记录。 例如,在某些更新情况下,单个堆行可能由于更新操作而包含一条前推记录和一条被前推记录。 此外,多数大型 LOB 行在 LOB_DATA 存储中拆分为多个记录。
MinimumRecordSize某个索引级别或整个堆中的最小记录大小。
MaximumRecordSize某个索引级别或整个堆中的最大记录大小。
AverageRecordSize某个索引级别或整个堆中的平均记录大小。
ForwardedRecords该索引级别或整个堆中的被前推记录数。
Extents某个索引级别或整个堆中的区数。
ExtentSwitches遍历表或索引的页时,DBCC 语句从一个区移动到另一个区的次数。
AverageFreeBytes扫描的页上平均可用字节数。 此数字越大,则页的填充程度越低。 如果索引不会有很多随机插入,则数字越小越好。 此数字还受行大小影响:行越大,此数字就越大。
AveragePageDensity页的平均密度,以百分比表示。 该值会考虑行大小。 因此,该值可以更准确地指示页的填充程度。 百分比越大越好。
ScanDensity百分比。 这是“BestCount”与“ActualCount”的比率。 如果所有内容都是连续的,则该值为 100;如果该值小于 100,则存在一些碎片。
BestCount所有内容连续链接时的区更改理想数量。
ActualCount区更改实际数量。
LogicalFragmentation扫描索引的叶级页时返回的出错页的百分比。 此数与堆无关。 对于出错页,分配给索引的下一个物理页不是当前叶级页中的下一页指针所指向的页。
ExtentFragmentation扫描索引的叶级页时出错区所占的百分比。 此数与堆无关。 对于出错区,包含当前索引页的区在物理上不是包含上一个索引页的区的下一个区。 注意:如果索引涉及多个文件,则此数字毫无意义。

– 如果索引的碎片非常多,可选择以下方法来减少碎片:

  • 删除然后重新创建聚集索引。
    重新创建聚集索引将重新组织数据,从而使数据页填满。 填充度可以使用 CREATE INDEX 中的 FILLFACTOR 选项进行配置。 这种方法的缺点是索引在删除/重新创建周期内为脱机状态,并且该操作是一个整体,不可中断。 如果中断索引创建,则不能重新创建索引。
  • 对索引的叶级页按逻辑顺序重新排序。
    使用 INDEX…REORGANIZE 对索引的叶级页按逻辑顺序重新排序。 由于此操作是联机操作,因此语句运行时索引可用。 此外,中断该操作不会丢失已完成的工作。 这种方法的缺点是在重新组织数据方面没有聚集索引的删除/重新创建操作有效。
  • 重新生成索引。
    使用 REBUILD 和 ALTER INDEX 重新生成索引。

–索引的碎片级别可通过以下方式确定:

  • 比较“区切换次数”和“扫描区数”的值。
    “区切换次数”的值应尽可能接近“扫描区数”的值。 此比率将作为“扫描密度”值计算。 此值应尽可能的大,可通过减少索引碎片得到改善。
  • 了解“逻辑扫描碎片”和“区扫描碎片”的值。
    “逻辑扫描碎片”和“区扫描碎片”(对于较小的盘区)的值是表的碎片级别的最好指标。 这两个值应尽可能接近零,但 0% 到 10% 之间的值都是可接受的。

具体例子

  • A. 显示表的碎片信息
    下面的示例将显示 Employee 表的碎片信息。

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
  • B. 使用 OBJECT_ID 获得表 ID,使用 sys.indexes 获得索引 ID
    以下示例使用 OBJECT_ID 和 sys.indexes 目录视图,以获取 AdventureWorks2012 数据库中 Production.Product 表的 AK_Product_Name 索引的表 ID 和索引 ID。

  • C. 显示表的简略结果集
    以下示例会返回 AdventureWorks2012 数据库中 Product 表的简略结果集。
    SQL

  • D. 显示数据库中每个表的每个索引的完整结果集
    下面的示例将返回 lhrdb 数据库中每个表的每个索引的完整表结果集。
    SQL

  • E. 使用 DBCC SHOWCONTIG 和 DBCC INDEXDEFRAG 对数据库中的索引进行碎片整理
    下面的一个例子是如果数据库中碎片数量指定阈值之上的时,会对所有索引进行碎片整理。
    SQL

查看指定表的索引信息

  • avg_fragmentation_in_percent 的值应尽可能接近零。 但是,从 0 到 10% 范围内的值都可以接受。

语法

重新生成或重新组织索引

自动重新组织或重新生成数据库中平均碎片超过 10% 的所有分区。

查看索引使用情况

包括扫描次数,最近使用时间等信息

统计信息

包括创建,删除,修改,更新统计信息.

注:默认情况下,数据库已经生成了必要的统计信息。如果不是特殊需要,不需要单独创建统计信息,因为一旦创建了统计信息,那么数据库会定期的去更新统计信息,会造成一定的资源浪费。

创建

修改
无法通过SQL语句来修改,只能通过删除,再添加的方式。所以直通通过SSMS工具来

查看

重命名
一般情况不建议修改名称,要么就直接删除再重新创建一个。

更新
可通过UPDATE STATISTICS语句或sp_updatestats存储过程来更新统计信息。
更新该表上所有索引的统计信息

更新数据库中所有表的统计信息

自动索引和统计信息管理

微软在Github上提供了一个脚本,用于自动管理索引和统计信息。
地址
其实就是创建一个存储过程对一个或多个数据库的一个或多个索引和统计信息执行智能碎片整理。简而言之,这个过程自动选择是根据索引的碎片级别,还是根据其他参数(如是否允许页锁或lob的存在)重新构建或重新组织索引,同时使用线性阈值更新统计信息。所有这些都在您选择的指定时间范围内,默认为8小时。还可以根据大小、碎片级别或索引使用(基于范围扫描计数)设置碎片整理优先级,这是默认设置。它还处理分区索引、columnstore索引、内存表中的索引、统计信息更新(表范围内的或仅与索引相关的)、使用原始填充因子或索引填充进行重新构建以及在线操作,等等。
环境要求
支持SQL Server 2005 SP2及之后的版本。

注:不保证可以在SQL Server 2005版本中正常运行。

安装
直接在SSMS中运行脚本即可。如:
由于脚本太长,需要看脚本内容的朋友自己去网上查看:https://github.com/Microsoft/tigertoolbox/blob/master/AdaptiveIndexDefrag/usp_AdaptiveIndexDefrag.sql

输出信息:

上面表示已经安装成功了。

使用
存储过程支持参数还是很多的,我这里只介绍其中几个常用的。其他参数,请查看官方的文档:
https://github.com/Microsoft/tigertoolbox/blob/master/AdaptiveIndexDefrag/OPTIONS.md

  • @Exec_Print:默认是1(执行存储过程生成的SQL命令),0表示不执行(仅显示)。
  • @printCmds :默认是0(不打印SQL命令),1(打印SQL命令)。如果只想查看哪些命令要执行,这个选项很有用。
  • @outputResults:默认0(不输出碎片信息),1表示命令执行完后会显示碎片信息。
  • @timeLimit :用于限制用于整理索引碎片的时间。默认:8小时。当然如果一个很大的索引,还是可能会超过8小时的。
  • @dbScope:指定要整理碎片的数据库。如果不指定,则整理所有非系统数据库,包括msdb,model。
  • @tblName:指定要整理碎片表的索引。如果不指定,则整理数据库中所有表。格式:schema.table_name。
  • @minFragmentation:默认5%,低于5%将不会被整理碎片。
  • @rebuildThreshold:默认30%,高于30%将会被重建。而不是重新组织。
  • @scanMode指定使用哪种扫描模式来确定碎片级别。LIMITED模式是默认模式。扫描最小数量的页面。对于索引,只扫描b树的父级页面(即叶级以上的页面)。对于堆,只检查相关的PFS和IAM页面。没有扫描堆的数据页。其他选项包括SAMPLED(根据索引或堆中所有页面的1%的样本返回统计信息)或DETAILED(扫描所有页面并返回所有统计信息)。可能导致性能问题)。如果索引或堆的页数少于10,000,则自动使用DETAILED模式而不是SAMPLED模式。
  • @onlineRebuild:默认0(离线重建),1表示在线重建。

–下面结合几个例子来说明一下:

  • 全部采用默认值,整理碎片:
    EXEC dbo.usp_AdaptiveIndexDefrag
    默认设置是对碎片大于5%的索引进行碎片整理; 重建碎片大于30%的索引; 整理所有索引; 命令将自动执行; 以DESC顺序对RANGE_SCAN_COUNT值进行碎片整理; 规定时限,为480分钟(8小时); 所有数据库都将进行碎片整理; 所有表都将进行碎片整理; 将重新扫描索引; 扫描将以限定模式执行; LOB将被压缩; 将defrags限制为超过8页的索引; 索引将进行碎片整理OFFLINE; 索引将在DATABASE中排序; 索引将具有其原始填充因子; 如果大于8页,则仅考虑最右侧填充的分区; 统计数据将在重组指数上更新; 碎片整理将使用处理器的系统默认值; 不打印t-sql命令; 不输出碎片级别; 在索引操作之间等待5秒;

注意:慎用。执行需要时间过长,而且默认情况下是离线重建索引。

  • 指定数据库

  • 指定数据库,表

  • 只显示命令,不会运行命令去整理碎片

结果:

查看缺少的索引

通过脚本来查看由于缺少索引而导致查询缓慢的表,并生成相应的索引创建语句。
脚本内容:https://github.com/Microsoft/tigertoolbox/blob/master/Index-Creation/view_IndexCreation.sql
直接运行脚本即可

ALTER DATABASE 语法

A. 向数据库中添加文件

以下示例将一个 5 MB 的数据文件添加到 AdventureWorks2012 数据库。

B. 向数据库中添加由两个文件组成的文件组

以下示例在 AdventureWorks2012 数据库中创建文件组 Test1FG1,然后将两个 5 MB 的文件添加到该文件组。

C. 向数据库中添加两个日志文件

下面的示例向 AdventureWorks2012 数据库中添加两个 5 MB 的日志文件。

D. 从数据库中删除文件

以下示例删除示例 B 中添加的一个文件。

E. 修改文件

以下示例增加示例 B 中添加的一个文件的大小。

  • 带有 MODIFY FILE 命令的 ALTER DATABASE 只能增大文件大小,因此,如果需要缩小文件大小,则需使用 DBCC SHRINKFILE。

  • 此示例将数据文件的大小缩小为 100 MB,然后指定该数量的大小。

F. 将文件移至新位置

以下示例将在示例 A 中创建的 Test1dat2 文件移至新目录中。

备注

必须先将该文件实际移至新目录中,然后才能运行此示例。 然后,停止和启动 SQL Server 的实例,或使 AdventureWorks2012 数据库 OFFLINE 再 ONLINE,以实施更改。

G. 将 tempdb 移至新位置

以下示例将 tempdb 从其在磁盘上的当前位置移至另一个磁盘位置。 由于每次启动 MSSQLSERVER 服务时都会重新创建 tempdb,因此您不必实际移动数据和日志文件。 在步骤 3 中重新启动服务时,将创建这些文件。 在重新启动该服务之前,tempdb 将继续在现有位置发挥作用。

  • 确定 tempdb 数据库的逻辑文件名称以及这些文件在磁盘上的当前位置。

  • 使用 ALTER DATABASE更改每个文件的位置。

停止再重新启动 SQL Server的实例。

  • 验证文件更改。

将 tempdb.mdf 和 templog.ldf 文件从其原始位置中删除。

H. 使文件组成为默认文件组

以下示例使示例 B 中创建的 Test1FG1 文件组成为默认文件组。 然后,默认文件组被重置为 PRIMARY 文件组。 请注意,必须使用括号或引号分隔 PRIMARY。

I. 使用 ALTER DATABASE 添加文件组

以下示例将一个包含 FILEGROUP 子句的 FILESTREAM 添加到 FileStreamPhotoDB 数据库。

以下示例将一个包含 FILEGROUP 子句的 MEMORY_OPTIMIZED_DATA 添加到 xtp_db 数据库。 该文件组存储内存优化数据。

J. 更改文件组,以便当文件组中的某个文件达到自动增长阈值时,文件组中的所有文件都会增长

以下示例会生成所需的 ALTER DATABASE 语句,以使用 AUTOGROW_ALL_FILES 设置修改读写文件组。

参考

https://blog.csdn.net/qianglei6077/article/details/86576301

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复