2011年12月29日
摘要: 很多DBA都希望能够得到某个存储过程的执行信息,比如:1) 执行了多少次2) 执行的执行计划如何3) 执行的平均读写如何4) 执行平均需要多少时间等等. 幸运的是SQL server 2008 提供了一个这样的DMV,使得我们比较容易就得到上面的信息。这个DMV是sys.dm_exec_procedure_stats,它输出了下面的信息(部分截图,具体的请参考联机丛书):列名 数据类型 说明 database_idint存储过程所在的数据库 ID。object_idint存储过程的对象标识号。cached_timedatetime存储过程添加到缓存的时间。cached_timedatetime 阅读全文
posted @ 2011-12-29 15:32 xiaohuime 阅读(463) 评论(0) 推荐(0) 编辑
摘要: 我在做SQL Server 7.0技术支持的时候有客户问我,“我的SQL Server buffer pool很大,有办法知道是哪些对象吃掉我的buffer Pool内存么?比方说,能否知道是哪个数据库,哪个表,哪个index占用了buffer Pool么?”当时我没有找到这个问题的答案,但是我一直记着这个问题。直到SQL server 2005 版本出现,这个问题迎刃而解。答案就是使用动态视图(DMV) sys.dm_os_buffer_descriptors。这个DMV非常强大。根据SQL Server 联机丛书,这个视图的作用是 “返回有关 SQL Server 缓冲池中当前所有数据页的 阅读全文
posted @ 2011-12-29 15:29 xiaohuime 阅读(159) 评论(0) 推荐(0) 编辑
摘要: Tempdb 系统数据库是一个全局资源,供连接到 SQL Server 实例的所有用户使用。在现在的SQL Server里,其使用频率可能会超过用户的想象。如果Tempdb空间耗尽,许多操作将不能完成。作为一个支持工程师,会被经常问到象“我的Tempdb为什么这么大?”“是谁把我的Tempdb空间用完的?”在SQL 2000的时候,这个问题很难回答。好在SQL 2005以后,引入了一张新的管理视图:sys.dm_db_file_space_usage。通过查询这张视图,能了解tempdb的空间使用情况,能知道tempdb的空间是被哪一块对象使用掉的,是用户对象(user_object_rese 阅读全文
posted @ 2011-12-29 15:24 xiaohuime 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 随着硬件能力的升级,以及软件应用的扩展,现在的数据库是越来越大了。回想10年前,一个上百GB的数据库就会把支持工程师吓得要命。而现在,上TB的数据库真是比比皆是。DBA遇到的一个常见问题,就是如何监视数据空间的增长情况,或者在数据库用满的时候,能够迅速定位谁是罪魁祸首。了解一个数据库空间使用的最简单方法,就是在Management Studio里,右键点击数据库名字,选择”Reports” – “Standard Reports”,缺省就有4个Disk Usage的报表。它们能很好地统计出了从不同角度分析的数据库空间使用情况。但是在一个非常繁忙的生产环境里,随随便便地跑UI的报表总是有点头皮发 阅读全文
posted @ 2011-12-29 15:05 xiaohuime 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 我曾经遇到过这样一个性能问题。一个客户反映,他的SQL Server会在某一段时间里,突然变得非常慢。最后他不得不重启SQL Server服务。而重启以后,问题就消失了。客户在出现问题的那段时间里,收集了主要的系统动态管理视图,以及性能监视器里和SQL Server有关的那些计数器。顺便说一句,这台服务器有16颗CPU。Sys.dm_exec_requests是检查SQL Server性能瓶颈的有力工具。在处理SQL Server性能问题的时候,它是第二个检查的对象。(第一个当然是SQL Server的日志文件,要确认Server当时没有异常。)从Sys.dm_exec_requests的结果 阅读全文
posted @ 2011-12-29 14:28 xiaohuime 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 最近较忙,很少出炉技术文章了。但最近听得很多的一句话就是update操作实际上就是先delete后insert的操作。对于这种提法,网上也比较普遍,但本人确不敢苟同。我们现在通过下面的几个case来看看究竟是不是那样的。我们会分3种情形来测试:1、更改非聚集索引键列字段,更改前后的长度一样;2、更改非聚集索引键列字段,更改后的长度比之前的大;3、更改聚集索引键列。下面先来创建两个表:create table t1(id int,col varchar(10))create unique clustered index IXCU_T1_ID on t1(id)gocreate table t2( 阅读全文
posted @ 2011-12-29 10:02 xiaohuime 阅读(1190) 评论(0) 推荐(0) 编辑