Microsoft SQL Server性能调校

2023-10-25 15:58

本文主要是介绍Microsoft SQL Server性能调校,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【书名    】:Microsoft SQL Server性能调校
【出版社  】:电子工业出版社
【作者    】:胡百敬
【评价    】:★★★☆☆☆☆☆☆☆
【正文    】:

----------------------------------------------------------------------------------------------------
0001:
    判断力。
----------------------------------------------------------------------------------------------------
0002:
    技术可以教,而艺术不能教。
----------------------------------------------------------------------------------------------------
0003:
    性能问题的症结通常不是表象所显示出来的。从不同的方面去看,往往会有不同的解释。最简单的例子,当你
看到CPU很忙,长时间处于百分之百的使用率,可能直觉就是CPU性能不足。但其实可能是硬盘性能不足,或是内存
容量不够,让CPU一直忙于I/O。
----------------------------------------------------------------------------------------------------
0004:
    要有好的开发团队绝非一蹴而就,需要有长时间的培养,每个成员都有充足的培训训练,彼此有充分的合作默
契,如此才能产生出有效的系统。
----------------------------------------------------------------------------------------------------
0005:
    数据库不应该让前端程序代码直接存取数据表,而要通过视图,存储过程或用户自定义函数来存储,这样可以
提高数据表重新设计的自由度。
----------------------------------------------------------------------------------------------------
0006:
    做性能调校的第一项工作应该是建立性能的基线,它可能代表着调校前系统的各种数据,或是用户希望达到的
基本目标值,也可能是昔日系统正常运行时的某些数据值。基线就是用来做比较的,任何性能调校的动作都应该是
做数据的比较,不要诉诸情绪。
----------------------------------------------------------------------------------------------------
0007:
    成本意识。
----------------------------------------------------------------------------------------------------
0008:
    事前的整体评估很重要。
----------------------------------------------------------------------------------------------------
0009:
    最怕的就是像无头苍蝇盲目的错误尝试(trial and error)。
----------------------------------------------------------------------------------------------------
0010:
    判断专业与否就是看你是否可以立刻问到重点,而不是来来回回,反反复复问相同的问题。
----------------------------------------------------------------------------------------------------
0011:
    若无法简明的描述问题,代表你尚不了解问题,或者是没有抓到重点。
----------------------------------------------------------------------------------------------------
0012:
    最早开始的,最晚结束。
----------------------------------------------------------------------------------------------------
0013:
    谋定而后动。
----------------------------------------------------------------------------------------------------
0014:
    花现在的时间可以节省未来的时间(spend time now to save time later)。
----------------------------------------------------------------------------------------------------
0015:
    压垮骆驼的最后一根稻草。
----------------------------------------------------------------------------------------------------
0016:
    头痛医头,脚痛医脚。
----------------------------------------------------------------------------------------------------
0017:
    虽然我们要三思而行,但你依然要顾及到用户的感受,否则迟迟没有行动,甚至是搜集了太多的信息反而不知
道从哪里开始,用户在找你一段时间之后仍不见改善,会失去耐心。因此你要在取得信息、信息分析、构想计划、
谨慎执行、反省接口,以及安抚用户中取得平衡,这是很困难的一件事。
----------------------------------------------------------------------------------------------------
0018:
    尽量不要让数据库的文件与操作系统交换文件放在同一个物理硬盘上,这样容易抢硬盘。
----------------------------------------------------------------------------------------------------
0019:
    “事件探查器”可以用来跟踪SQL语句的执行情况,包括执行时的各种数据。
----------------------------------------------------------------------------------------------------
0020:
    DBCC:Database Console Command
----------------------------------------------------------------------------------------------------
0021:
    同步服务器与计算机的时间:net time \\服务器IP /set
----------------------------------------------------------------------------------------------------
0022:
    清除共享连接:net use * /del
----------------------------------------------------------------------------------------------------
0023:
    UNION ALL:不删除重复行,UNION的列中可以是大数据类型。
    UNION:删除重复行,UNION的列中不能是text、image等大数据类型。
----------------------------------------------------------------------------------------------------
0024:
    大量批处理数据操作时,若采用没有log行为一定比逐条数据由两次写入,先记录log后再写到数据库的操作为
快;因此将数据放入到新的数据表,SELECT...INTO一定比逐条做INSERT快;清空数据表TRUNCATE TABLE也一定比
DELETE快。
----------------------------------------------------------------------------------------------------
0025:
    调用存储过程时,如果指定了存储过程的所有者,则能节省搜索存储过程的时间。
----------------------------------------------------------------------------------------------------
0026:
    列出当前数据中各数据表的数据量:
    SET NOCOUNT ON
    DECLARE @db VARCHAR(20)
    SET @db = DB_NAME()
    DBCC UPDATEUSAGE(@db) WITH NO_INFOMSGS
    GO
    CREATE TABLE #tbl
    (
     表名 VARCHAR(50) null,
     条数 INT null,
     保留空间 VARCHAR(50) null,
     数据占用空间 VARCHAR(50) null,
     索引占用空间 VARCHAR(50) null,
     未使用空间 VARCHAR(50) null
    )
    DECLARE @tblName VARCHAR(50)

    DECLARE curTbls CURSOR FOR
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'

    OPEN curTbls
    FETCH NEXT FROM curTbls INTO @tblName

    WHILE @@FETCH_STATUS = 0
     BEGIN
      INSERT #tbl EXEC sp_spaceused @tblName
      FETCH NEXT FROM curTbls INTO @tblName
     END

    CLOSE curTbls
    DEALLOCATE curTbls

    SELECT * FROM #tbl ORDER BY CONVERT(INT,LEFT(保留空间,LEN(保留空间)-2)) DESC

    DROP TABLE #tbl
----------------------------------------------------------------------------------------------------
0027:
    Northwind..sp_Rebuild:注意..是不能省略一个的。数据库名..对象名
----------------------------------------------------------------------------------------------------
0028:
    重新建立索引:DBCC DBREINDEX([tblA])
----------------------------------------------------------------------------------------------------
0029:
    一般来说,存储过程会放在某个用户自定义的数据库中,供使用该数据库数据的连接可以存取,或是命名存储
过程时,以“SP_”开头放在master系统数据库中,则所有的用户不管连接落在哪一个数据库,都可以调用(注意,
并不是以“SP_”就是全局存储过程,还必须放在master数据库中)。
----------------------------------------------------------------------------------------------------
0030:
    假设客户数据表中有一百万记录,而我们需要找寻:
    SELECT * FROM Customer WHERE CustomerID = 1
    若没有索引,则需要比较一百万次,若有以CustomerID字段建立的索引,则因为索引键值数据都必定以B-Tree
结构有顺序的摆放,所以可采用二分查找法找数据。也就是2的n次方大于记录数,就可以找到该笔数据。而2的20次
方大于一百万,因此最多20次查找就能找到。索引和非索引的性能的差距就非常大了。
----------------------------------------------------------------------------------------------------
0031:
    选择性:代表符合你查询条件的记录占总记录的百分比。选择性越高(也就是这个比例越小),越适合采用索
引。在选择性比较低的时候,通过非聚集索引存储是非常没有效率的存储方式,还不如直接做数据表扫描。
----------------------------------------------------------------------------------------------------
0032:
    在连接两个表时,选择性高的数据库适合做内表,选择性低的适合做外表。
----------------------------------------------------------------------------------------------------
0033:
    视图也可以建立索引,但是必须先有一个聚集索引,才能建立非聚集索引。且删除聚集索引的时候,同时删除
非聚集索引。
----------------------------------------------------------------------------------------------------
0034:
    含有不确定数值的列(视图中),不能建立索引,例如有GetDate()函数的列。
----------------------------------------------------------------------------------------------------
0035:
    执行事务之前,应该先设置锁超时(防止死锁):
    SET LOCK_TIMEOUT 500 --单位是ms
----------------------------------------------------------------------------------------------------
0036:
    要有习惯重新察看原先的代码,才能精益求精。
----------------------------------------------------------------------------------------------------
0037:
    重构是提高的很好方式。
----------------------------------------------------------------------------------------------------
0038:
    在开发过程中就应当考虑性能问题,而不是马后炮。
----------------------------------------------------------------------------------------------------
0039:
    sp_executesql存储过程与EXECUTE语法的功能相似。但sp_executesql可以缓存执行计划,供多人使用,性能会
高一些。
----------------------------------------------------------------------------------------------------

这篇关于Microsoft SQL Server性能调校的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/283606

相关文章

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分