41071.htm
来自「一本很基础的SQL讲解」· HTM 代码 · 共 322 行 · 第 1/5 页
HTM
322 行
<P><A href="/files/uploadimg/20070227/1816178.jpg" target=_blank><IMG height=335 alt="" src="/files/uploadimg/20070227/1816178.jpg" width=450 border=0></A> </P>
<P><STRONG>图 9</STRONG></P>
<P>这个工具的联合允许了数据库管理员 能够集中精力到SQL Server的运行上,了解,优化工作的查询,也早期SQL Server 版本将比也提供给开发人员一个工具实现快速的应用程序开发。</P>
<P>◆<STRONG>Productivity Tip<BR></STRONG>数据库引擎.NET Framework 规划 API的调试环境并不支持并发调试,推荐开发者准备自己的SQL Server 开发实例来使用Visual Studio debuggers。</P>
<P>#p#</P>
<P><STRONG>排错</STRONG></P>
<P>这部分内容给出了数据库管理员对.NET Framework设计API数据库引擎的排错和代码检查的一些指导方针。当然这不是一个完整的列表。我们还是推荐所有的开发者和数据库管理员们应该聚在一起然后制定出符合自己的一个标准。我们以当前流行的Transact-SQL标准作为出发点,来确定一些相对坏的项目的,创建一个好的项目的公认的一些注意点。</P>
<P>◆<STRONG>Lack of Set-based Operations (Loops within Loops)</STRONG></P>
<P>那些对于SQL Server 语法并不熟悉的开发者可能不得不用一些非常复杂的语句来替代像JOIN 或者SELECT等语句。例如一个表的处理需要其他外部表的每行数据时,那么下面这种处理方式是正确的,具体代码如下:</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P> getdata()<BR> foreach (datarow in datatable)<BR> getdata()<BR> foreach (datarow in datatable2)<BR> etc</P></PRE></TD></TR></TBODY></TABLE></P>
<P>它通常是被一个简单的INNER JOIN语句所替代。</P>
<P>这个行为在SQL Server Profiler中很容易被发现,因为其内部的循环会在服务器上产生大量的查询。</P>
<P>◆<STRONG>在CLR中的CPU-Intensive处理</STRONG></P>
<P>一些复杂的逻辑结构在.NET Framework 语言中要比在Transact-SQL结构中更容易去处理。所以如果SQL Server 不能像中间服务器一样做一些负载平衡,那么可能会成为瓶颈。在sys.dm_clr_appdomains表中的一列可以列出有关CLR CPU消耗的检测数据。</P>
<P>如果按照文章前面的建议进行使用,那么这点将不是什么大问题。因此,middle-tier的迁移功能将是一个很小的代码任务。</P>
<P>◆<STRONG>例举内存中的大的对象</STRONG></P>
<P>在SQL Server 2000中的Transact-SQL并不提供创建大对象的方法。在小的存储过程中加入大的IMAGE 或者 N/TEXT参数这一方法的能力可能是最差的。很多的内容都将作为@TABLE 变量或#TEMP 表贮存在TempDB中。然而在SQL Server 2005 的.NET Framework 运行时中就不是这个样子了,在ADO.NET数据集和用户自产收集中可以放置大的和潜在的大内存要求。你应该使用系统检测计数器来检测代内存的使用情况。因为在从开发到生产的整个过程中我们应该都可以保证代码流的稳定。</P>
<P>这些解决方案与在middle-tier上获得的是相似的。</P>
<P>◆使用分页来得到内存中的数据子集。<BR>◆确认数据已经提交。<BR>◆移动聚合数据替代具体的细节数据。</P>
<P>◆<STRONG>出错处理</STRONG></P>
<P>数据库引擎.NET Framework 设计API支持不同语言的出错处理。所以出错处理是非常容易的,任一个外部操作,例如数据库,文件系统或者web服务访问,以及操作的上溢出,下溢出的处理方法都在出错处理中有预先的安装。</P>
<P>结合SQLContext.Pipe.ExecuteAndSend()使用RAISERROR命令可以返回SQL Server 的错误。注意在SQL Server 2005 中Transact-SQL的出错处理有了一个很大的改变。开发者应该对他们的代码使用RAISERRORS这一处理。</P>
<P>提供一个例外比返回错误代码对开发者来说更加有意义。因为开发者可能会忘记标记@@ERROR。</P>
<P>◆<STRONG>不安全的代码问题</STRONG></P>
<P>数据库管理员对于UNSAFE注册代码非常难以控制。尤其是在共享实例中。因为在开发者的被允许调用非管理代码。这是一个未经授权的任务。在其他的代码安全模式下,SQL Server 只关注那些注册的程序集和仅授权级别的调用。</P>
<P>Unsafe代码和不可管代码在高权限下可以被完全访问。因此,在部署前应该进行一次全面的代码检查。尤其应该注意所有的参数以及SQL Server 上的连接。在部分升级时确认事务的边界。最后我们应该确任代码在服务器上不会有错误信息提示显示。</P>
<P>◆<STRONG>用户自定义类型问题</STRONG></P>
<P>用户自定义类型使用时应特别小心。注意他的8-KB的限制,以及他们的其他限制:</P>
<P>◆他们将作为一个自动对象进行读写。<BR>◆执行代码在架构级别使用,所以对于现有类型的改变的潜在花费是很高的。</P>
<P><STRONG>Beyond SQL Server 2005</STRONG></P>
<P>SQL Server 2005 的.NET Framework 运行时环境同时装载了Visual Studio 2005。预期的服务包和热修补并没有改变版本,然而,这对于SQL Server 未来的发展并不是一个好的设定。作为.NET Framework 的发展,未来的SQL Server 版本将会转化到可以使用这些新设备。</P>
<P>下面的表可以用于应用程序开发者使用SQL Server 的.NET Framework 测试应用测试。注意如果CLR不可用,查询将返回一个空的字符串。通常来说,主要的版本都需要做检查,除非只是为了测试某些特性而发布的版本。</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>-- Will return the version if the .NET Framework has been used<BR>SELECT p.[value]<BR>FROM sys.dm_clr_properties AS p<BR>WHERE p.[name] = N'version'</P><P>-- Will return the version even if the .NET Framework is unused<BR>-- Test the version of the Microsoft .NET Runtime Execution Engine<BR>SELECT lm.product_version<BR>FROM sys.dm_os_loaded_modules AS lm<BR>WHERE lm.[name] LIKE N'%\MSCOREE.DLL'</P></PRE></TD></TR></TBODY></TABLE></P>
<P>在这个白皮书出版的时候,windows只能处理一个单一的.NET Framework 运行时环境。虽然这一点在今后的版本中还没有被确定。但是未来的SQL Server 版本可能有一下特性:</P>
<P>◆要求代码重编译 – 确定数据库管理员 和加载到SQL Server 上的源代码版本是同步的。同时使得重编译更加简单。<BR>◆要求代码修改– 利用新的API的优势同时为现有的选项设计不当的API增加选项。管理源文件以及API使用的情况。<BR>◆要求多个 .NET Framework运行时在SQL Server “down level” 代码检查时加载。它可以在性能开销方面提供更好的保护。</P>
<P>数据库管理员要管理他们公司的源代码,检测开发API的使用,还要花时间保护代码的修改。及在需要代码重写的情况下保护系统。</P>
<P><STRONG>概要</STRONG></P>
<P>这个白皮书从传统的数据库管理员的角度探究了SQL Server 2005 .NET 公共语言时的整合。</P>
<P>下面的部分提供了:</P>
<P>◆使用这个新的能力提供的对于处理和程序的安全以及成功部署的确定。<BR>◆为数据库管理员 提供了更好的目录数量管理和动态管理视图查询的能力。更简单的访问对象列表,了解系统状态的信息。<BR>◆在调试和跟踪方面为数据库管理员 提供可以发挥起最大生产力的工具集。</P>
<P>我们关心的问题是能否提出一个新特性并不适应的例举环境。丰富的SQL Server 2005 CLR整合使得再各种情况都可以很好的满足人们的要求。</P>
<P>在这篇文章中我们要学习的最重要的就是CLR整合提供了一种新的,强有力的应用程序开发工具包,以使得在许多的场景下生产力被大大提高,并且为许多企业环境提供了新的可选项。</P>
<P><STRONG>SQL Server 2005的额外资料</STRONG></P>
<P><STRONG>在Microsoft.com, MSDN和 TechNet上的免费资料</STRONG></P>
<P>MSDN SQL Server Developer Center</P>
<P>MSDN 白皮书: An Overview of SQL Server 2005 for the Database Developer <BR>MSDN白皮书: Processing XML Showplans Using SQLCLR in SQL Server 2005 <BR>MSDN白皮书: Using CLR Integration in SQL Server 2005 <BR>MSDN白皮书: XML Support in Microsoft SQL Server 2005 <BR>MSDN白皮书: XML Options in Microsoft SQL Server 2005<BR>MSDN白皮书: What's New in FOR XML in Microsoft SQL Server 2005<BR>MSDN白皮书: XML Best Practices for Microsoft SQL Server 2005<BR>MSDN白皮书: Usage Scenarios for SQL Server 2005 Native Web Services<BR>MSDN白皮书: Managed Data Access Inside SQL Server with ADO.NET and SQLCLR<BR>MSDN On-demand Webcasts<BR>MSDN Live Webcasts <BR>SQL Server 2005 Hands-On Labs<BR>SQLCLR Hands-On Lab Manual<BR>Microsoft SQL Server TechCenter on TechNet </P>
<P><STRONG>其他资源<BR></STRONG>Sample Book Chapters for SQL Server 2005 是一个讲述SQL Server 2005 的书目的列表。<BR>Hosting the .NET Runtime in Microsoft SQL Server 在 Association for Computing Machinery (<A href="http://www.ACM.org">www.ACM.org</A>)上. 要想访问这些资料需要成为SIGMOD, the ACM的会员或者直接购买。<BR>Service Oriented Database Architecture David Campbell编写, 也是在Computing Machinery (<A href="http://www.ACM.org">www.ACM.org</A>). 上发表。要想访问这些资料需要成为SIGMOD, the ACM的会员或者直接购买。</P>
<P><STRONG>更多信息:</STRONG><A href="http://www.microsoft.com/sql/">http://www.microsoft.com/sql/</A></P>
<P align=right>(责任编辑 火凤凰 <A href="mailto:sunsj@51cto.com">sunsj@51cto.com</A> QQ:34067741 TEL:(010)68476636-8007)</P></td> </tr> <tr> <td class="d_font4"> </td> </tr> </table>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?