<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://drillchina.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fdrillchina.spaces.live.com%2fcategory%2fSQL%2bServer%2b2000%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Ryan's Space: SQL Server 2000</title><description /><link>http://drillchina.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catSQL%2bServer%2b2000</link><language>en-US</language><pubDate>Tue, 01 Jul 2008 16:49:07 GMT</pubDate><lastBuildDate>Tue, 01 Jul 2008 16:49:07 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://drillchina.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>7048309541729011992</live:id><live:alias>drillchina</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>SQL Server 2000组件框架</title><link>http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!248.entry</link><description>&lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1ptefgZmUtu0YaVhoIwoDRoP3rOzOwnetI88uKFRMX8XpvlLnbsiZs4SYT7vI_7f-b-YjG-W3ROTU"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=421 alt="SQL Server 2000 Components" src="http://byfiles.storage.msn.com/y1ptefgZmUtu0aWbtoZyjAKuaiUzhGeOflpwhYONQ5mgeeYnb-I-Mvr5QTF1gek7HTiuYv1y9gZEoU" width=640 border=0&gt;&lt;/a&gt;  &lt;p&gt;引自《Inside SQL Server 2000》&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=7048309541729011992&amp;page=RSS%3a+SQL+Server+2000%e7%bb%84%e4%bb%b6%e6%a1%86%e6%9e%b6&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=drillchina.spaces.live.com&amp;amp;GT1=drillchina"&gt;</description><comments>http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!248.entry#comment</comments><guid isPermaLink="true">http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!248.entry</guid><pubDate>Thu, 04 Oct 2007 11:55:18 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://drillchina.spaces.live.com/blog/cns!61D0A02F45C10918!248/comments/feed.rss</wfw:commentRss><wfw:comment>http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!248.entry#comment</wfw:comment><dcterms:modified>2007-10-04T11:58:59Z</dcterms:modified></item><item><title>SQL Server中的临时表和表变量</title><link>http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!232.entry</link><description>&lt;p&gt;在SQL Server的性能调优中，有一个不可比面的问题：那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集？表变量和临时表是两种选择。记得在给一家国内首屈一指的海运公司作SQL Server应用性能评估和调优的时候就看到过大量的临时数据集处理需求，而他们的开发人员就无法确定什么时候用临时表，什么时候用表变量，因此他们就简单的使用了临时表。实际上临时表和表变量都有特定的适用环境。 &lt;p&gt;先卖弄一些基础的知识： &lt;h5&gt;表变量&lt;/h5&gt; &lt;p&gt;变量都以@或@@为前缀，表变量是变量的一种，另外一种变量被称为标量(可以理解为标准变量，就是标准数据类型的变量，例如整型int或者日期型DateTime)。以@前缀的表变量是本地的，因此只有在当前用户会话中才可以访问，而@@前缀的表变量是全局的，通常都是系统变量，比如说@@error代表最近的一个T-SQL语句的报错号。当然因为表变量首先是个变量，因此它只能在一个Batch中生存，也就是我们所说的边界，超出了这个边界，表变量也就消亡了。 &lt;p&gt;表变量存放在内存中，正是因为这一点所有用户访问表变量的时候SQL Server是不需要生成日志。同时变量是不需要考虑其他会话访问的问题，因此也不需要锁机制，对于非常繁忙的系统来说，避免锁的使用可以减少一部分系统负载。 &lt;p&gt;表变量另外还有一个限制就是不能创建索引，当然也不存在统计数据的问题，因此在用户访问表变量的时候也就不存在执行计划选择的问题了(也就是以为着编译阶段后就没有优化阶段了)，这一特性有的时候是件好事，而有些时候却会造成一些麻烦。 &lt;h5&gt;临时表&lt;/h5&gt; &lt;p&gt;临时对象都以#或##为前缀，临时表是临时对象的一种，还有例如临时存储过程、临时函数之类的临时对象，临时对象都存储在tempdb中。以#前缀的临时表为本地的，因此只有在当前用户会话中才可以访问，而##前缀的临时表是全局的，因此所有用户会话都可以访问。临时表以会话为边界，只要创建临时表的会话没有结束，临时表就会持续存在，当然用户在会话中可以通过DROP TABLE命令提前销毁临时表。 &lt;p&gt;我们前面说过临时表存储在tempdb中，因此临时表的访问是有可能造成物理IO的，当然在修改时也需要生成日志来确保一致性，同时锁机制也是不可缺少的。 &lt;p&gt;跟表变量另外一个显著去别就是临时表可以创建索引，也可以定义统计数据，因此SQL Server在处理访问临时表的语句时需要考虑执行计划优化的问题。 &lt;h5&gt;表变量 vs. 临时表&lt;/h5&gt; &lt;table cellspacing=0 cellpadding=2 width=574 border=0&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width=283&gt;  &lt;td align=middle width=145&gt;表变量 &lt;td align=middle width=144&gt;临时表 &lt;tr&gt; &lt;td width=283&gt;数据集的存储位置 &lt;td align=middle width=145&gt;内存(不考虑被换到页面文件这种情况) &lt;td align=middle width=144&gt;磁盘(不考虑访问后被缓存到内存中) &lt;tr&gt; &lt;td width=283&gt;是否需要日志 &lt;td align=middle width=145&gt;否 &lt;td align=middle width=144&gt;是 &lt;tr&gt; &lt;td width=283&gt;是否可以创建索引 &lt;td align=middle width=145&gt;否 &lt;td align=middle width=144&gt;是 &lt;tr&gt; &lt;td width=283&gt;是否可以使用统计数据 &lt;td align=middle width=146&gt;否 &lt;td align=middle width=144&gt;是 &lt;tr&gt; &lt;td width=283&gt;是否可以在多会话中访问 &lt;td align=middle width=146&gt;否 &lt;td align=middle width=144&gt;是 &lt;tr&gt; &lt;td width=283&gt;是否需要锁机制 &lt;td align=middle width=146&gt;否 &lt;td align=middle width=144&gt;是&lt;/tbody&gt;&lt;/table&gt; &lt;h5&gt; &lt;/h5&gt; &lt;h5&gt;结论&lt;/h5&gt; &lt;p&gt;综上所述，大家会发现临时表和表变量在底层处理机制上是有很多差别的。 &lt;p&gt;简单地总结，我们对于较小的临时计算用数据集推荐使用表变量。如果数据集比较大，如果在代码中用于临时计算，同时这种临时使用永远都是简单的全数据集扫描而不需要考虑什么优化，比如说没有分组或分组很少的聚合(比如说COUNT、SUM、AVERAGE、MAX等)，也可以考虑使用表变量。使用表变量另外一个考虑因素是应用环境的内存压力，如果代码的运行实例很多，就要特别注意内存变量对内存的消耗。 &lt;p&gt;一般对于大的数据集我们推荐使用临时表，同时创建索引，或者通过SQL Server的统计数据(Statisitcs)自动创建和维护功能来提供访问SQL语句的优化。如果需要在多个用户会话间交换数据，当然临时表就是唯一的选择了。需要提及的是，由于临时表存放在tempdb中，因此要注意tempdb的调优。&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=7048309541729011992&amp;page=RSS%3a+SQL+Server%e4%b8%ad%e7%9a%84%e4%b8%b4%e6%97%b6%e8%a1%a8%e5%92%8c%e8%a1%a8%e5%8f%98%e9%87%8f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=drillchina.spaces.live.com&amp;amp;GT1=drillchina"&gt;</description><comments>http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!232.entry#comment</comments><guid isPermaLink="true">http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!232.entry</guid><pubDate>Sun, 30 Sep 2007 03:30:29 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://drillchina.spaces.live.com/blog/cns!61D0A02F45C10918!232/comments/feed.rss</wfw:commentRss><wfw:comment>http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!232.entry#comment</wfw:comment><dcterms:modified>2007-09-30T03:30:29Z</dcterms:modified></item><item><title>SQL Server 2000 Reporting Service服务自动启动失败</title><link>http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!228.entry</link><description>&lt;p&gt;这几天在做一个SQL Server 2000的虚拟机环境，其中安装了SQL Server 2000 Reporting Service，每次启动的时候都会遇到服务启动失败的报错，经过确认是Report Server服务无法自动启动。结果发现Report Server和MSSQLServer服务之间没有依赖关系，但事实上Report Server的Catalog是存储在SQL Server的某个实例中的，所以可能是虚拟机处理速度的原因导致MSSQLServer启动过程太长，Report Server在启动的时候无法获取Catalog数据库的访问，因此Report Server自动启动失败。 &lt;p&gt;经过检查Reporting Service的日志确认了这一原因，Reporting Service的日志可以在Reporting Service安装目录的LogFiles目录中找到，下面是报错部分的副本： &lt;table cellspacing=0 cellpadding=0 width=643 border=0&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=top width=641&gt;&lt;u&gt;&lt;font face=Cambria&gt;ReportingServicesService!library!674!2007-9-14-20:59:58:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerDatabaseUnavailableException: The report server cannot open a connection to the report server database. A connection to the database is required for all requests and processing., ;&lt;br&gt; Info: Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerDatabaseUnavailableException: The report server cannot open a connection to the report server database. A connection to the database is required for all requests and processing. ---&amp;gt; System.Data.SqlClient.SqlException: SQL Server does not exist or access denied.&lt;br&gt;   at System.Data.SqlClient.ConnectionPool.GetConnection(Boolean&amp;amp; isInTransaction)&lt;br&gt;   at System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(SqlConnectionString options, Boolean&amp;amp; isInTransaction)&lt;br&gt;   at System.Data.SqlClient.SqlConnection.Open()&lt;br&gt;   at Microsoft.ReportingServices.Library.ConnectionManager.OpenConnection()&lt;br&gt;   --- End of inner exception stack trace ---&lt;br&gt;ReportingServicesService!library!674!2007-9-14-20:59:58:: Exception caught while starting service. Error: Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerDatabaseUnavailableException: The report server cannot open a connection to the report server database. A connection to the database is required for all requests and processing. ---&amp;gt; System.Data.SqlClient.SqlException: SQL Server does not exist or access denied.&lt;br&gt;   at System.Data.SqlClient.ConnectionPool.GetConnection(Boolean&amp;amp; isInTransaction)&lt;br&gt;   at System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(SqlConnectionString options, Boolean&amp;amp; isInTransaction)&lt;br&gt;   at System.Data.SqlClient.SqlConnection.Open()&lt;br&gt;   at Microsoft.ReportingServices.Library.ConnectionManager.OpenConnection()&lt;br&gt;   --- End of inner exception stack trace ---&lt;br&gt;   at Microsoft.ReportingServices.Library.ConnectionManager.OpenConnection()&lt;br&gt;   at Microsoft.ReportingServices.Library.ConnectionManager.ConnectStorage()&lt;br&gt;   at Microsoft.ReportingServices.Library.ConnectionManager.VerifyConnection()&lt;br&gt;   at Microsoft.ReportingServices.Library.ServiceController.ServiceStartThread()&lt;br&gt;ReportingServicesService!library!674!2007-9-14-20:59:58:: Attempting to start service again...&lt;/font&gt;&lt;/u&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;当然微软没有为Report Server服务添加依赖关系也是有原因的，因为Reporting Service的Catalog不一定是在本地的SQL Server实例中，因此Report Server和本地的MSSQLServer服务的依赖性是不确定的，不过我们大多数的部署环境两个服务都是在一台服务器上，因此我们可以手动为Report Server和MSSQLServer服务添加依赖性。具体的步骤如下： &lt;ol&gt; &lt;li&gt;打开regedt32(不是regedit哦！)  &lt;li&gt;在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ReportServer键下面添加一个名为DependOnService的值(类型是REG_MULTI_SZ，这就是为什么不用regedit的原因，貌似regedit添加不了这种类型的值)，值设置为MSSQLSERVER。&lt;br&gt;&lt;a href="http://byfiles.storage.msn.com/y1ptefgZmUtu0aHNIO4GZC4x8EodSMXPBC10YUluRYUIYCFqTMoyON-iPw8YCRQwxwy6s8lgbfkEcI"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=480 alt=image src="http://byfiles.storage.msn.com/y1ptefgZmUtu0bo92kZlJndutYo5sT3pawZ2vM72QwNNFKZqIRZRlZ8OZxaxeaeed9O_UpKgzRm9WI" width=640 border=0&gt;&lt;/a&gt;  &lt;li&gt;关闭regedt32程序，打开Service管理控制台，检查Report Server服务，就会注意到Report Server现在依赖于MSSQLServer服务了。&lt;br&gt;&lt;a href="http://byfiles.storage.msn.com/y1ptefgZmUtu0YaDWR0bX1C_apfQs45ryZkifX-bNZHsh2QGzlrOpPOxnvmLH-0TRZLJEvx5aWqe3A"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=361 alt=image src="http://byfiles.storage.msn.com/y1ptefgZmUtu0Y5AXNJbSpNCn0JAM8O2xZatDg7ixI9BMQW4FRb8tzI_uf9el30cIQaOKUpDHLOmfE" width=319 border=0&gt;&lt;/a&gt;   &lt;li&gt;重新启动虚拟机，果然没有再报服务启动失败的错误。&lt;/ol&gt; &lt;p&gt;附注： &lt;p&gt;如果Reporting Service依赖于的MSSQLServer实例不是默认实例，可以在Services管理控制台中双击对应实例的MSSQLServer服务来确定其服务名，如下图： &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1ptefgZmUtu0YNaMNUz_Xm5IfbmiPT2rv5_9OVDsW7PN6YMzhEr4dizG1e0VMPxko1mAqtK7XALIE"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=348 alt=image src="http://byfiles.storage.msn.com/y1ptefgZmUtu0Y6wQnyX3XZxgMjCvu64tmLBJSUo2JKj-_KgNsDfVzG0ll7bVqE0pEYeKjZbLa3sCw" width=319 border=0&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=7048309541729011992&amp;page=RSS%3a+SQL+Server+2000+Reporting+Service%e6%9c%8d%e5%8a%a1%e8%87%aa%e5%8a%a8%e5%90%af%e5%8a%a8%e5%a4%b1%e8%b4%a5&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=drillchina.spaces.live.com&amp;amp;GT1=drillchina"&gt;</description><comments>http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!228.entry#comment</comments><guid isPermaLink="true">http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!228.entry</guid><pubDate>Fri, 14 Sep 2007 12:45:16 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://drillchina.spaces.live.com/blog/cns!61D0A02F45C10918!228/comments/feed.rss</wfw:commentRss><wfw:comment>http://drillchina.spaces.live.com/Blog/cns!61D0A02F45C10918!228.entry#comment</wfw:comment><dcterms:modified>2007-09-14T13:26:52Z</dcterms:modified></item></channel></rss>