RSS 2.0 Feed
Solution
各种怪异问题的解决之道
摘要:1、这本书对于初学者没有太大用处2、这本书对于眼中只有架构、自己不写程序的、鄙视代码的人没有用处3、这本书对于非微软的人用处不算太大,你不知道ms内部的数据结构,你没有private symbols。4、这本书对于微软的人用处不算太大,搞debug的就那么几号人 5、这本书对于在客户现场被骂的狗血喷头的、自己即使架了.NET IDE也不知道如何找出问题的人很有用处   如果你是第五种人,疯狂购买吧!...[阅读全文]

posted @ | Feedback (4) | Filed Under [ Solution VS.NET ]

摘要:此文是偶的偶像和哥们的,转过来,替他做一下宣传。偶会买10本,9本送人,有要的,现在报名。 (原来公司大量的COM+和.NET的case,都是熊老大做的)   Windows 高效排错《Windows 高效排错》 可以在CSDN读书频道预览了 地址在这里:http://book.csdn.net/bookfiles/555/ 读书频道的排版有些问题,看起来不是很舒服。如果想看PDF的,可以在这里下载 http://www.cnblogs.com/lixiong/archive/2006/08/16/475520.html 纸板书籍估计在11月中下旬面世  现在在China-pub, dearbook等网上书店已经有介绍,地址分别 http://www.china-pub.com/computers/common/info.asp?id=37008http://www.dearbook.com.cn/book/230727 您的看法非常重要。如果你看过这本书的PDF,了解本书的内容和潜在读者,请您在上面的链接中留下你的观点,便于其它不了解这本书的人选择。 如果您通过这本书介绍的方法解决过实际的问题,非常希望您能够分享您的经验。您可以发邮件到eparg@msn.com。如果您的分享能够帮助其它读者,我非常希望能够送书给您作为答谢。 如果您对书中所述内容有疑惑,也欢迎您写信来讨论。我会尽快回复。如果我们之间的讨论对其他读者有帮助,我也会放到网上,同时送书给您作为答谢。 === 上面是官腔了。我个人想说的话其实是: 1) 书前言里面说,"2007年年初我不再做技术支持。希望这本书能帮我记录下这一段美好的经历",其中最让我难忘的就是跟xiao,elan和leo站在水房门口讨论case的日子2) 常来我blog踩的同学们,你们要书的话把地址留给我。等我拿到了我给大家发。(估计要等一段时间。出版社就给我6本。剩下的我争取去批发)3) 跟我一起做过case的,如果你需要的话也把地址留给我4) 多卖一本书,我可以多拿3块钱不到。整本书的稿费还不够在上海买半个车牌,或者买个厕所。我一点也不关心字面上的销量。我之所以花那么多时间来做这个亏本生意,目的只有一个,就是希望跟喜欢调试的人分享其中的过程,让真正需要这方面文章的人有所参考。所以如果你身边有这本书的潜在读者,劳烦你推荐一下。...[阅读全文]

posted @ | Feedback (27) | Filed Under [ Solution VS.NET ]

摘要:(不好意思,置顶几天) 微软招聘SQL专家,如果您认为在下述方面有专长,请积极报名:   1、工作地点:上海;2、很强的微软技术背景和产品熟悉度;3、很强的客户沟通能力;4、熟悉 SQLServer,熟悉Reporting Service开发、维护5、熟悉 BI理念、产品,如果有 SharePoint Portal Server 2003 或 Office SharePoint Server 2007 实战经验将优先考虑;请把个人简历发给我:juqiang1975@msn.com...[阅读全文]

posted @ | Feedback (8) | Filed Under [ Solution VS.NET ]

摘要:12月份的那个sqlserver死锁分析(连接在下面),我从blogs.msdn上翻译过来的。不过很郁闷,我没有加“转载”或者“翻译”,被一眼尖的哥们儿发现了。 本来想修改原文,增加上“翻译”,但是现在进不去(貌似edit posts很慢),还是放一个单独的post说明此事吧! 郁闷啊!老天可以保证,偶的文品应该没问题的………… 不过,还是应该严重鄙视自己一下。 那个评论在这里:  http://blog.joycode.com/juqiang/archive/2006/12/18/89218.aspx#93122   (我处理的不当,导致了一些争吵,实在对不起大家!此文我从首页撤出,vc和czb兄弟的评论我适当删除。两个当事人我都了解一些,偶异常sorry!!!同时,此文不允许再评论,请后来看得人见谅! 总之一句话,此事我错了,即使想帮我辩解的人,也不要做。错就是错,对就是对,这个blog毕竟给所有人看的。偶极力欢迎大家继续对我的posts批评指正,大家一起提高。3x!)...[阅读全文]

posted @ | Filed Under [ Solution ]

郁闷之极,好像用VB写一个空OCX放到form上,然后thread调用起来,也有这个问题。哪位老大见过这个问题?貌似和Appartment有关?

posted @ | Feedback (8) | Filed Under [ Solution ]

本文是对sqlserver性能调整的一个简单的入门介绍(局限于索引部分),大多是图片。架构固然重要,但细节问题我们要首先处理好。我碰到一些项目,索引都没有用好,这时候你优化代码、优化程序结构,是意义不大的。根据我的经验,调整索引需要你对索引有一个清晰的认识,需要对业务需求有一个合理的取舍过程。 偶只希望对应用性能关注的各位同仁,能从我这个连环画里面,看到点、学到点东西。能够建立自己的数字观念,偶就很满足了。道理是相通的,虽然技巧不同、工具不同,但对于其他数据库,如Oracle/ DB2/ Informix,都是一样的。数字观念,拿数字说话,这是一个好的思维模式。(附一个小题目:你的客户要求你提供一个方案,希望满足到2010年最近3年的存储需求,你该如何做这个方案?) 全文连接,点本随笔的标题即可。

posted @ | Feedback (40) | Filed Under [ Solution ]

摘要:很好的日子,2007年1月1日收到了确认通知。这是偶第二次通过Solution Architect的MVP,很是高兴。 ...[阅读全文]

posted @ | Feedback (11) | Filed Under [ Solution ]

摘要:上文中,我们解决了那个场景的死锁问题。这次,我们分析一下,为什么会死锁呢?再回顾一下两个sp的写法:   CREATE PROC p1 @p1 int AS       SELECT c2, c3 FROM t1 WHERE c2 BETWEEN @p1 AND @p1+1   GO   CREATE PROC p2 @p1 int AS         UPDATE t1 SET c2 = c2+1 WHERE c1 = @p1         UPDATE t1 SET c2 = c2-1 WHERE c1 = @p1   GO    很奇怪吧!p1没有insert,没有delete,没有update,只是一个select,p2才是update。这个和我们前面说过的,trans1里面updata A,update B;trans2里面upate B,update A,根本不贴边啊!   那么,什么导致了死锁?    需要从事件日志中,看sql的死锁信息:   Spid X is running this query (line 2 of proc [p1], inputbuffer “… EXEC p1 4 …”):    SELECT c2, c3 FROM t1 WHERE c2 BETWEEN @p1 AND @p1+1   Spid Y is running this query (line 2 of proc [p2], inputbuffer “EXEC p2 4”):    UPDATE t1 SET c2 = c2+1 WHERE c1 = @p1                   The SELECT is waiting for a Shared KEY lock......[阅读全文]

posted @ | Feedback (18) | Filed Under [ Solution ]

摘要:   死锁,简而言之,两个或者多个trans,同时请求对方正在请求的某个对象,导致双方互相等待。简单的例子如下:   trans1                                            trans2   ------------------------------------------------------------------------   1.IDBConnection.BeginTransaction   1.IDBConnection.BeginTransaction   2.update table A                            2.update table B   3.update table B                            3.update table A   4.IDBConnection.Commit                4.IDBConnection.Commit    那么,很容易看到,如果trans1和trans2,分别到达了step3,那么trans1会请求对于B的X锁,trans2会请求对于A的X锁,而二者的锁在step2上已经被对方分别持有了。由于得不到锁,后面的Commit无法执行,这样双方开始死锁。    好,我们看一个简单的例子,来解释一下,应该如何解决死锁问题。   -- Batch #1   CREATE DATABASE deadlocktest   GO   USE deadlocktest   SET NOCOUNT ON   DBCC TRACEON (1222, -1)   -- 在SQL2005中,增加了一个新的dbcc参数,就是1222,原来在2000下,我们知道,可以执行dbcc       --traceon(1204,3605,-1)看到所有的死锁信息。SqlServer 2005中,对于1204进行了增强,这就是1222。   GO         IF OBJECT_ID ('t1') IS NOT NULL DROP TABLE t1   IF OBJECT_ID ('p1') IS NOT NULL DROP PROC p1   IF OBJECT_ID ('p2') IS NOT NULL DROP PROC p2   GO   CREATE TABLE t1 (c1 int, c2 int, c3 int, c4 char(5000))   GO   DECLARE @x int   SET @x = 1   WHILE (@x <= 1000) BEGIN            INSERT INTO t1 VALUES (@x*2, @x*2, @x*2, @x*2)            SET @x = @x + 1   END   GO   CREATE CLUSTERED INDEX cidx ON t1 (c1)   CREATE NONCLUSTERED INDEX idx1 ON t1 (c2)   GO   CREATE PROC p1 @p1 int AS SELECT c2, c3 FROM t1 WHERE......[阅读全文]

posted @ | Feedback (23) | Filed Under [ Solution ]

摘要: 名次解释 DMVs:dynamic management views 三个点 · 资源瓶颈: CPU、内存、I/O(这里面不考虑网络问题) · Tempdb瓶颈: · User query瓶颈,可能是统计信息的变化、不恰当的索引、阻塞或者死锁等 上述三点,可能是相互影响的。 资源瓶颈   工具 1. System Monitor (PerfMon):windows自带 2. SQL Server Profiler: 2005继续有 3. DBCC commands: 参考联机文档 4. DMVs: 见上名次解释   CPU瓶颈 CPU瓶颈,是突然并且不可预料的。一般来讲,没有优化的查询计划、系统低配置、设计不合理等,很容易导致这些问题。 在perfmon中,我们一般需要监视Processor:% Processor Time,如果每个CPU持续高于80%,CPU就是瓶颈了。当然,在强大的2005下我们也可监视sys.dm_os_schedulers ,如果有内容,表明有任务等待CPU来分配给它。如下面这个DMVs的查询: select scheduler_id,current_tasks_count,runnable_tasks_count from sys.dm_os_schedulers where scheduler_id < 255 下面的查询,更高级点。分析方法是,看结果的number_of_statements,如果该值大于1,说明可能有问题,要进一步分析。 select top 50 sum(qs.total_worker_time) as total_cpu_time, sum(qs.execution_count) as total_execution_count,count(*) as number_of_statements, qs.plan_handle from sys.dm_exec_query_stats qs group by qs.plan_handle order by sum(qs.total_worker_time) desc 执行计划的编译与重新编译 在sql2005中的一个改进,就是对于某个sp,进行recompile的时候,只需要针对改变的部分进行编译,sql2000只能是全部都搞一遍。 Recompile的原因很多,如: · Schema的变更 changed · Statistics变更 · 延迟编译 · SET option的执行 · 临时表的变化 · Sp使用了RECOMPILE提示或者使用了OPTION (RECOMPILE)   诊断方法,老朋友了,继续使用perfmon或者sql profiler。 对于perfmon,监视下面的 计数器 · SQL Server: SQL Statistics: Batch Requests/sec · SQL Server: SQL Statistics: SQL Compilations/sec · SQL Server: SQL Statistics: SQL Recompilations/sec 对于profiler抓到的trace,分析这几个event:SP:Recompile / SQL:StmtRecompile / Showplan XML For Query Compile。如果我们抓到了trace,对于文件,可以这么做: select spid,StartTime,Textdata,EventSubclass,ObjectID,SQLHandle from fn_trace_gettable ( 'e:\recompiletrace.trc' , 1) where EventClass in(37,75,166) 这里面,EventClass 37 = Sp:Recompile, 75 =......[阅读全文]

posted @ | Feedback (9) | Filed Under [ Solution ]

摘要:龟速查询 阻塞和索引问题,是常见的导致sql以龟速执行的罪魁。 阻塞阻塞主要等待逻辑锁,如请求一个X锁。关于锁的信息,遍地都是,msdn或者google都可以。SQL Server 2005提供了125中等待类型(2000是76种)。 假设我们sp_who看到了一个block在56号上,那么通过这个可以看到详细信息 select * from sys.dm_os_waiting_tasks where session_id=56 (在2000下,你可以通过dbcc inputbuffer(56)来看当前执行的文本) 0x022A8898 56  0  1103500   LCK_M_S  0x03696820  0x022A8D48  53  NULL  ridlock fileid=1  pageid=143 dbid=9 id=lock3667d00 mode=X  associatedObjectId=72057594038321152 这里显示,56被53阻塞,并且等待了1103500毫秒了。 通过使用sys.dm_tran_locks,我们可以看到56被53以X模式锁住了,53持有1:143:3这个资源。 select request_session_id as spid, resource_type as rt,  resource_database_id as rdb,  (case resource_type WHEN 'OBJECT' then object_name(resource_associated_entity_id) WHEN 'DATABASE' then ' ' ELSE (select object_name(object_id)  from sys.partitions  where  obt_id=resource_associated_entity_id)    END) as objname,  resource_description as rd,     request_mode as rm, request_status as rs from sys.dm_tran_locks 输出如下 spid     rt           rdb         objname       rd            rm           rs -----------------------------------------------------------------------------  56    DATABASE     9                               S          GRANT 53    DATABASE     9                              S          GRANT 56    PAGE          9       t_lock      1:143       IS         GRANT 53    PAGE        9       t_lock      1:143       IX         GRANT 53    PAGE          9       t_lock      1:153       IX         GRANT 56   OBJECT       9       t_lock                  IS         GRANT 53   OBJECT       9        t_lock                 IX         GRANT 53    KEY         9        t_lock      (a400c34cb X          GRANT 53    RID         9        t_lock      1:143:3    X         ......[阅读全文]

posted @ | Feedback (17) | Filed Under [ Solution ]

摘要: TempDB    每个实例只有一个tempdb,所以这里很可能成为性能或者磁盘空间的瓶颈。    常见的tempdb问题如下:    · 把磁盘空间用光了     · 因为tempdb的瓶颈,导致I/O很差。参见第一部分。     · DDL带来的对系统表的瓶颈     · 内容分配        诊断问题之前,先看看tempdb是如何利用空间的。    用户对象       · 表和索引        · 全局临时表 (##t1)和索引        · 局部临时表和索引(#t1) and index.           · 当前连接的           · 存储过程内的        · 表变量(同上)     内部对象       · Work file (hash join)        · Sort run        · Work table (cursor, spool和临时大对象)    版本存储       2005新增的    空闲空间       tempdb暂时没有用到的磁盘剩余空间.    整个tempdb就是上述4个东西的和。    监视tempdb剩余空间很简单,监测这个指标即可。Free Space in tempdb (KB)。下面这个DMVs很强大的说,上面四个都能看到。    Select SUM (user_object_reserved_page_count)*8 as user_objects_kb,  SUM (internal_object_reserved_page_count)*8 as internal_objects_kb,  SUM (version_store_reserved_page_count)*8 as version_store_kb, SUM (unallocated_extent_page_count)*8 as freespace_kb  From sys.dm_db_file_space_usage  Where database_id = 2    这是一个输出结果(kb表示的) user_objets_kb internal_objects_kb version_store_kb freespace_kb ---------------- -------------------- ------------------ ------------ 8736 128 64 448 分析空间使用问题 用户对象    跑这个,能看出来到底谁干的。    DECLARE userobj_cursor CURSOR FOR    select sys.schemas.name + '.' + sys.objects.name  from sys.objects, sys.schemas......[阅读全文]

posted @ | Feedback (4) | Filed Under [ Solution ]

摘要:vista ultimate版本,sql2005,没有任何sp。安装后,连接本地实例,无论windows Authentication还是sqlserver authentication,都提示18456错误。 解决办法如下: 用admin或者run as administrator方式,运行sql mgr studio 展开security结点,到login,new login,在general里面起一个你自己的账户名字,假如叫juqiang,密码设置上。(注意!同时要把password的policy和expiration这两个东西uncheck掉)。然后到server rols里面,把sysadmin钩上。 没有了。...[阅读全文]

posted @ | Feedback (21) | Filed Under [ Solution ]

摘要:环境是Vistal ultimate+IE7,最近上csdn或者news.sina.com.cn,打开N个窗口后,IE突然就崩溃了,然后自动重新启动,甚是郁闷。 于是打开adplus,抓之: adplus -crash -pn iexplore.exe -o d:\dumps 到了CSDN社区,看了两个帖子,哈哈,adplus开始create dump了。一会功夫,一共抓到了三个,分别是1st Chance AV mini,1st Chance Proc Shutdown,2nd Chance AV。 打开三个dump,1st Proc Shudown里面啥都没有,直接ret了,打开另外两个AV的。哦,看到东西了。 This dump file has an exception of interest stored in it.The stored exception information can be accessed via .ecxr.(ff0.158): Access violation - code c0000005 (first/second chance not available)eax=6ee500c2 ebx=00000000 ecx=0a10ef08 edx=0a10ef14 esi=1000ea7c edi=0782d1c0eip=8bffdb10 esp=0a10eeec ebp=0a10ef0c iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=000102468bffdb10 ?? ??? kb一下之后,看到这些: 0:019> kb 2000ChildEBP RetAddr Args to Child WARNING: Frame IP not in any known module. Following frames may be wrong.0a10eee8 10003e1f 0782d1c0 1000ea7c 0a10ef08 0x8bffdb100a10ef0c 10003d46 0a94edc8 0a10f108 00dabd80 Jccatch!DllGetClassObject+0x28fc0a10ef2c 100034c0 0a880d20......[阅读全文]

posted @ | Feedback (12) | Filed Under [ Solution ]

摘要:要想解决上文提到的几种常见情况,首先,代码开发人员都要提供相应的dll的symbols。什么叫symbols?就是符号表!有了它,我们可以根据dump,确切的看到问题代码的所处位置:源文件名、方法名、行号等。对于VC++和.NET程序,symbols就是后缀为.PDB的那个文件,对于Borland系列的,需要build出来一个.map文件,然后通过Map2Dbg来生成.DBG文件。 这是我们自己的symbols,其实,微软各种产品也有symbols。一部分叫做public的,一部分叫做private的。对于后者,我们拿不到。 symbols准备好了之后,还要下载一个工具,叫做windbg。下载地址,你可以到google.cn上search:debugging tools for windows,安装就可以了。 有了这两样,我们就可以开始干活了!   对于Memory Leak,发现现象之后,分析哪里产生了泄漏,这是一个很难的任务。这里推荐几款工具和文章: l  XiongLi的blog,http://www.cnblogs.com/lixiong。 这是GTEC的大牛,偶的哥们+偶像。 l  UMDH工具,安装好上面的windbg,你会在同一个目录下发现这个文件。具体用法,看上面的blog。 l  Debug Diag工具,在google中搜索:IIS Diagnostics,到msdn上下载即可。   尤其是debug diag,使用非常简单。你用它抓到dump之后,可以自动进行分析,产生格式友好的html文件。UMDH也可以分析,不过使用起来有些罗嗦。   对于CPU使用占100%的情况,解决办法是,restart出问题的进程,打开taskmgr,选择该进程,眼睛盯着该进程的CPU变化(注意!眼睛不要眨!!!)。如果CPU持续达到85%以上(经常是100%居多),好,这时候利用上面提到的windbg,打开命令行,运行 adplus –hang –p 1234 –o c:\dumps 具体参数,可以运行adplus来看帮助。 抓好dump之后,可以用debugdiag来分析,也可以用windbg来分析。如果你想锻炼一下windbg的使用,可以按照如下操作来做: .load clr10\sos.dll !runaway 敲完这两个命令后,看输出的前几行,记录下来thread id。然后分别用kb来察看,把其中的代码都复制到你的notepad里面。   Ok,等一段时间(你自己决定长短),如果该进程CPU还是持续100%,按照上面步骤,继续抓。这样抓好3组后,通过!runaway命令,看占用CPU最高的thread的call stack。如果内容都类似,说明我们抓到了导致hang的代码。下面的工作就是分析这些call stack了。 对于hang,还有一种情况,就是CPU和Memory都很低,但是客户端执行就是没有反映。这里举一个我们自己项目的例子: 0x4bc8f458  0x77f88f03 [FRAME: ECallMethodFrame] [DEFAULT] I4 System.Threading.WaitHandle.WaitMultiple(SZArray Class System.Threading.WaitHandle,I4,Boolean,Boolean)0x4bc8f470  0x26547659 [DEFAULT] I4 System.Threading.WaitHandle.WaitAny(SZArray Class System.Threading.WaitHandle,I4,Boolean)0x4bc8f484  0x26385470 [DEFAULT] [hasThis] Class System.Data.SqlClient.SqlInternalConnection System.Data.SqlClient.ConnectionPool.GetConnection(ByRef Boolean)0x4bc8f4b8  0x2758fbad [DEFAULT] Class System.Data.SqlClient.SqlInternalConnection System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(Class System.Data.SqlClient.SqlConnectionString,ByRef Boolean)0x4bc8f4f8  0x2758f6b9 [DEFAULT] [hasThis] Void System.Data.SqlClient.SqlConnection.Open()0x4bc8f534  0x2fdd26bc [DEFAULT] [hasThis] Void Genersoft.Focus.Db.DataBase.Open()  at [+0x7c] [+0x37]   从最下面看,那个Database.Open是我们自己的db helper,然后看最上面的红色部分,由一个WaitAny。这个call stack就是我们实际项目中发生的。 通过看中间那个红色加粗部分,我们看到了.net自己的代码,ConnPool.GetConn。通过reflector看这段代码实现,我们知道了.NET的db conn是从pool里面得到的,而pool的大小是有限的。所以,我们猜测:程序中存在着db conn没有Close或者DataReader没有Close的问题。searchi一番,果然如此。修改后,问题解决。   对于Access Violation问题(简称AV,J),我们一般也使用adplus进行抓取。命令如下: adplus –crash –p 1234 –o c:\dumps   AV或者Crash分析起来也比较麻烦。如果想偷懒,可以用debug diag自动分析。如果自己手工作,参考上面xiong li的blog,哈哈! 这里也举一个我以前做培训时候的例子。 char a[] = "hello"; a[0] = 'X'; printf("%s",a); char *p = "world";     // 注意p指向常量字符串 p[0] = 'X';            // 编译器不能发现该错误 printf("%s",p);   此段代码取自林锐博士的“高质量C/C++编程”,运行后会crash,我们抓了dump之后,按alt+7切换到汇编代码中,发现如下语句: 0040dcac c60058           mov     byte ptr......[阅读全文]

posted @ | Feedback (4) | Filed Under [ Solution ]

摘要:SqlServer的性能问题,也是窗户纸,让偶道来!   先考虑一个问题,怎么判断SQL的执行效率是好是坏?也许,95%的人会回答,看执行时间。   错!   为什么?因为在一个稳定的DB中(稳定这个词,我是这样定义的:某个时间段内,如1周,大部分被SQL缓存的数据是几乎不变的,这意味着客户这段时间内的操作模式、数据变化,是平稳的),同样的sql执行,可能会因为缓存的变化,导致时间变化无常,或者因为一些诸如hot spot,也会导致这个问题。 既然要tuning,就要有一个调优的标准。标准是什么呢?最主要的,看I/O。 在一个稳定的DB中,执行同样的SQL,I/O基本是不变化的。同样的内存配置,你的台式机,客户的高级server,产生的I/O相差不大的。I/O分为两种,逻辑的,从内存读写;物理的,从磁盘读写。   SQL调优的最终目的,就是大幅度的降低I/O大小,减少阻塞,避免死锁。 有了这个目标之后,就可以开始干活了! 首先打开sql analysis(查询分析器),用sa连接到你的数据库,执行 dbcc traceon(1204,3605,-1),这一句保证任何的死锁信息都会被记录在sql log中。   然后打开sql profiler(事件探查器),在业务高峰期开始,抓里面的sql completed和sp completed,持续2-4个小时(看客户的实际情况而定)。 然后把profiler里面的数据save as到一个table中,加入叫做:jq(偶名字的缩写)。好,到此,成功1/3了! 再次打开查询分析器,执行类似的这条sql: Select textdata, reads, duration from jq order by reads desc   这会把所有抓到的sql按照I/O从大到小的顺序排列,睁大你的眼睛,找出来那些I/O最大的,执行最频繁的sql,copy出来,在查询分析器的另一个窗口中,粘贴上。 哦,先不要急着Ctrl+E,要先执行这个语句!   Set statistics io on 然后按一下Ctrl+K(打开执行计划)   好了,执行你从jq里面抓到的那个最大的sql吧!仔细分析下面的执行计划,仔细看output中每个表的I/O。分析为什么index的走向不是你所期望的,分析为什么这么多nested loops,分析为什么有大量的worktable?等等,等等。   上面是对于普通sql调优的办法。而对于阻塞,可以参考msdn的文章,kbid是271509。 对于死锁,刚才说过了,只要dbcc traceon(1204,3605,-1)执行后,所有的deadlock都会记录在sql log中。这个日志,纯文本文件,一般会列举出,至少两个对象的当前状态。常见的,如: KEY: 8:1653632984:2 (da00ce043a9e) CleanCnt:1 Mode: U Fl ags: 0x0 KEY: 8:1653632984:1 (2d018af70d80) CleanCnt:1 Mode: X Flags: 0x0   通过察看sysobjects中ID,和index,我们可以找到对应的deadlock的table,通过分析执行计划,我们可以看出死锁发生的原因。具体内容,参考msdn文章,KBID是832524。   补充一下,GTEC也作SQL的case,虽然收费不菲,哈哈! (注,连续三篇随笔介绍的情况和方法,同样适用于Vista/SqlServer 2005等最新MS产品)...[阅读全文]

posted @ | Feedback (12) | Filed Under [ Solution ]

摘要:每个人都有这种经历,我们N多人辛苦作出来的软件,放到客户那里,过了一段时间,随着业务数据的增加和在线用户的增加,就开始“衰老”了。症状,典型的有几种: 1.         内存由100M疯涨到了1700M,最终要频繁重启进程或者服务器。 2.         CPU狂涨到了