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双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是