摘要:
某时,创建了多个tempDB文件,已经超过了服务器核心数,现象删除tempDB文件,使其保持与CPU核心数相同。但是在删除的时候,发现无法删除,报出错误:无法删除文件“tempdev3”,因为它不能为空(Microsoft SQL Server,错误:5042) 此时,使用脚本查看数据和日志文件使用 阅读全文
摘要:
在编写SQL批处理或存储过程代码的过程中,经常会碰到有些业务逻辑的处理,需要对满足条件的数据记录逐行进行处理,这个时候,大家首先想到的方案大部分是用“游标”进行处理。 举个例子,在订单管理系统中,客服需要对订单日期为2012-09-01的销售订单进行某个批量操作,比如批量发货操作,后台业务逻辑处理时 阅读全文
摘要:
---从计划缓存中直接获取查询计划和参数: DECLARE @dbname NVARCHAR(256), @procname NVARCHAR(256) SELECT @dbname = 'hydee_连锁', @procname = 'dbo.p_select_ware'; WITH basedata AS ( SELECT qs.s... 阅读全文
摘要:
前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用。此时,你需要尽快侦测和处理这类问题。 死锁是当两个或者以上的事务互相阻塞引起的。在这种情况下两个事务会无限期地等待对方释放资源以便操作。下面是死锁的示意图: 本文将使用SQLServer Profiler来跟踪死锁。 准备工作: 为了侦测死锁,我们需要先模拟死锁。本例将使用两个不同的会话创建两个事务。 ... 阅读全文
摘要:
--1)查询被阻塞和正在阻塞的查询: SELECT R.session_id AS BlockedSessionID , S.session_id AS BlockingSessionID , Q1.text AS BlockedSession_TSQL , Q2.text AS BlockingSession_TSQL , ... 阅读全文
摘要:
---1)-改进语句----监控当前正在运行的事务: select dbt.database_id, DB_NAME(dbt.database_id) '数据库名', dbt.transaction_id, at.name, at.transaction_begin_time, case at.transaction_type... 阅读全文
摘要:
统计信息是如何提高SQLServer查询性能的?统计直方图用作在查询执行计划中查询优化器的选择依据。如果一个查询谓词包含统计信息的列,那么查询优化器不需要预测该查询中影响行数,因此,查询优化器有足够的信息去创建执行计划。SQLServer创建执行计划有一下几种不同的方式: • 统计信息会在每个新创建的索引中自动创建统计信息。 • 如果数据库中AUTO_CREATE_STATISTIC... 阅读全文
摘要:
前言: 索引对性能方面总是扮演着一个重要的角色,实际上,查询优化器首先检查谓词上的统计信息,然后才决定用什么索引。一般情况下,默认会在创建索引时,索引列上均创建统计信息。但是不代表在非索引键上的统计信息对性能没有用。 如果表上的所有列都有索引,那么将会是数据库负担不起,同时也不是一个好想法,包括谓词中用到的所有列加索引同样也不是好方法。因为索引会带来负载。因为需要... 阅读全文
摘要:
/*前言: 统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要返回的数据。 在创建列的统计信息后,在DML操作如insert、update、delete后,统计信息就会过时。因为这些操作更改了数据,影响了数据分布。此时需要更新统计信息。 在高活动的表中,统计信息可能几个小时就会过时。对... 阅读全文
摘要:
简介: 查询的统计信息: 目前为止,已经介绍了选择索引、维护索引。如果有合适的索引并实时更新统计信息,那么优化器会选择有用的索引供查询之用,因为SQLServer优化器是基于开销的优化。当在where和on上的列上的数据需要显示在结果集的时候,如果有实时的统计信息,优化器会选择最好的执行方式,因为优化器会从统计信息中获得这些数据的明细情况。 在创建索引的时候,SQLServer就会在索引列上创建... 阅读全文
摘要:
-1)服务器名 --检查是否一致 use master go select @@servername select serverproperty('servername') --如果不一致,执行下面的语句 if serverproperty('servername') @@servername begin declare @se... 阅读全文
摘要:
问题: 数据库有两大存储需要:数据页和索引页。在你的表中理解和查看实际的数据,是相当简单的。通过运行一些查询示例来了解哪些列被使用,以及什么类型的数据实际上是被存储。一方面,很难知道索引实际上是如何被使用和怎么使用的。所以你应该如何更好地理解索引的使用及正在发生什么操作(inserts,updates,deletes,selects)? 解决方案: 在SQLServer中,许多新的DMVs被... 阅读全文
摘要:
前言: 在前面一文中,已经提到了三类常见的索引问题,那么问题来了,当系统出现这些问题时,该如何应对? 简单而言,需要分析现有系统的行为,然后针对性地对索引进行处理: o 对于索引不足的情况:检查缺少索引的情况,也需要检查现有索引定义是否有问题。 o 对于索引过多的情况:分析每一个索引的使用情况,判断是否有存在的必要或者可合并、可修改的可能。 o 对于索引不合理的... 阅读全文
摘要:
前言: 在很多系统中,比如本人目前管理的数据库,索引经常被滥用,甚至使用DTA(数据库引擎优化顾问)来成批创建索引(DTA目前个人认为它的真正用处应该是在发现缺失的统计信息,在以前的项目中,用过一次DTA,里面提示了很多列缺少统计信息,后来在不改动其他操作的前提下,把这些统计信息手动建上去,性能提升非常明显。关于统计信息将另开文章介绍)。一个表甚至有20多个索引(索引的数量并没... 阅读全文
摘要:
/*前言: 性能优化是DBA的工作之一,但是同时,DBA还需要关心SQLServer实例、数据库消耗的空间、提供数据库用户高可用性、管理数据库备份策略等等。 磁盘空间的管理是一件非常重要的事情,DBA需要关注磁盘空间和未使用索引的空间消耗情况,管理数据文件和日志文件的大小等等。在其他章节和本章都有提到,索引会消耗磁盘空间。所以,是时候去管理这部分的内容。 准备工作: 在开始之前,先要确保: ... 阅读全文
摘要:
/*前言: 视图是一个包含了一个或多个表的数据列的虚拟表。通常情况下,它仅仅是存储了查询的对象,一个视图可以当作一个表,可以用于存储过程、JOIN、用户自定义函数等等。 视图包含了下面两个主要特性: 1、提供了一个安全机制,用于限制用户只能访问特定的数据。 2、使得开发人员能定制用户的逻辑视图。 当你查询一个视图时,优化器会产生一个单一的执行计划给这个查询。在索引视图未出现之前,视图必须解决... 阅读全文
摘要:
/* 前言: 在理解计算列上的索引之前,先了解计算列的基本知识。计算列由可以使用同一表中的其他列的表达式计算得来。表达式可以是非计算列的列名、常量、函数,也可以是用一个或多个运算符连接的上述元素的任意组合。表达式不能为子查询。 默认情况下,计算列是一个虚拟的列,并且可以在调用时重新计算,直到在CREATE TABLE或者ALTER TABLE 命令中使用PERSISTED。 如果列定义成PERS... 阅读全文
摘要:
/*前言: 众所周知,索引对性能的提升有巨大作用。但是这是有代价的,索引需要磁盘空间来存放它的B-Tree,并且用于在每次DML执行后更新信息,所以应该在一定时期内检查有无无用索引。 准备工作: 记住别在重启服务器之后进行信息收集,因为DMO将会清空,而数据会非常不准确甚至是错误的。所以应该在运行了一段时间后(业务周期)再做收集。 业务周期根据实际情况而定。一些表和查询会每天... 阅读全文
摘要:
/*前言: 如果碎片程度小于%,建议使用重组而不是重建。因为重组不会锁住数据页或者数据表,并且降低CPU的资源。 总得来说,重组会清空当前的B-TREE,特别是索引的叶子节点,重组数据页和消除碎片。和重建不同,重组不会添加任何新数据页。 准备工作: 为了了解是否有必要重组索引,需要首先查看碎片程度,如果在%以下,那一般没必要做什么维护,如果在%~30%,就建议进行重组。 步骤: 1、... 阅读全文
摘要:
/*前言: 在开发阶段,很难总是可以在合适的列上创建合适的索引。所以一开始创建的索引可能会无效,此时,需要找出这些无效的索引。 一般来说,当一个查询执行的时候,SQLServer优化器会选择最适合的索引进行执行,当没有找到合适的索引话,优化器会产生一个次优执行计划,并且把丢失索引的信息存放到DMVs上。 当SQLServer服务重启后,所以存储在DMVs上的信息都会丢失,所以最好在正常使用大概周... 阅读全文