<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sdt.sumida.com.cn:8080/cs/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Floating Heart</title><subtitle type="html">No description is bad.</subtitle><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/atom.aspx</id><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/default.aspx" /><link rel="self" type="application/atom+xml" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2008-09-03T09:21:00Z</updated><entry><title>30 分钟快快乐乐学 SQL Performance Tuning</title><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2009/01/04/30-sql-performance-tuning.aspx" /><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2009/01/04/30-sql-performance-tuning.aspx</id><published>2009-01-04T05:20:00Z</published><updated>2009-01-04T05:20:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/10/27/1320055.html"&gt;&lt;font size="3"&gt;http://www.cnblogs.com/WizardWu/archive/2008/10/27/1320055.html&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;有些程序员在撰写数据库应用程序时，常专注于 OOP 及各种 framework 的使用，却忽略了基本的 SQL 语句及其「性能 (performance)&lt;span&gt; &lt;/span&gt;优化」问题。版工曾听过台湾某半导体大厂的新进程序员，所组出来的一段 PL/SQL 跑了好几分钟还跑不完；想当然尔，即使他的 AJAX 及&lt;span&gt; ooxx &lt;/span&gt;框架用得再漂亮，系统性能也会让使用者无法忍受。以下是版工整理出的一些数据库规划、SQL performance tuning 简单心得，让长年钻研 .NET、AJAX、一堆高深 ooxx framework，却无暇研究 SQL statement 的程序员，透过最短时间对本帖的阅读，能避免踩到一些 SQL 的性能地雷&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;。&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;br /&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;(注：本帖的 SQL 语句皆经过测试可正常执行无误。有兴趣实验者，可直接拷贝后，粘贴至 SQL Server 中执行。)&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&lt;span style="COLOR:#008080;"&gt;1、数据库设计与规划&lt;/span&gt; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div id="container"&gt;
&lt;div id="mid" style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;MARGIN-LEFT:0px;"&gt;
&lt;div id="content"&gt;
&lt;div class="blogbody"&gt;
&lt;div id="container0"&gt;
&lt;div id="mid0" style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;MARGIN-LEFT:0px;"&gt;
&lt;div id="content0"&gt;
&lt;div class="blogbody"&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• Primary Key 字段的长度尽量小，能用 small integer 就不要用 integer。例如员工数据表，若能用员工编号当主键，就不要用身分证号码。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 一般字段亦同。若该数据表要存放的数据不会超过 3 万笔，用 small integer 即可，不必用 integer。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 文字字段若长度固定，如：身分证号码，就不要用 varchar 或 nvarchar，应该用 char 或 nchar。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 文字字段若长度不固定，如：地址，则该用 varchar 或 nvarchar。除了可节省存储空间外，存取硬盘时也会较有效率。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 设计字段时，若其值可有可无，最好也给一个默认值，并设成「不允许 NULL」(一般字段默认为「允许 NULL」)。因为 SQL Server 在存放和查询有 NULL 的数据表时，会花费额外的运算动作 [2]。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 若一个数据表的字段过多，应垂直切割成两个以上的数据表，并可用同名的 Primary Key 一对多连结起来，如：Northwind 的 Orders、Order Details 数据表。以避免在存取数据时，以&lt;span&gt;「集簇索引 (clustered index)」&lt;/span&gt;扫描时会加载过多的数据，或修改数据时造成互相锁定或锁定过久。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;COLOR:#008080;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;2、适当地建立索引&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 记得自行帮 Foreign Key 字段建立索引，即使是很少被 JOIN 的数据表亦然。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 替常被查询或排序的字段建立索引，如：常被当作 WHERE 子句条件的字段。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 用来建立索引的字段，长度不宜过长，不要用超过 20 个&lt;span&gt; Byte &lt;/span&gt;的字段，如：地址。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 不要替内容重复性高的字段建立索引，如：性别；反之，若重复性低的字段则适合建立索引，如：姓名。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 不要替使用率低的字段建立索引&lt;span&gt;，以免浪费&lt;/span&gt;硬盘&lt;span&gt;空间&lt;/span&gt;。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 不宜替过多字段建立索引，否则反而会影响到&lt;span&gt;「INSERT&lt;/span&gt;、&lt;span&gt;UPDATE&lt;/span&gt;、&lt;span&gt;DELETE」&lt;/span&gt;的&lt;span&gt;性&lt;/span&gt;能，尤其是以&lt;span&gt;「&lt;/span&gt;OLTP&lt;span&gt; (&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Verdana;"&gt;联机事务处理&lt;/span&gt;&lt;span style="BACKGROUND-POSITION:0% 0%;BACKGROUND-COLOR:#ffffff;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;span style="FONT-FAMILY:Verdana;"&gt;；&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;在线交易&lt;span&gt;)」&lt;/span&gt;为主的网站数据库。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 若数据表存放的数据很少，就不必刻意建立索引。否则可能数据库沿着&lt;span&gt;存放&lt;/span&gt;索引&lt;span&gt;的「&lt;/span&gt;树状结构&lt;span&gt;」(Balanced Tree) &lt;/span&gt;去搜寻索引中的数据，反而比扫描整个数据表还慢。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 若查询时符合条件的数据很多，则透过「&lt;span&gt;非集簇索引 (non-clustered index)&lt;/span&gt;」搜寻的&lt;span&gt;性&lt;/span&gt;能，反而 可能不如整个数据表逐笔扫描。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 建立「集簇索引」的字段选择至为重要，会影响到整个索引结构的&lt;span&gt;性&lt;/span&gt;能。要用来建立「集簇索引」的字段，务必选择「整数」类型 (键值会较小)、唯一、不可为 NULL。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;COLOR:#008080;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;3、适当地使用索引&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 有些书籍会提到，使用&lt;span&gt;「&lt;/span&gt;LIKE、%&lt;span&gt;」&lt;/span&gt;做模糊查询时，即使您已替某个字段建立索引 (如下方代码的 CustomerID&lt;span&gt; &lt;/span&gt;字段)，但以常量字符开头才会使用到索引，若以万用字符 (%) 开头则不会使用索引，如下所示：&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:x-small;"&gt;
&lt;table class="" id="table39" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;USE Northwind;&lt;br /&gt;GO&lt;br /&gt;SELECT * FROM Orders WHERE CustomerID LIKE &amp;#39;&lt;span style="COLOR:#ff0000;"&gt;D%&lt;/span&gt;&amp;#39;;&amp;nbsp;&amp;nbsp;&amp;nbsp; --使用索引&lt;br /&gt;SELECT * FROM Orders WHERE CustomerID LIKE &amp;#39;&lt;span style="COLOR:#ff0000;"&gt;%D&lt;/span&gt;&amp;#39;;&amp;nbsp;&amp;nbsp;&amp;nbsp; --不使用索引&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&lt;span&gt;在 SQL Server 2005 &lt;/span&gt;执行完成后按 Ctrl&lt;span&gt; &lt;/span&gt;+&lt;span&gt; &lt;/span&gt;L，可检阅如下图的「执行计划」。&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://pic002.cnblogs.com/img/wizardwu/200810/2008102700005536.jpg" /&gt;&lt;br /&gt;图 1　可看出「查询最佳化程序」有使用到索引做搜寻&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://pic002.cnblogs.com/img/wizardwu/200810/2008102700014428.jpg" /&gt;&lt;br /&gt;图 2　在此的&lt;span&gt;「&lt;/span&gt;集簇索引&lt;span&gt;」&lt;/span&gt;扫描，并未直接使用索引，&lt;span&gt;性&lt;/span&gt;能上几乎只等于扫描整个数据表&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;但经版工反复测试，这种语法是否会使用到索引，抑或会逐笔扫描，并非绝对的。仍要看所下的查询关键词，以及字段内 所存储的数据内容而定。但对于存储数据笔数庞大的数据表，最好还是少用 LIKE 做模糊查询。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY:Verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 以下的运算符会造成「负向查询」，常会让「查询最佳化程序」无法有效地使用索引，最好能用其它运算符和语法改写 (经版工测试，并非有负向运算符，就绝对无法使用索引)：&lt;br /&gt;NOT 、 != 、 &amp;lt;&amp;gt; 、 !&amp;gt; 、 !&amp;lt; 、 NOT EXISTS 、 NOT IN 、 NOT LIKE&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 避免让 WHERE 子句中的字段，去做字符串的串接或数字运算，否则可能导致「查询最佳化程序」无法直接使用索引，而改采&lt;span&gt;「&lt;/span&gt;集簇索引扫描&lt;span&gt;」&lt;/span&gt;(经版工测试并非绝对)。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 数据表中的数据，会依照「集簇索引」字段的顺序存放，因此当您下 BETWEEN、GROUP BY、ORDER BY 时若有包含「集簇索引」字段，由于数据已在数据表中排序好，因此可提升查询速度。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 若使用「复合索引」，要注意索引顺序上的第一个字段，才适合当作过滤条件。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;COLOR:#008080;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;4、避免在 WHERE 子句中对字段使用函数&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;对字段使用函数，也等于对字段做运算或串接的动作，一样可能会让「查询最佳化程序」无法有效地使用索引。但真正对&lt;span&gt;性&lt;/span&gt;能影响最重大的，是当您的数据表内若有 10 万笔数据，则在查询时就需要呼叫函数 10 万次，这点才是真正的&lt;span&gt;性&lt;/span&gt;能杀手。程序员应注意，&lt;span style="COLOR:#ff0000;"&gt;在系统开发初期可能感觉不出差异，但当系统上线且数据持续累积后，这些语法细节所造成的&lt;span&gt;性&lt;/span&gt;能问题就会逐步浮现&lt;/span&gt;。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:verdana,arial,helvetica,sans-serif;"&gt;
&lt;table class="" id="table40" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;SELECT * FROM Orders WHERE DATEPART(yyyy, OrderDate) = 1996 AND DATEPART(mm, OrderDate)=7&lt;br /&gt;可改成&lt;br /&gt;SELECT * FROM Orders WHERE OrderDate BETWEEN &amp;#39;19960701&amp;#39; AND &amp;#39;19960731&amp;#39;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;table class="" id="table41" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;SELECT * FROM Orders WHERE SUBSTRING(CustomerID, 1, 1) = &amp;#39;D&amp;#39;&lt;br /&gt;可改成&lt;br /&gt;SELECT * FROM Orders WHERE CustomerID LIKE &amp;#39;D%&amp;#39;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;注意当您在下 UPDATE、DELETE 语句时，若有采用 WHERE 子句，也应符合上述原则。。 &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;COLOR:#008080;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;5、AND 与 OR 的使用&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;在 AND 运算中，&lt;span style="COLOR:#ff0000;"&gt;「只要有一个」条件&lt;/span&gt;有用到索引 (如下方的 CustomerID)，即可大幅提升查询速度，如下图 3 所示：&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:verdana,arial,helvetica,sans-serif;"&gt;
&lt;table class="" id="table42" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;SELECT * FROM Orders WHERE CustomerID=&amp;#39;VINET&amp;#39; AND Freight=32.3800 --使用索引，会出现下图 3 的画面&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;table class="" id="table43" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;SELECT * FROM Orders WHERE Freight=32.3800 --不使用索引，会出现上图 2 的画面&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div id="container1"&gt;
&lt;div id="mid1" style="MARGIN:0px 215px 0px 0px;"&gt;
&lt;div id="content1"&gt;
&lt;div class="blogbody"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&lt;img alt="" src="http://pic002.cnblogs.com/img/wizardwu/200810/2008102700023836.jpg" /&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;图 3&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:Verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;br /&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;但在 OR 运算中，则要&lt;span style="COLOR:#ff0000;"&gt;「所有的」条件&lt;/span&gt;都有可用的索引，才能使用索引来提升查询速度。因此&lt;span style="COLOR:#ff0000;"&gt; OR 运算符的使用必须特别小心&lt;/span&gt;。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;若您将上方 AND 的范例，逻辑运算符改成 OR 的话，如下所示：&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:x-small;"&gt;
&lt;table class="" id="table44" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;SELECT * FROM Orders WHERE CustomerID=&amp;#39;VINET&amp;#39; OR Freight=32.3800&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;由于无法有效地使用索引，也会出现图 2 的画面。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;在使用 OR 运算符时，只要有一个条件 (字段) 没有可用的索引，则&lt;span style="COLOR:#ff0000;"&gt;其它所有的条件 (字段) 都有索引也没用&lt;/span&gt;，只能如图 2 般，把整个数据表或整个集簇索引都扫描过，以逐笔比对是否有符合条件的数据。&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:Verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;据网络上文件的说法 [1]，上述的 OR 运算语句，我们还可用 UNION 联集适当地改善，如下：&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:x-small;"&gt;
&lt;table class="" id="table45" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;SELECT * FROM Orders WHERE CustomerID=&amp;#39;VINET&amp;#39; &lt;br /&gt;UNION &lt;br /&gt;SELECT * FROM Orders WHERE Freight=32.3800&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;此时您再按 Ctrl&lt;span&gt; &lt;/span&gt;+&lt;span&gt; &lt;/span&gt;L 检阅「执行计划」，会发现上半段的查询会使用索引，但下半段仍用集簇索引扫描，对&lt;span&gt;性&lt;/span&gt;能不无小补。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;COLOR:#008080;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;6、适当地使用子查询&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;相较于「子查询 (Subquery)」，若能用 JOIN 完成的查询，一般会比较建议使用后者。原因除了 JOIN 的语法较容易理解外，在多数的情况下，JOIN 的&lt;span&gt;性&lt;/span&gt;能也会比子查询较佳；但这并非绝对，也有的情况可能刚好相反。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;我们知道子查询可分为「独立子查询」和「关联子查询」两种，前者指子查询的内容可单独执行，后者则无法单独执行，亦即外层查询的「每一次」查询动作都需要引用内层查询的数据，或内层查询的「每一次」查询动作都需要参考外层查询的数据。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;以下我们看一个比较极端的例子 [2]。若我们希望所有查询出来的数据，都能另外给一个自动编号，版工我在之前的文章「&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/08/02/1258832.html" target="_blank"&gt;&lt;span style="COLOR:#0000ff;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;ASP.NET 数据分页第一篇 - 探讨分页原理及 SQL Server 2005 的 ROW_NUMBER 函数&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;」中有介绍过，可用 SQL Server 2005 中新增的 ROW_NUMBER 函数轻易地达成，且 ROW_NUMBER 函数还能再加上「分群 (PARTITION BY)」等功能，而且执行性能极佳。&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://pic002.cnblogs.com/img/wizardwu/200810/2008102700031949.jpg" /&gt;&lt;br /&gt;图 4　将 Orders 数据表的 830 笔数据都捞出来，并在右侧给一组自动编号&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:Verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;现在我们要如上图 4 般，将 Northwind 数据库&lt;span&gt;中&lt;/span&gt; Orders 数据表的 830 笔数据都捞出来，并自动给一组编号，若用 ROW_NUMBER 函数的写法如下所示，而且&lt;span&gt;性&lt;/span&gt;能极佳，只要 2 ms (毫秒)，亦即千分之二秒。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:x-small;"&gt;
&lt;table class="" id="table46" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;SET STATISTICS TIME ON&lt;br /&gt;&lt;br /&gt;SELECT OrderID, &lt;span style="COLOR:#ff0000;"&gt;ROW_NUMBER&lt;/span&gt;() OVER(ORDER BY OrderID) AS 编号 &lt;br /&gt;FROM dbo.Orders&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;但如果是&lt;span&gt;传统的&lt;/span&gt;「子查询」写法&lt;span&gt;，或 辅以 AS 关键词的「衍生数据表」的语法，写法必须如下 (拷贝后在 SQL Server 中实际可执行)&lt;/span&gt;：&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;
&lt;table class="" id="table47" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;SET STATISTICS TIME ON&lt;br /&gt;&lt;br /&gt;SELECT OrderID, &lt;br /&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;(SELECT COUNT(*) FROM dbo.Orders &lt;span style="COLOR:#ff0000;"&gt;AS&lt;/span&gt; 内圈&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;WHERE 内圈.OrderID &amp;lt;= &lt;span style="COLOR:#ff0000;"&gt;外圈&lt;/span&gt;.OrderID) &lt;span style="COLOR:#ff0000;"&gt;AS&lt;/span&gt; 编号&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;FROM dbo.Orders AS 外圈 &lt;br /&gt;ORDER BY 编号&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;但这种旧写法，会像先前所提到的，外层&lt;span&gt; (&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;"&gt;外圈&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;查询的「每一次」查询动作都需要引用内层&lt;span&gt; (&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;"&gt;内圈&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;查询的数据。以上方示例而言，外层查询的每一笔数据，都要等内层查询「扫描整个数据表」并作比对和计数，因此 830 笔数据每一笔都要重复扫描整个数据表 830 次，所耗用的时间也因此爆增至 170 ms。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;若您用相同的写法，去查询 AdventureWorks 数据库中，有 31,465 笔数据的 Sales.SalesOrderHeader 数据表，用 ROW_NUMBER 函数要 677 ms，还不到 1 秒钟；但用子查询的话，居然要高达 2&lt;span&gt;33&lt;/span&gt;,&lt;span&gt;8&lt;/span&gt;35 ms，将近快 4 分钟的时间。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:verdana,arial,helvetica,sans-serif;"&gt;
&lt;table class="" id="table48" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&lt;span style="COLOR:#008000;"&gt;-- 用&lt;span&gt; &lt;/span&gt;ROW_NUMBER&lt;span&gt; &lt;/span&gt;的写法，改查询 AdventureWorks 数据库 (31,465 笔数据，要 677 ms，还不到 1 秒钟)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;SELECT SalesOrderID, &lt;span style="COLOR:#ff0000;"&gt;ROW_NUMBER&lt;/span&gt;() OVER(ORDER BY SalesOrderID) AS rownum&lt;br /&gt;FROM Sales.SalesOrderHeader&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;table class="" id="table49" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;COLOR:#008000;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;-- 用&lt;span&gt;「&lt;/span&gt;子查询&lt;span&gt;」&lt;/span&gt;的写法，改查询 AdventureWorks 数据库&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&lt;span style="COLOR:#008000;"&gt; (31,465 笔数据，要&lt;span&gt; &lt;/span&gt;2&lt;span&gt;33&lt;/span&gt;,&lt;span&gt;8&lt;/span&gt;35 ms，将近 4 分钟)&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:verdana,arial,helvetica,sans-serif;"&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;br /&gt;&lt;span style="COLOR:#000000;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;SELECT SalesOrderID, &lt;br /&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;(SELECT COUNT(*) FROM Sales.SalesOrderHeader &lt;span style="COLOR:#ff0000;"&gt;AS&lt;/span&gt; 内圈&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;WHERE 内圈.SalesOrderID &amp;lt;= &lt;span style="COLOR:#ff0000;"&gt;外圈&lt;/span&gt;.SalesOrderID) &lt;span style="COLOR:#ff0000;"&gt;AS&lt;/span&gt; 编号 &lt;br /&gt;FROM Sales.SalesOrderHeader AS 外圈 &lt;br /&gt;ORDER BY 编号&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;br /&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;虽然这是较极端的范例，但由此可知子查询的撰写，在使用上不可不慎，尤其是「关联子查询」。程序员在&lt;span style="COLOR:#ff0000;"&gt;&lt;span&gt;系统&lt;/span&gt;开发初期、数据量还很少时感受不到此种 SQL 语法的重大陷阱&lt;/span&gt;；但等到系统上线几个月或一两年后，就会有反应迟缓的现象&lt;span&gt;， 不可不慎&lt;/span&gt;。&lt;br /&gt;&lt;br /&gt;&lt;span&gt;注：AS 关键词及「衍生数据表」是 SQL Server&amp;nbsp;的语法，「衍生数据表」只会存在内存中，AS 关键词的作用是赋予一个别名。过去许多必须用暂存数据表或 View (&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&lt;span&gt;视图&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span&gt;) 的情况，现在都可以用「衍生数据表」来取代，如此一来不但可以降低数据库管理工作的负担，亦可提升查询性能。&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;COLOR:#008080;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;7、其他查询技巧&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• DISTINCT、ORDER BY 语法，会让数据库做额外的计算。此外&lt;span&gt;「&lt;/span&gt;联集&lt;span&gt;」&lt;/span&gt;的使用，若没有要剔除重复数据的需求，使用 UNION ALL 会比 UNION 更&lt;span&gt;优&lt;/span&gt;，因为后者会加入类似 DISTINCT 的算法。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;• 在 SQL Server 2005 中，存取数据库对象时，最好明确指定该对象的「结构描述 (Schema)」，也就是使用两节式&lt;span&gt;的&lt;/span&gt;名称&lt;span&gt;，如下方代码所示&lt;/span&gt;。否则若呼叫者的预设 Schema 不是 dbo，则 SQL Server 在执行时，会先寻找该使用者预设 Schema 所搭配的对象，找不到的话才会转而使用预设的 dbo，会多耗费寻找的时间。因此若要执行一个叫做 dbo.mySP1 的 Stored Procedure，应使用以下的两节式名称： &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;table class="" id="table50" style="WIDTH:100%;" cellspacing="1" cellpadding="1"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;EXEC dbo.mySP1&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&lt;span style="COLOR:#008080;"&gt;8、尽可能用 Stored Procedure 取代应用程序直接存取数据表&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stored Procedure 除了经过事先编译、&lt;span&gt;性&lt;/span&gt;能较好以外，亦可节省 SQL &lt;span&gt;语句&lt;/span&gt;传递的&lt;span&gt;网络&lt;/span&gt;频宽，也方便商业逻辑的重复使用。再搭配自订函数和 View 的使用，将来若要修改数据表结构、重新切割或&lt;span&gt;「&lt;/span&gt;反正规化&lt;span&gt;」&lt;/span&gt;时亦较方便。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;COLOR:#008080;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;9、尽可能在数据来源层，就先过滤数据&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;使用 SELECT 语法时，尽量避免传回所有的数据至前端而不设定 WHERE 等过滤条件。虽然 ASP.NET 中 SqlDataSource、ObjectDataSource 控件的 FilterExpression 可再做筛选，GridView 控件的 SortExpression 可再做排序，但会多消耗掉数据库的系统资源、&lt;span&gt;w&lt;/span&gt;eb server 的内存和网络频宽。最好还是在数据库和数据来源层，就先用 SQL 条件式&lt;span&gt;或 &lt;/span&gt;Stored Procedure&lt;span&gt; &lt;/span&gt;筛选出所要的资料。&lt;span&gt;有关这方面，网友们可参考版工我之前写的「ASP.NET 数据分页」系列的四篇帖子。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;结论：&lt;br /&gt;本文的观念，不管是写 SQL statement、Stored Procedure、自订函数或 View 皆然。本文只是挑出程序员较容易犯的 SQL 语法&lt;span&gt;性&lt;/span&gt;能问题，以期能在短时间浏览过本文后，在写 ADO.NET 程序时能修正以往随兴的 SQL &lt;span&gt;语句&lt;/span&gt;撰写习惯。文中提到的几点，只不过是 SQL 语法&lt;span&gt;性&lt;/span&gt;能议题的入门。&lt;span&gt;市面上有很多更进阶的书籍，例如：「&lt;a href="http://www.amazon.com/Art-SQL-Stephane-Faroult/dp/0596008945/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1225022879&amp;amp;sr=1-1" target="_blank"&gt;&lt;span style="COLOR:#0000ff;"&gt;The Art of SQL&lt;/span&gt;&lt;/a&gt;」、「&lt;a href="http://www.amazon.com/SQL-Tuning-Dan-Tow/dp/0596005733/ref=sr_1_3?ie=UTF8&amp;amp;s=books&amp;amp;qid=1225022879&amp;amp;sr=1-3" target="_blank"&gt;&lt;span style="COLOR:#0000ff;"&gt;SQL Tuning&lt;/span&gt;&lt;/a&gt;」，亦有针对 Oracle 或 SQL Server 数据库撰写的 &lt;a href="http://www.amazon.com/Professional-Server-Performance-Tuning-Programmer/dp/0470176393/ref=sr_1_3?ie=UTF8&amp;amp;s=books&amp;amp;qid=1225022948&amp;amp;sr=1-3" target="_blank"&gt;&lt;span style="COLOR:#0000ff;"&gt;performance tuning 相关书籍&lt;/span&gt;&lt;/a&gt;，有兴趣者可自行翻阅&lt;/span&gt;。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;br /&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------------------------------------&lt;br /&gt;------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;参考文件：&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;[1] SQL&lt;span&gt; &lt;/span&gt;查询最佳化 (网际乌托邦)：&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.ithome.com.tw/plog/index.php?op=ViewArticle&amp;amp;articleId=5421&amp;amp;blogId=620" target="_blank"&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;http://www.ithome.com.tw/plog/index.php?op=ViewArticle&amp;amp;articleId=5421&amp;amp;blogId=620&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:Verdana;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;参考书籍：&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;[2] SQL Server 2005 Performance Tuning 效能调校&lt;span&gt; (台湾书籍)&lt;/span&gt;：&lt;br /&gt;作者：胡百敬、姚巧枚、刘承修&lt;br /&gt;出版社：悦知出版社&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=9789866761225&amp;amp;sid=41966" target="_blank"&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=9789866761225&amp;amp;sid=41966&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;[3] SQL Server 2005 完全实战&lt;span&gt; (台湾书籍)&lt;/span&gt;：&lt;br /&gt;作者：章立民&lt;br /&gt;出版社：碁峰出版社&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=9789861810454&amp;amp;sid=31975" target="_blank"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=9789861810454&amp;amp;sid=31975&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;相关文件：&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;[4] 台大医院数据库分割疏失，系统几近停摆 (ITHome)：&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.ithome.com.tw/itadm/article.php?c=43597" target="_blank"&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;http://www.ithome.com.tw/itadm/article.php?c=43597&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;[5]] 当&lt;span&gt; &lt;/span&gt;DataGrid&lt;span&gt; &lt;/span&gt;遇见100&lt;span&gt; &lt;/span&gt;万笔资料：&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blog.sina.com.tw/4907/article.php?pbgid=4907&amp;amp;entryid=3921" target="_blank"&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;http://blog.sina.com.tw/4907/article.php?pbgid=4907&amp;amp;entryid=3921&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;&lt;img src="http://10.180.0.10:8080/cs/emoticons/emotion-14.gif" alt="Devil" /&gt; ASP.NET 2.0 GridView 范例集 - 「4-8-4、GridView&lt;span&gt; &lt;/span&gt;的效能」：&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blog.csdn.net/Code6421/archive/2007/12/22/1958167.aspx" target="_blank"&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;http://blog.csdn.net/Code6421/archive/2007/12/22/1958167.aspx&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;[7] 有关开启页面时，一次加载数千笔数据的&lt;span&gt;性&lt;/span&gt;能问题：&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.blueshop.com.tw/board/show.asp?subcde=BRD200709141021458MV" target="_blank"&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;http://www.blueshop.com.tw:80/board/show.asp?subcde=BRD200709141021458MV&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:x-small;FONT-FAMILY:Verdana;"&gt;&lt;span style="FONT-FAMILY:verdana,geneva;"&gt;&lt;span style="FONT-SIZE:small;"&gt;&lt;span style="FONT-SIZE:x-small;"&gt;&lt;font size="3"&gt;------------------------------&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://sdt.sumida.com.cn:8080/cs/aggbug.aspx?PostID=11538" width="1" height="1"&gt;</content><author><name>wicky</name><uri>http://sdt.sumida.com.cn:8080/cs/members/wicky.aspx</uri></author><category term="Database" scheme="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/tags/Database/default.aspx" /></entry><entry><title>网站性能越来越差怎么办？</title><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2009/01/04/11537.aspx" /><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2009/01/04/11537.aspx</id><published>2009-01-04T05:17:00Z</published><updated>2009-01-04T05:17:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2009/01/03/1367527.html"&gt;http://www.cnblogs.com/WizardWu/archive/2009/01/03/1367527.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;新的一年，你的老板或客户，是否曾和你抱怨公司的网站性能愈来愈差？网站大家都会写，自从有了 Visual Studio 之后，连你家楼下的正妹小喵和隔壁的王大婶都会写 ASP.NET。但同样的一个画面，背后的性能却可能是天差地远，更惶论多人同时上线的企业网站，而程序员的身价也因此有所差别。本帖提供一些改善网站性能的点子，从硬件、软件、程序技巧的层面都有，也欢迎大家分享自己的经验或秘技。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;(1) 重新调整或重新设计 DB schema、索引 (index)&lt;/p&gt;
&lt;p&gt;一个在线系统的性能不佳，主要原因都是来自于数据库规划及 SQL 语句层面，至于 .NET 程序撰写不良都还在其次。&lt;/p&gt;
&lt;p&gt;先将数据库适度地做正规化，如：一个 Table 中，避免把常用的字段、很少用的字段，都塞在同一个表中，而影响数据扫描的速度。&lt;br /&gt;应该将很少用的字段，另切割出来成为另一个表。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;请参考:&lt;br /&gt;30 分钟快快乐乐学 SQL Performance Tuning:&lt;br /&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/10/27/1320055.html"&gt;http://www.cnblogs.com/WizardWu/archive/2008/10/27/1320055.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(2) 改写 SQL 语句，注意 index 是否在查询时有真的被用到&lt;/p&gt;
&lt;p&gt;* 同样的功能，一个不良的「关联子查询」和&lt;span&gt;良好&lt;/span&gt;的「独立子查询」，之间的 SQL 性能差距，是不到一秒钟和&lt;span&gt;好几&lt;/span&gt;分钟以上的差距。&lt;/p&gt;
&lt;p&gt;* 一些 SQL 关键词，只要一出现在 SQL 语句中，就可能造成表的「索引 (index)」完全失效或部分失效，变成要整个表去逐行逐列地扫描，&lt;br /&gt;例如: NOT、&lt;span style="COLOR:#ff0000;"&gt;NOT IN&lt;/span&gt;、!=、&amp;lt;&amp;gt;、&lt;span style="COLOR:#ff0000;"&gt;OR&lt;/span&gt; ...等关键词，&lt;br /&gt;还有「LIKE &amp;#39;&lt;span style="COLOR:#ff0000;"&gt;%&lt;/span&gt;关键词&amp;#39;」的模糊查询，也会造成索引失效，但「LIKE &amp;#39;关键词&lt;span style="COLOR:#ff0000;"&gt;%&lt;/span&gt;&amp;#39;」就不会造成索引失效。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;请参考:&lt;br /&gt;30 分钟快快乐乐学 SQL Performance Tuning:&lt;br /&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/10/27/1320055.html"&gt;http://www.cnblogs.com/WizardWu/archive/2008/10/27/1320055.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(3) 使用 Native 的 DataProvider&lt;/p&gt;
&lt;p&gt;放弃 OleDb，改用 ADO.NET Native 的 DataProvider，如: SqlClient、OracleClient。但若您公司坚持要用 Sybase 这种从 2003 年之后，就不曾更新 DB driver 的数据库，就只好继续用性能不佳的 OleDb 去联机了。&lt;/p&gt;
&lt;p&gt;据版工我用 Visual Studio 内建的 stress test 工具，测试 OleDb 和 SqlClient 的性能差距，模拟 30 人同时上线，用浏览器撷取一万笔数据，两者的速度就差了一秒钟；且当数据库的数据越多，或越多人同时上线时，性能差距会更明显。&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(4) 用程序或软件做缓存&lt;/p&gt;
&lt;p&gt;用程序做缓存，如 ASP.NET 从 1.x 时代，就已内建的 Cache (缓存) 机制；或用一些第三方的辅助软件、Framework，这方面若有其它网友知道好用的软件，亦恳请留言告知。&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(5) 用硬件做快取或缓冲、砸钱加装 AP Server&lt;/p&gt;
&lt;p&gt;ITHome - 游戏基地网页效能提升的关键人物 (此连结连至台湾网页，若无法开启敬请见谅) :&lt;br /&gt;&lt;a href="http://www.ithome.com.tw/itadm/article.php?c=52558"&gt;http://www.ithome.com.tw/itadm/article.php?c=52558&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下引用自原文:&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#c0c0c0;"&gt;&lt;span style="COLOR:#999999;"&gt;&lt;span style="COLOR:#666699;"&gt;种种缺失使得网站的使用人数锐减。面对网站一堆问题，陈xx也决定要将网站再次大幅度调整，将之前的网页程序，以及 SQL 查询语句全部重写，他们花了三个月的时间执行。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#c0c0c0;"&gt;&lt;span style="COLOR:#999999;"&gt;&lt;span style="COLOR:#666699;"&gt;陈xx还在原本的网页服务器，与数据库服务器的架构中，加入一组应用程序服务器，作为网页服务器 cache 数据的来源。 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#c0c0c0;"&gt;&lt;span style="COLOR:#999999;"&gt;&lt;span style="COLOR:#666699;"&gt;改版之后的新网站，搜寻速度提升许多，先前每日的统计数据中，处理速度超过 3 秒的数据超过 50 万笔；而改版后，每星期超过 3 秒的查询不到 10 笔，而这少数反应速度不够快的查询，也多是内部作业执行大量批处理导致的。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#c0c0c0;"&gt;&lt;span style="COLOR:#999999;"&gt;&lt;span style="COLOR:#666699;"&gt;由于原本使用的 L4 Switch 较为老旧，负载量比较差，因此陈xx选择将它汰换新的设备，加强负载量；恰好那时正好准备将应用服务器的架构上线，就藉此机会将网络架构更新。陈xx说，这样的架构搭配负载较强的 L4 交换器，强化网站的处理性能，并凭借此抵御网络攻击。在此之后，网站依然会受到零星攻击，但都不会对造成太大影响。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(6) 用硬件做快取或缓冲、砸钱加装 AP Server&lt;/p&gt;
&lt;p&gt;数字之墙 - 网站外销的个人实践（二）运营 (此连结连至台湾网页，若无法开启敬请见谅) :&lt;br /&gt;&lt;a href="http://epaper.pchome.com.tw/adm/brief_left.htm?s_code=0263"&gt;http://epaper.pchome.com.tw/adm/brief_left.htm?s_code=0263&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下引用自原文:&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;全盛时期，来自美国 blog 的流量每天达 80 万次。这个数字其实不高，对程序高手来说是小菜一碟，但笔者是半吊子工程师，知识有限也因此可能程序写得不好，频频被主机供货商发信警告，要求改善网站系统性能。最后，我决定开发 cache system。 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;cache system 缓存系统上线后，将数据库读写，从每天 80 万次降低到每天 16 万次。这期间也请高手朋友帮忙进行数据库结构优化，帮助很大。笔者在过程中学习到，一个良好的「缓存系统 (cache system)」对于提供 Widget 功能的网站来说非常重要。 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;…中间略…&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;能够做到随时搬迁整个网站到另一家主机供货商，除了程序本身的调整外，还要归功于网站管理软件的盛行。在此要推荐的一套称为 Plesk 的网站管理软件。有的主机供货商会直接帮你安装 Plesk ，免费或另外付费。 Plesk 的所有管理功能都是透过 Web 界面，方便到无以复加，大大降低对技术能力的要求。 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;除了 Plesk 以外，网站管理软件还有其它选择。还有 WHM 加上 cPanel 的组合，也是常见的网站管理解决方案。不过笔者还是比较偏好使用 Plesk，毕竟使用起来容易，也难怪他们的市场占有率一直是独大。只是，功力高的工程师可能会喜欢 WHM + cPanel，因为弹性比较大。不论选择哪一种，都可以帮助你节省许多时间。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(7) 加装实体机器做 Loading Balance (负载平衡)。一些 Server OS 亦内建此类设定功能。&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(8) 程序技巧 - ADO.NET&lt;/p&gt;
&lt;p&gt;能用 DataReader 就不要用 DataSet / DataTable，前者读取速度快又不耗内存；后者虽较有弹性，但速度较慢又会每个使用者消耗许多内存。若您连 DropDownList 控件的数据来源，都用 SqlDataSource 控件的默认值 - DataSet，则当页面里塞了一堆下拉选单时，性能当然会受影响。&lt;/p&gt;
&lt;p&gt;但前提是程序员对 ADO.NET 要有一定程度的了解，若只会用 Visual Studio 透过图形界面，拖拉 TableAdapter、DataTable、.xsd 就免谈了。&lt;/p&gt;
&lt;p&gt;若为 DataTable 建立 Primary Key，DataTable 会建立一个索引，追踪新增到 DataTable 中的数据是否符合此条件约束 (constraint)。ADO.NET 2.0 会使用 algorithm 的「红黑树算法 (Red-Black Tree，是一&lt;span&gt;种「&lt;/span&gt;平衡树」算法) &lt;span&gt;去&lt;/span&gt;处理索引，让 DataTable 的数据量大时，较方便维护索引；但缺点是建立索引时会降低一&lt;span&gt;些&lt;/span&gt;性能。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;此外，数据库的走访和捞值，应该尽量在一次 DB connection 做完，一个 connection 可搭配多个 DbCommand 对象使用，不用每次都一个 DbConnection 配一个 DbCommand。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;在此推荐一本不错的 ADO.NET 原文书:&lt;/p&gt;
&lt;p&gt;Programming Microsoft ADO.NET 2.0 Core Reference:&lt;br /&gt;&lt;a href="http://www.amazon.com/Programming-Microsoft%C2%AE-ADO-NET-Core-Reference/dp/073562206X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1230971264&amp;amp;sr=1-1"&gt;http://www.amazon.com/Programming-Microsoft%C2%AE-ADO-NET-Core-Reference/dp/073562206X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1230971264&amp;amp;sr=1-1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有探讨许多市面上书籍少见的深入内容，像 Oracle + ADO.NET 的各种应用、Connection Pooling 的特性、各种的数据库 Balk (批次) 作业应用。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;请参考:&lt;/p&gt;
&lt;p&gt;适时调整 SqlDataSource 控件的 DataSourceMode 属性:&lt;br /&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/07/15/1243661.html"&gt;http://www.cnblogs.com/WizardWu/archive/2008/07/15/1243661.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用 ADO.NET 的 NextResult 方法取得多个 Result Set:&lt;br /&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/07/11/1241174.html"&gt;http://www.cnblogs.com/WizardWu/archive/2008/07/11/1241174.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(9) 程序技巧 - .NET 语法&lt;/p&gt;
&lt;p&gt;* 避免一些书上教的，把 DataTable 或大量数据，直接塞进 Session 里，此举在真正要上线的系统必死无疑。Session 在多人同时上线时，内存的消耗是很可观的，因为 Session 是每个用户各存一份在服务器的内存里，而非像「缓存 (cache)」是所有的用户共享服务器的一块内存。在很多 ASP.NET 的需求中，可用 HiddenField 控件或&amp;nbsp; ViewState 取代 Session。&lt;/p&gt;
&lt;p&gt;* 能用「泛型 (Generics)」就不要用旧版的写法，Generics 除了安全外，亦可避免 .NET 类型在 Boxing / Unboxing 转型时影响性能，例如: &lt;br /&gt;能用 List&amp;lt;string&amp;gt; 就不要用旧的 ArrayList，能用 Dictionary&amp;lt;TKey,TValue&amp;gt; 就不要用 Hashtable 或跑双层的循环 (loop)，因 ArrayList、Hashtable 的 element 属于 object 类型，在存储或检索时，会引发 Boxing / Unboxing。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;当然上述前提，是系统要用 .NET 开发，还在靠 ASP 或非 OOP 语言硬撑的旧系统就免谈了。&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(10) 程序技巧 - 数据库「事务 (Transaction)」&lt;/p&gt;
&lt;p&gt;您是否知道 SQL Server 的默认「事务隔离等级 (Isolation Level)」，是「ReadCommitted」，当您在写 ADO.NET 用了 SqlTransaction 时，默认是当某个人在修改某一笔记录时，其它所有读取这一笔记录的人，都会被「锁定 (lock)」住，造成其它全部用户的浏览器都在等待中，无法做其它工作。&lt;/p&gt;
&lt;p&gt;而 Oracle 事务的特性，是绝不会有类似无法读取的情形，至少会用类似 SQL Server 2005 新增的「快照隔离 (Snapshot Isolation)」，让用户至少能先读取到未 Commit 或 Rollback 的记录，而不用呆坐在浏览器前面傻等。&lt;/p&gt;
&lt;p&gt;不过 SQL Server 2005 的「快照隔离」默认未启用。用 SQL Server 开发的系统，若怕用户被锁定的问题，可视 project 需求，改用最宽松的「ReadUncommitted」事务隔离等级，其特性为不会造成任何锁定，但可能会造成 Dirty Read。SQL Server 有下列七种「事务隔离等级」，有兴趣的网友可去查询 ADO.NET 书籍或 MSDN Library:&lt;/p&gt;
&lt;p&gt;Chaos&lt;br /&gt;ReadCommitted　　// SQL Server 默认值&lt;br /&gt;ReadUncommitted　// 最宽松，会有 Dirty Read&lt;br /&gt;RepeatableRead&lt;br /&gt;Serializable　　　　// 最严，会有大量的锁定&lt;br /&gt;Snapshot&lt;br /&gt;Unspecified&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;请参考:&lt;/p&gt;
&lt;p&gt;Oracle 11g 学习笔记 (5):&lt;br /&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/12/07/1349665.html"&gt;http://www.cnblogs.com/WizardWu/archive/2008/12/07/1349665.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(11) ASP.NET 分页&lt;/p&gt;
&lt;p&gt;GridView + SqlDataSource 的默认行为，就是每次换页或排序时，不管数据库有几笔记录都全部重捞一次；当数据库有一百万笔数据，就在每个用户换页时，都一百万笔全部重捞出来，此举消耗了大量的 Web server/&amp;nbsp;AP server&amp;nbsp;内存、数据库系统资源、网络频宽，结果网站性能可想而知。&lt;/p&gt;
&lt;p&gt;很多企业内的小型网站，为了省钱，随便外包给低价抢标的工作室，或没经验的学生和 SOHO 族，可能因此埋下了恐怖的后遗症。最可怕的是这些未爆弹，在开发期间和系统刚上线、数据量还很少时，都感觉不出来，有如癌症一样，会在将来忽然爆发。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;请参考:&lt;/p&gt;
&lt;p&gt;ASP.NET 数据分页 1 ~ 4 篇&amp;nbsp;series :&lt;br /&gt;(有现成的 ASP.NET 2.0 + ObjectDataSource 控件 + Stored Procedure 做「分页」的示例可下载)&lt;br /&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/09/28/1301616.html"&gt;http://www.cnblogs.com/WizardWu/archive/2008/09/28/1301616.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/09/07/1286270.html"&gt;http://www.cnblogs.com/WizardWu/archive/2008/09/07/1286270.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/08/06/1261589.html"&gt;http://www.cnblogs.com/WizardWu/archive/2008/08/06/1261589.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cnblogs.com/WizardWu/archive/2008/08/02/1258832.html"&gt;http://www.cnblogs.com/WizardWu/archive/2008/08/02/1258832.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.sina.com.tw/4907/article.php?pbgid=4907&amp;amp;entryid=3921"&gt;http://blog.sina.com.tw/4907/article.php?pbgid=4907&amp;amp;entryid=3921&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;&amp;nbsp;(12) ASP.NET AJAX 的 UpdatePanel 控件不是万能的&lt;/p&gt;
&lt;p&gt;以下引用自 MSDN Magazine:&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;不论好坏，UpdatePanel 控件都是 ASP.NET AJAX 社区所喜爱的。我说“好”，是因为 UpdatePanel 使部分页面呈现变得相当简单，而说“坏”，是因为它的简便和易用性是以效率和令人啼笑皆非的带宽为代价的。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;UpdatePanel 可以为一般的网页带来 AJAX 神奇的好处，但是它不能提供我们与 AJAX 正常关联的高效性。例如，您是否知道，当 UpdatePanel 控件对服务器执行异步 AJAX 回调以更新其内容时，这个请求包含了常规 ASP.NET 回发所包含的一切，其中还包括 ViewState 呢？具有太多 ViewState 的页面会降低性能，并且具有太多 ViewState 的页面在 ASP.NET 应用程序中都太常见。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;如果您准备使用 UpdatePanel 控件，您需要清楚您在准备干什么。在许多情况下，从性能的角度而言，应用程序最好是不使用 UpdatePanel，而是使用对 WebMethods 或页面方法的异步调用。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;…中間略…&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;当您使用 UpdatePanel 在一个页面上执行无闪烁更新时，您可能会认为您在进行高效构建。毕竟，UpdatePanel 使用的是 AJAX，不是吗？不幸的是，如果您在 UpdatePanel 更新时检验一下网络中的通信，您会发现您根本就没有保存什么东西，至少是在发送的时候没有保存。通常在回发期间传送到服务器的 ViewState 数据（与其他数据）也会在 UpdatePanel 回调期间传送。事实上，来自 UpdatePanel 的异步 XML-HTTP 请求中所增长的数据，几乎与在标准 ASP .NET 回发中增长的数据相同。下面是有关 ASP.NET AJAX 不可告人的秘密：UpdatePanel 虽易于使用，但是通信效率不高。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:#666699;"&gt;几乎没有什么办法可让您提高 UpdatePanel 的效率，但是您可以放弃使用 UpdatePanel，并转而使用 ASP.NET AJAX 的其他功能来更新页面内容，它不仅同样流畅，而且更加高效。它只需要多一点点力气，但是最后的结果往往让人觉得是值得付出的，因为您可以大大降低在客户端与服务器之间传输的数据量。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;请参考:&lt;/p&gt;
&lt;p&gt;UpdatePanel 提示和技巧 (MSDN Magazine, 2007/6):&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/magazine/cc163413.aspx"&gt;http://msdn.microsoft.com/zh-cn/magazine/cc163413.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;
&lt;p&gt;(13) Design Patterns&lt;/p&gt;
&lt;p&gt;虽然「设计模式」不是为解决性能问题而诞生的，但可适度防止没经验的新人做出蠢事。多学一些 .NET 技术敌营注重的系统架构、OOAD、Design Patterns 和相关的 Framework，对提升自己的身价和薪资也有帮助。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;相關書籍:&lt;/p&gt;
&lt;p&gt;C# 3.0 Design Patterns:&lt;br /&gt;&lt;a href="http://oreilly.com/catalog/9780596527730/index.html"&gt;http://oreilly.com/catalog/9780596527730/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Head First Design Patterns:&lt;br /&gt;&lt;a href="http://oreilly.com/catalog/9780596007126/index.html"&gt;http://oreilly.com/catalog/9780596007126/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;----------------------------------------------&lt;/p&gt;&lt;img src="http://sdt.sumida.com.cn:8080/cs/aggbug.aspx?PostID=11537" width="1" height="1"&gt;</content><author><name>wicky</name><uri>http://sdt.sumida.com.cn:8080/cs/members/wicky.aspx</uri></author><category term="ASP.Net" scheme="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/tags/ASP.Net/default.aspx" /></entry><entry><title>ASP.NET MVC Framework Series by ScottGu</title><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2009/01/03/asp-net-mvc-framework-series-by-scottgu.aspx" /><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2009/01/03/asp-net-mvc-framework-series-by-scottgu.aspx</id><published>2009-01-03T05:55:00Z</published><updated>2009-01-03T05:55:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx" target="_blank"&gt;ASP.NET MVC Road-Map Update&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx" target="_blank"&gt;Introducing the ASP.NET MVC Framework&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx" target="_blank"&gt;ASP.NET MVC Framework Tutorial Part 1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx" target="_blank"&gt;ASP.NET MVC Framework Tutorial Part 2: URL Routing&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx" target="_blank"&gt;ASP.NET MVC Framework Tutorial Part 3: Passing ViewData from Controllers to Views&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios.aspx" target="_blank"&gt;ASP.NET MVC Framework Tutorial Part 4: Handling Form Edit and Post Scenarios&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/03/21/asp-net-mvc-source-code-now-available.aspx" target="_blank"&gt;ASP.NET MVC Source Code Now Available&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/04/16/asp-net-mvc-source-refresh-preview.aspx" target="_blank"&gt;ASP.NET MVC Source Refresh Preview&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/05/27/asp-net-mvc-preview-3-release.aspx" target="_blank"&gt;ASP.NET MVC Preview 3 Release&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx" target="_blank"&gt;ASP.NET MVC Preview 4 Release Part 1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx" target="_blank"&gt;ASP.NET MVC Preview 5 and Form Posting Scenarios&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx" target="_blank"&gt;More Posts&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://sdt.sumida.com.cn:8080/cs/aggbug.aspx?PostID=11522" width="1" height="1"&gt;</content><author><name>wicky</name><uri>http://sdt.sumida.com.cn:8080/cs/members/wicky.aspx</uri></author><category term="ASP.Net" scheme="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/tags/ASP.Net/default.aspx" /></entry><entry><title>一位软件工程师的6年总结</title><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/12/28/11473.aspx" /><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/12/28/11473.aspx</id><published>2008-12-28T00:45:00Z</published><updated>2008-12-28T00:45:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://blog.csdn.net/java2000_net/archive/2008/08/29/2850290.aspx"&gt;http://blog.csdn.net/java2000_net/archive/2008/08/29/2850290.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="宋体"&gt;作者：成晓旭 &lt;br /&gt;&lt;br /&gt;“又是一年毕业时”，看到一批批学子离开人生的象牙塔，走上各自的工作岗位；想想自己也曾经意气风发、踌躇满志，不觉感叹万千……本文是自己工作6年的经历沉淀或者经验提炼，希望对所有的软件工程师们有所帮助，早日实现自己的人生目标。本文主要是关于软件开发人员如何提高自己的软件专业技术方面的具体建议，前面几点旨在确定大的方向，算是废话吧。 &lt;br /&gt;&lt;br /&gt;谨以此文献给那个自己为你奉献3年青春与激情的开发团队。还有团队成员：PPL、YT、YK 、TYF、LGL、CHL、CDY、CB、DPD。 &lt;br /&gt;&lt;br /&gt;1、分享第一条经验：“学历代表过去、能力代表现在、学习力代表未来。”其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要：“重要的道理明白太晚将抱憾终生！”所以放在每一条，让刚刚毕业的朋友们早点看到哈！&lt;br /&gt;&lt;br /&gt;2、一定要确定自己的发展方向，并为此目的制定可行的计划。不要说什么，“我刚毕业，还不知道将来可能做什么？”，“跟着感觉走，先做做看”。因为，这样的观点会通过你的潜意识去暗示你的行为无所事事、碌碌无为。一直做技术，将来成为专家级人物？向管理方向走，成为职业经理人？先熟悉行业和领域，将来自立门户？还是先在行业里面混混，过几年转行做点别的？这很重要，它将决定你近几年、十年内“做什么事情才是在做正确的事情！”。 &lt;br /&gt;&lt;br /&gt;3、软件开发团队中，技术不是万能的，但没有技术是万万不能的！在技术型团队中，技术与人品同等重要，当然长相也比较重要哈，尤其在MM比较多的团队中。在软件项目团队中，技术水平是受人重视和尊重的重要砝码。无论你是做管理、系统分析、设计、编码，还是产品管理、测试、文档、实施、维护，多少你都要有技术基础。算我孤陋寡闻，我还真没有亲眼看到过一个外行带领一个软件开发团队成功地完成过软件开发项目，哪怕就一个，也没有看到。倒是曾经看到过一个“高学历的牛人”(非技术型)带一堆人做完过一个项目，项目交付的第二天，项目组成员扔下一句“再也受不了啦！”四分五裂、各奔东西。那个项目的“成功度”大家可想而知了。 &lt;br /&gt;&lt;br /&gt;4、详细制定自己软件开发专业知识学习计划，并注意及时修正和调整(软件开发技术变化实在太快)。请牢记：“如果一个软件开发人员在1、2年内都没有更新过自己的知识，那么，其实他已经不再属于这个行业了。”不要告诉自己没有时间。来自时间管理领域的著名的“三八原则”告诫我们：另外的那8小时如何使用将决定你的人生成败！本人自毕业以来，平均每天实际学习时间超过2小时。&lt;br /&gt;&lt;br /&gt;5、书籍是人类进步的阶梯，对软件开发人员尤其如此。书籍是学习知识的最有效途径，不要过多地指望在工作中能遇到“世外高人”，并不厌其烦地教你。对于花钱买书，我个人经验是：千万别买国内那帮人出的书！我买的那些家伙出的书，!00%全部后悔了，无一本例外。更气愤的是，这些书在二手市场的地摊上都很难卖掉。“拥有书籍并不表示拥有知识；拥有知识并不表示拥有技能；拥有技能并不表示拥有文化；拥有文化并不表示拥有智慧。”只有将书本变成的自己智慧，才算是真正拥有了它。 &lt;br /&gt;&lt;br /&gt;6、不要仅局限于对某项技术的表面使用上，哪怕你只是偶尔用一、二次。“对任何事物不究就里”是任何行业的工程师所不应该具备的素质。开发Windows应用程序，看看Windows程序的设计、加载、执行原理，分析一下PE文件格式，试试用SDK开发从头开发一个Windows应用程序；用VC＋＋、 Delphi、Java、.Net开发应用程序，花时间去研究一下MFC、VCL、J2EE、.Net它们框架设计或者源码；除了会用J2EE、 JBoss、Spring、Hibernate等等优秀的开源产品或者框架，抽空看看大师们是如何抽象、分析、设计和实现那些类似问题的通用解决方案的。试着这样做做，你以后的工作将会少遇到一些让你不明就里、一头雾水的问题，因为，很多东西你“知其然且知其所以然”！ &lt;br /&gt;&lt;br /&gt;7、在一种语言上编程，但别为其束缚了思想。“代码大全”中说：“深入一门语言编程，不要浮于表面”。深入一门语言开发还远远不足，任何编程语言的存在都有其自身的理由，所以也没有哪门语言是“包治百病”的“灵丹妙药”。编程语言对开发人员解决具体问题的思路和方式的影响与束缚的例子俯拾皆是。我的经验是：用面对对象工具开发某些关键模块时，为什么不可以借鉴C、C51、汇编的模块化封装方式？用传统的桌面开发工具(目前主要有VC++、Delphi)进行系统体统结构设计时，为什么不可以参考来自Java社区的IoC、AOP设计思想，甚至借鉴像Spring、Hibernate、JBoss等等优秀的开源框架？在进行类似于实时通信、数据采集等功能的设计、实现时，为什么不可以引用来自实时系统、嵌入式系统的优秀的体系框架与模式？为什么一切都必须以个人、团队在当然开发语言上的传统或者经验来解决问题？？？“他山之石、可以攻玉”。 &lt;br /&gt;&lt;br /&gt;8、养成总结与反思的习惯，并有意识地提炼日常工作成果，形成自己的个人源码库、解决某类问题的通用系统体系结构、甚至进化为框架。众所周知，对软件开发人员而言，有、无经验的一个显著区别是：无经验者完成任何任务时都从头开始，而有经验者往往通过重组自己的可复用模块、类库来解决问题（其实这个结论不应该被局限在软件开发领域、可以延伸到很多方面）。这并不是说，所有可复用的东西都必须自己实现，别人成熟的通过测试的成果也可以收集、整理、集成到自己的知识库中。但是，最好还是自己实现，这样没有知识产权、版权等问题，关键是自己实现后能真正掌握这个知识点，拥有这个技能。 &lt;br /&gt;&lt;br /&gt;9、理论与实践并重，内外双修。工程师的内涵是：以工程师的眼光观察、分析事物和世界。一个合格的软件工程师，是真正理解了软件产品的本质及软件产品研发的思想精髓的人（个人观点、欢迎探讨）。掌握软件开发语言、应用语言工具解决工作中的具体问题、完成目标任务是软件工程师的主要工作，但从软件工程师这个角度来看，这只是外在的东西，并非重要的、本质的工作。学习、掌握软件产品开发理论知识、软件开发方法论，并在实践中理解、应用软件产品的分析、设计、实现思想来解决具体的软件产品研发问题，才是真正的软件工程师的工作。站在成熟理论与可靠方法论的高度思考、分析、解决问题，并在具体实践中验证和修正这些思想与方式，最终形成自己的理论体系和实用方法论。 &lt;br /&gt;&lt;br /&gt;10、心态有多开放，视野就有多开阔。不要抱着自己的技术和成果，等到它们都已经过时变成垃圾了，才拿出来丢人现眼。请及时发布自己的研究成果：开发的产品、有创意的设计或代码，公布出来让大家交流或者使用，你的成果才有进化和升华的机会。想想自己2000年间开发的那些Windows系统工具，5、6年之后的今天，还是那个样子，今天流行的好多Windows系统工具都比自己的晚，但进化得很好，且有那么多用户在使用。并且，不要保守自己的技术和思想，尽可能地与人交流与分享，或者传授给开发团队的成员。“与人交换苹果之后，每个人还是只有一个苹果；但交换思想之后，每个人都拥有两种思想”，道理大家都懂，但有多少人真正能做到呢？ &lt;br /&gt;&lt;br /&gt;11、尽量参加开源项目的开发、或者与朋友共同研制一些自己的产品，千万不要因为没有钱赚而不做。网络早已不再只是“虚拟世界”，网上有很多的开源项目、合作开发项目、外包项目，这都是涉猎工作以外的知识的绝好机会，并且能够结识更广的人缘。不要因为工作是做ERP，就不去学习和了解嵌入式、实时、通信、网络等方面的技术，反过来也是一样。如果当他别人拿着合同找你合作，你却这也不会，那也不熟时，你将后悔莫及。&lt;br /&gt;&lt;br /&gt;12、书到用时方恨少，不要将自己的知识面仅仅局限于技术方面。诺贝尔经济学奖得主西蒙教授的研究结果表明： “对于一个有一定基础的人来说，他只要真正肯下功夫，在6个月内就可以掌握任何一门学问。”教育心理学界为感谢西蒙教授的研究成果，故命名为西蒙学习法。可见，掌握一门陌生的学问远远没有想想的那么高难、深奥。多方吸取、广泛涉猎。极力夯实自己的影响圈、尽量扩大自己的关注圈。财务、经济、税务、管理等等知识，有空花时间看看，韬光养晦、未雨绸缪。&lt;br /&gt;&lt;br /&gt;13、本文的总结与反思：不要去做技术上的高手，除非你的目标如此。虽然本文是关于提高软件开发知识的建议，做技术的高手是我一向都不赞同的。你可以提高自己的专业知识，但能胜任工作即止。提高软件知识和技术只是问题的表面，本质是要提高自己认识问题、分析问题、解决问题的思想高度。软件专业知识的很多方法和原理，可以很容易地延伸、应用到生活的其它方面。在能胜任工作的基础上，立即去涉猎其它领域的专业知识，丰富自己的知识体系、提高自己的综合素质，尤其是那些目标不在技术方面的朋友&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://sdt.sumida.com.cn:8080/cs/aggbug.aspx?PostID=11473" width="1" height="1"&gt;</content><author><name>wicky</name><uri>http://sdt.sumida.com.cn:8080/cs/members/wicky.aspx</uri></author><category term="Development" scheme="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/tags/Development/default.aspx" /></entry><entry><title>Nagios</title><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/12/17/nagios.aspx" /><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/12/17/nagios.aspx</id><published>2008-12-17T00:41:00Z</published><updated>2008-12-17T00:41:00Z</updated><content type="html">&lt;p&gt;&lt;a class="" href="http://www.nagios.org/" target="_blank"&gt;Nagios&lt;/a&gt; is the industry standard in enterprise-class monitoring for good reason. It allows you to gain insight into your network and fix problems before customers know they even exist. It&amp;#39;s stable, scalable, supported, and extensible. Most importantly, it works. &lt;br /&gt;&lt;br /&gt;What does Nagios provide?&lt;/p&gt;
&lt;p&gt;Comprehensive Network Monitoring&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Windows &lt;br /&gt;Linux/Unix &lt;br /&gt;Routers, Switches, Firewalls &lt;br /&gt;Printers &lt;br /&gt;Services &lt;br /&gt;Applications &lt;/p&gt;
&lt;p&gt;Immediate Awareness and Insight&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Receive immediate notifications of problems via email, pager and cellphone &lt;br /&gt;Multi-user notification escalation capabilities &lt;br /&gt;See detailed status information through the Nagios web interface &lt;/p&gt;
&lt;p&gt;Problem Remediation&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Acknowledge problems through the web interface &lt;br /&gt;Automatically restart failed applications, services and hosts with event handlers &lt;/p&gt;
&lt;p&gt;Proactive Planning&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Schedule downtime for anticipated host, service, and network upgrades &lt;br /&gt;Capacity planning capabilites through usage monitoring &lt;/p&gt;
&lt;p&gt;Reporting Options&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;SLA availability reports &lt;br /&gt;Alert and notification history reports &lt;br /&gt;Trending reports through integration with Cacti and RRD-based addons &lt;/p&gt;
&lt;p&gt;Multi-Tenant/Multi-User Capabilites &lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Multiple users can access the web interface &lt;br /&gt;Each user can have their own unique, restricted view &lt;/p&gt;
&lt;p&gt;Integration With Your Existing Applications &lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Trouble ticket systems &lt;br /&gt;Wikis &lt;/p&gt;
&lt;p&gt;Easily Extendable Architecture&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Over 200 community addons are available to enhance Nagios &lt;/p&gt;
&lt;p&gt;Stable, Reliable, and Respected Platform&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;10 years in development &lt;br /&gt;Scales to monitor 100,000+ nodes &lt;br /&gt;Failover protection capabilities &lt;br /&gt;Winner of multiple awards &lt;br /&gt;Constant media coverage &lt;/p&gt;
&lt;p&gt;Huge Community&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;250,000+ users worldwide &lt;br /&gt;Active mailing lists &lt;br /&gt;Extensive community website network &lt;/p&gt;
&lt;p&gt;Customizable Code &lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Open Source Software &lt;br /&gt;Full access to source code &lt;br /&gt;Released under the GPL license &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="http://netsecurity.51cto.com/art/200706/48728.htm" target="_blank"&gt;Nagios远程监控软件的安装与配置详解(1)&lt;/a&gt;&lt;br /&gt;&lt;a class="" href="http://netsecurity.51cto.com/art/200706/48728_1.htm" target="_blank"&gt;Nagios远程监控软件的安装与配置详解(2)&lt;/a&gt;&lt;br /&gt;&lt;a class="" href="http://netsecurity.51cto.com/art/200706/48728_2.htm" target="_blank"&gt;Nagios远程监控软件的安装与配置详解(3)&lt;/a&gt;&lt;/p&gt;&lt;img src="http://sdt.sumida.com.cn:8080/cs/aggbug.aspx?PostID=11372" width="1" height="1"&gt;</content><author><name>wicky</name><uri>http://sdt.sumida.com.cn:8080/cs/members/wicky.aspx</uri></author><category term="Unix/Linux" scheme="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/tags/Unix_2F00_Linux/default.aspx" /><category term="Windows" scheme="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/tags/Windows/default.aspx" /></entry><entry><title>Oxite </title><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/12/10/oxite.aspx" /><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/12/10/oxite.aspx</id><published>2008-12-10T13:26:00Z</published><updated>2008-12-10T13:26:00Z</updated><content type="html">&lt;h2&gt;What is this? &lt;/h2&gt;
&lt;p&gt;This is a simple blog engine written using ASP.NET MVC, and is designed with two main goals:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;To provide a sample of &amp;#39;core blog functionality&amp;#39; in a reusable fashion. Blogs are simple and well understood by many developers, but the set of basic functions that a blog needs to implement (trackbacks, rss, comments, etc.) are fairly complex. Hopefully this code helps. 
&lt;li&gt;To provide a real-world sample written using ASP.NET MVC. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;We aren&amp;#39;t a sample-building team (more on what we are in a bit). We couldn&amp;#39;t sit down and build this code base just to give out to folks, so this code is also the foundation of a real project of ours, &lt;a class="externalLink" href="http://visitmix.com/"&gt;MIX Online&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. We also created this project to be the base of our own personal blogs as well so you&amp;#39;ll probably see our blogs on the &lt;a href="http://www.codeplex.com/oxite/Wiki/View.aspx?title=oxitesites&amp;amp;referringTitle=Home"&gt;&lt;font color="#3e62a6"&gt;list of sites running Oxite&lt;/font&gt;&lt;/a&gt; soon.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt;Getting Started With Oxite &lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/oxite/Wiki/View.aspx?title=gettingstarted&amp;amp;referringTitle=Home"&gt;&lt;font color="#3e62a6"&gt;Getting Started with Oxite&lt;/font&gt;&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.codeplex.com/oxite/Wiki/View.aspx?title=FAQ&amp;amp;referringTitle=Home"&gt;&lt;font color="#3e62a6"&gt;Frequently Asked Questions&lt;/font&gt;&lt;/a&gt; 
&lt;li&gt;&lt;a class="externalLink" href="http://visitmix.com/lab/oxite"&gt;Oxite on VisitMix.com&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.codeplex.com/oxite/Wiki/View.aspx?title=oxitesites&amp;amp;referringTitle=Home"&gt;&lt;font color="#3e62a6"&gt;List of sites running Oxite&lt;/font&gt;&lt;/a&gt; 
&lt;li&gt;&lt;a class="externalLink" href="http://asp.net/mvc"&gt;ASP.NET MVC&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;About us &lt;/h2&gt;
&lt;p&gt;Oxite is a project built by the team behind &lt;a class="externalLink" href="http://channel9.msdn.com/"&gt;Channel 9&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; (and &lt;a class="externalLink" href="http://channel8.msdn.com/"&gt;Channel 8&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a class="externalLink" href="http://on10.net/"&gt;Channel 10&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a class="externalLink" href="http://edge.technet.com/"&gt;TechNet Edge&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a class="externalLink" href="http://visitmix.com/"&gt;Mix Online&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;):&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Erik Porter, 
&lt;li&gt;Nathan Heskew, 
&lt;li&gt;Mike Sampson and 
&lt;li&gt;Duncan Mackenzie &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;You can find out more about our team and our projects in &lt;a class="externalLink" href="http://channel9.msdn.com/tags/evnet/"&gt;our various posts and videos on Channel 9&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://sdt.sumida.com.cn:8080/cs/aggbug.aspx?PostID=11298" width="1" height="1"&gt;</content><author><name>wicky</name><uri>http://sdt.sumida.com.cn:8080/cs/members/wicky.aspx</uri></author><category term="ASP.Net" scheme="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/tags/ASP.Net/default.aspx" /></entry><entry><title>DataTable.Compute Method</title><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/11/27/datatable-compute-method.aspx" /><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/11/27/datatable-compute-method.aspx</id><published>2008-11-27T14:23:00Z</published><updated>2008-11-27T14:23:00Z</updated><content type="html">&lt;p&gt;你试过循环datatable计算某一列的合计值么，有没试过这种方法：&lt;/p&gt;
&lt;p&gt;&lt;span class="keyword"&gt;&lt;table border="0" cellpadding="0" cellspacing="0" style="background-color: #f2f2f2; border: solid 1px #e5e5e5; width: 100%;"&gt;
    &lt;tr style="vertical-align: top; line-height: normal;"&gt;
        &lt;td style="width: 40px; text-align: right;"&gt;
            &lt;pre style="font-family: courier new; font-size: 11px; color: gray; margin: 0px; padding: 2px; border-right: solid 1px #e7e7e7;"&gt;1
2
3
4
5
6
7
8
9
10
11
&lt;/pre&gt;&lt;/td&gt;
        &lt;td&gt;
            &lt;pre style="overflow: scroll; margin:0px; padding: 2px; padding-left: 8px;"&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&amp;lt;/span&amp;gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; ComputeBySalesSalesID(DataSet dataSet)
{
    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Presumes a DataTable named "Orders" that has a column named "Total."&lt;/span&gt;
    DataTable table;
    table &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; dataSet.Tables[&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Orders"&lt;/span&gt;];


    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Declare an object variable.&lt;/span&gt;
    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;object&lt;/span&gt; sumObject;
    sumObject &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; table.Compute(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Sum(Total)"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"EmpID = 5"&lt;/span&gt;);
}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;查找一下帮助，你会有更多发现！&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://sdt.sumida.com.cn:8080/cs/aggbug.aspx?PostID=11152" width="1" height="1"&gt;</content><author><name>wicky</name><uri>http://sdt.sumida.com.cn:8080/cs/members/wicky.aspx</uri></author><category term="ADO.Net" scheme="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/tags/ADO.Net/default.aspx" /></entry><entry><title>New ASP.NET Charting Control: &lt;asp:chart runat="server"/&gt; </title><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/11/25/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx" /><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/11/25/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx</id><published>2008-11-25T13:34:00Z</published><updated>2008-11-25T13:34:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Microsoft recently released a cool new ASP.NET server control - &amp;lt;asp:chart /&amp;gt; - that can be used for free with ASP.NET 3.5 to enable rich browser-based charting scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c&amp;amp;DisplayLang=en" target="_blank"&gt;Download the free Microsoft Chart Controls&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1D69CE13-E1E5-4315-825C-F14D33A303E9&amp;amp;displaylang=en" target="_blank"&gt;Download the VS 2008 Tool Support for the Chart Controls&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/mschart/Release/ProjectReleases.aspx?ReleaseId=1591" target="_blank"&gt;Download the Microsoft Chart Controls Samples&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=EE8F6F35-B087-4324-9DBA-6DD5E844FD9F&amp;amp;displaylang=en" target="_blank"&gt;Download the Microsoft Chart Controls Documentation&lt;/a&gt; 
&lt;li&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/MSWinWebChart/threads/" target="_blank"&gt;Visit the Microsoft Chart Control Forum&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;微软出品的免费asp.net图形控件，看样子还挺强大。&lt;br /&gt;又打击一片控件商。干脆全部收购得了。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://sdt.sumida.com.cn:8080/cs/aggbug.aspx?PostID=11105" width="1" height="1"&gt;</content><author><name>wicky</name><uri>http://sdt.sumida.com.cn:8080/cs/members/wicky.aspx</uri></author><category term="ASP.Net" scheme="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/tags/ASP.Net/default.aspx" /></entry><entry><title>Visual Studio 2010 and .NET Framework 4.0 Training Kit</title><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/11/22/visual-studio-2010-and-net-framework-4-0-training-kit.aspx" /><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/11/22/visual-studio-2010-and-net-framework-4-0-training-kit.aspx</id><published>2008-11-22T13:39:00Z</published><updated>2008-11-22T13:39:00Z</updated><content type="html">&lt;p&gt;Visual Studio 2010和.NET Framework 4.0培训包包含了介绍，动手实战教程和例子，包括以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C# 4.0 
&lt;li&gt;Visual Basic 10 
&lt;li&gt;F# 
&lt;li&gt;Parallel Computing Platform 
&lt;li&gt;WCF 
&lt;li&gt;WF 
&lt;li&gt;WPF 
&lt;li&gt;ASP.NET AJAX 4.0 
&lt;li&gt;ASP.NET MVC 
&lt;li&gt;Dynamic Data &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;通过这些内容可以帮助您了解如何使用Visual Studio 2010和.NET Framework 4.0。&lt;/p&gt;
&lt;p&gt;Visual Studio 2010 and .NET Framework 4.0 Training Kit下载地址&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=752cb725-969b-4732-a383-ed5740f02e93&amp;amp;DisplayLang=en" target="_blank"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=752cb725-969b-4732-a383-ed5740f02e93&amp;amp;DisplayLang=en&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Visual Studio 2010 and .NET Framework 4.0 CTP下载地址&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=922b4655-93d0-4476-bda4-94cf5f8d4814&amp;amp;DisplayLang=en" target="_blank"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=922b4655-93d0-4476-bda4-94cf5f8d4814&amp;amp;DisplayLang=en&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Visual Studio 2010 and .NET Framework 4.0 概览&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/vs2008/products/cc948977.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/vs2008/products/cc948977.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://sdt.sumida.com.cn:8080/cs/aggbug.aspx?PostID=11087" width="1" height="1"&gt;</content><author><name>wicky</name><uri>http://sdt.sumida.com.cn:8080/cs/members/wicky.aspx</uri></author><category term="Dot.Net Resources" scheme="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/tags/Dot.Net+Resources/default.aspx" /></entry><entry><title>分享开心准则</title><link rel="alternate" type="text/html" href="http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/11/18/11038.aspx" /><id>http://sdt.sumida.com.cn:8080/cs/blogs/wicky/archive/2008/11/18/11038.aspx</id><published>2008-11-18T11:15:00Z</published><updated>2008-11-18T11:15:00Z</updated><content type="html">&lt;p&gt;一、&lt;font color="#ff0000"&gt;墨菲定律&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; １９４９年，一位名叫墨菲的空军上尉工程师，认为他的某位同事是个倒霉蛋，不经意间开了句玩笑：“如果一件事情有可能被弄糟，让他去做就一定会弄糟。”&lt;br /&gt;这句话迅速流传，并扩散到世界各地。在流传扩散的过程中，这句笑话逐渐失去它原有的局限性，演变成各种各样的形式，其中一个最通行的形式是：“如果坏事情有可能发生，不管这种可能性多么小，它总会发生，并引起最大可能的损失。”&lt;br /&gt;这就是著名的“墨菲定律”。下面是墨菲定律的一些变种或推论。&lt;br /&gt;人生哲学&lt;br /&gt;１．别试图教猫唱歌，这样不但不会有结果，还会惹猫不高兴?&lt;br /&gt;２．别跟傻瓜吵架，不然旁人会搞不清楚，到底谁是傻瓜?&lt;br /&gt;３．不要以为自己很重要，因为没有你，太阳明天还是一样从东方升上来?&lt;br /&gt;４．笑一笑，明天未必比今天好。&lt;br /&gt;５．好的开始，未必就有好结果；坏的开始，结果往往会更糟。&lt;br /&gt;处世原理&lt;br /&gt;６．你若帮助了一个急需用钱的朋友，他一定会记得你——在他下次急需用钱的时候。&lt;br /&gt;７．有能力的——让他做；没能力的──教他做；做不来的──管理他。&lt;br /&gt;８．你早到了，会议却取消；你准时到，却还要等；迟到，就是迟了。&lt;br /&gt;９．你携伴出游，越不想让人看见，越会遇见熟人。&lt;br /&gt;爱情意义&lt;br /&gt;１０．你爱上的人，总以为你爱上他是因为：他使你想起你的老情人。&lt;br /&gt;１１．你最后硬着头皮寄出的情书；寄达对方的时间有多长，你反悔的时间就有多长。&lt;br /&gt;生活常识&lt;br /&gt;１２．东西越好，越不中用。&lt;br /&gt;１３．一种产品保证６０天不会出故障，等于保证第６１天一定就会坏掉。&lt;br /&gt;１４．东西久久都派不上用场，就可以丢掉；东西一丢掉，往往就必须要用它。&lt;br /&gt;１５．你丢掉了东西时，最先去找的地方，往往也是可能找到的最后一个地方。&lt;br /&gt;１６．你往往会找到不是你正想找的东西。&lt;br /&gt;１７．你出去买爆米花的时候，银幕上偏偏就出现了精彩镜头。&lt;br /&gt;１８．另一排总是动的比较快；你换到另一排，你原来站的那一排，就开始动的比较快了；你站的越久，越有可能是站错了排。&lt;br /&gt;１９．一分钟有多长？ 这要看你是蹲在厕所里面，还是等在厕所外面。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 二、&lt;font color="#ff0000"&gt;二八法则&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1897年，意大利经济学家帕列托在对19世纪英国社会各阶层的财富和收益统计分析时发现：80%的社会财富集中在20%的人手里，而80%的人只拥有社 会财富的20%，这就是“二八法则”。“二八法则”反应了一种不平衡性，但它却在社会、经济及生活中无处不在。&amp;nbsp;&amp;nbsp;&amp;nbsp; 附：破窗理论等&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在商品营销中，商家往往会认为所有顾客一样重要；所有生意、每一种产品都必须付出相同的努力，所有机会都必须抓住。而“二八法则”恰恰指出了在原因和结 果、投入和产出、努力和报酬之间存在这样一种典型的不平衡现象：80%的成绩，归功于20%的努力；市场上80%的产品可能是20%的企业生产的；20% 的顾客可能给商家带来80%的利润。遵循“二八法则”的企业在经营和管理中往往能抓住关键的少数顾客，精确定位，加强服务，达到事半功倍的效果。美国的普 尔斯马特会员店始终坚持会员制，就是基于这一经营理念。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; “二八法则”同样适用于我们的生活，如一个人应该选择在几件事上追求卓越，而不必强求在每件事上都有好的表现；锁定少数能完成的人生目标，而不必追求所有的机会。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 三、&lt;font color="#ff0000"&gt;马太效应&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 《新约·马太福音》中有这样一个故事，一个国王远行前，交给三个仆人每人一锭银子，吩咐他们：“你们去做生意，等我回来时，再来见我。”国王回来时，第一 个仆人说：“主人，你交给我的一锭银子，我已赚了10锭。”于是国王奖励了他10座城邑。第二个仆人报告说：“主人，你给我的一锭银子，我已赚了5锭。” 于是国王便奖励了他5座城邑。第三个仆人报告说：“主人，你给我的一锭银子，我一直包在手巾里存着，我怕丢失，一直没有拿出来。”于是国王命令将第三个仆 人的那锭银子赏给第一个仆人，并且说：“凡是少的，就连他所有的，也要夺过来。凡是多的，还要给他，叫他多多益善。”这就是马太效应，它反映了当今社会中 存在的一个普遍现象，即赢家通吃。&lt;br /&gt;对企业经营发展而言，马太效应告诉我们，要想在某个领域保持优势，就必须在此领域迅速做大。当你成为某个领域的领头羊的时候，即便投资回报率相同，你也能 更轻易地获得比弱小的同行更大的收益。而若没有实力迅速在某个领域做大，就要不停地寻找新的发展领域，才能保证获得较好的回报。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 四、&lt;font color="#ff0000"&gt;手表定理&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 手表定理是指一个人有一只表时，可以知道现在是几点钟，而当他同时拥有两只表时却无法确定。两只表并不能告诉一个人更准确的时间，反而会让看表的人失去对 准确时间的信心。你要做的就是选择其中较信赖的一只，尽力校准它，并以此作为你的标准，听从它的指引行事。记住尼采的话：“兄弟，如果你是幸运的，你只需 有一种道德而不要贪多，这样，你过桥更容易些。”&lt;br /&gt;如果每个人都“选择你所爱，爱你所选择”，无论成败都可以心安理得。然而，困扰很多人的是：他们被“两只表”弄得无所，心身交瘁，不知自己该信仰哪一 个，还有人在环境、他人的压力下，违心选择了自己并不喜欢的道路，为此而郁郁终生，即使取得了受人瞩目的成就，也体会不到成功的快乐。&lt;br /&gt;手表定理在企业经营管理方面给我们一种非常直观的启发，就是对同一个人或同一个组织的管理不能同时采用两种不同的方法，不能同时设置两个不同的目标。 甚至每一个人不能由两个人来同时指挥，否则将使这个企业或这个人无所适从。手表定理所指的另一层含义在于每个人都不能同时挑选两种不同的价值观，否则，你 的行为将陷于混乱。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 五、“&lt;font color="#ff0000"&gt;不值得”定律&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 不值得定律最直观的表述是：不值得做的事情，就不值得做好，这个定律似乎再简单不过了，但它的重要性却时时被人们疏忘。不值得定律反映出人们的一种心理， 一个人如果从事的是一份自认为不值得做的事情，往往会保持冷嘲热讽，敷衍了事的态度。不仅成功率小，而且即使成功，也不会觉得有多大的成就感。&lt;br /&gt;哪些事值得做呢？一般而言，这取决于三个因素。&lt;br /&gt;1、价值观。关于价值观我们已经谈了很多，只有符合我们价值观的事，我们才会满怀热情去做。&lt;br /&gt;2、个性和气质。一个人如果做一份与他的个性气质完全背离的工作，他是很难做好的，如一个好交往的人成了档案员，或一个害羞者不得不每天和不同的人打交道。&lt;br /&gt;3、现实的处境。同样一份工作，在不同的处境下去做，给我们的感受也是不同的。例如，在一家大公司，如果你最初做的是打杂跑腿的工作，你很可能认为是不值得的，可是，一旦你被提升为领班或部门经理，你就不会这样认为了。&lt;br /&gt;总结一下，值得做的工作是：符合我们的价值观，适合我们的个性与气质，并能让我们看到期望。如果你的工作不具备这三个因素，你就要考虑换一个更合适的工作，并努力做好它。&lt;br /&gt;因此，对个人来说，应在多种可供选择的奋斗目标及价值观中挑选一种，然后为之而奋斗。“选择你所爱的，爱你所选择的”，才可能激发我们的奋斗毅力，也 才可以心安理得。而对一个企业或组织来说，则要很好地分析员工的性格特性，合理分配工作，如让成就欲较强的职工单独或牵头来完成具有一定风险和难度的工 作，并在其完成时给予定时的肯定和赞扬；让依附欲较强的职工更多地参加到某个团体中共同工作；让权力欲较强的职工担任一个与之能力相适应的主管。同时要加 强员工对企业目标的认同感，让员工感觉到自己所做的工作是值得的，这样才能激发职工的热情。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 六、&lt;font color="#ff0000"&gt;彼得原理&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;管理学家劳伦斯·丁·彼得（Laurence．J．Peter），1917年牛于加拿大的范库弗，1957年获美国华盛顿州立大学学士学位，6年后 又获得该校教育哲学博士学位，他阅历丰富，博学多才，著述颇丰，他的名字还被收人了《美国名人榜》、《美国科学界名人录》和《国际名人传记辞典》等辞书 中。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 彼得原理（The PeterPrinciPle）正是彼得根据千百个有关组织中不能胜任的失败实例的分析而归纳出来的。其具体内容是：“在一个等级制度中，每个职工趋向于 上升到他所不能胜任的地位”。彼得指出，每一个职工由于在原有职位上工作成绩表现好（胜任），就将被提升到更高一级职位；其后，如果继续胜任则将进一步被 提升，直至到达他所不能胜任的职位。由此导出的彼得推论是，“每一个职位最终都将被一个不能胜任其工作的职工所占据。层级组织的工作任务多半是由尚未达到 不胜任阶层的员工完成的。”每一个职工最终都将达到彼得高地，在该处他的提升商数（PQ）为零。至于如何加速提升到这个高地，有两种方法。其一。是上面的 “拉动”，即依靠裙带关系和熟人等从上面拉；其二是自我的“推动”，即自我训练和进步等，而前者是被普遍采用的。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 彼得认为，由于彼得原理的推出，使他“无意间”创设了一门新的科学——层级组织学（hierarchiolgy）。该科学是解开所有阶层制度之谜的钥匙， 因此也是了解整个文明结构的关键所在。凡是置身于商业、工业、政治、行政、军亨、宗教、教育各界的每个人都和层级组织息息相关，亦都受彼得原理的控制。当 然，原理的假设条件是：时间足够长，五层级组织里有足够的阶层。彼得原理被认为是同帕金森定律有联系的。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 帕金森（C．N．Parkinson）是著名的社会理论家，他曾仔细观察并有趣地描述层级组织中冗员累积的现象。他假设，组织中的高级主管采用分化和征服 的策略，故意使组织效率降低，借以提升自己的权势，这种现象即帕金森所说的“爬升金字塔”。彼得认为这种理论设计是有缺陷的，他给出的解释员工累增现象的 原因是层级组织的高级主管真诚追求效率（虽然徒劳无功）。正如彼得原理显示的，许多或大多数主管必已到达他们的不胜任阶层。这些人无法改进现有的状况，因 为所有的员工已经竭尽全力了，于是为了再增进效率，他们只好雇用更多的员工。员工的增加或许可以使效率暂时提升，但是这些新进的人员最后将因晋升过程而到 达不胜任阶层，于是唯一改善的方法就是再次增雇员工，再次获得暂时的高效率，然后是另一。次逐渐归于无效率。这样就使组织中的人数超过了工作的实际需要。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 彼得原理首次公开发表于1960年9月美国联邦出资的一次研习会上，听众是一群负责教育研究计划、并刚获晋升的项目主管，彼得认为他们多数人“只是拼命地 想复制一些老掉牙了的统计习题”，于是引介彼得原理说明他们的困境。演说召来了敌意与嘲笑，但是彼得仍然决定以独特的讽刺手法呈现彼得原理，尽管所有案例 研究都经过精确编纂，且引用的资料也都符合事实，最后定稿于1965年春完成，然后总计有16家之多的出版社无情地拒绝了该书的手稿。1966年，作者零 星地在报纸上发表了几篇述论同一主题的文章，读者的反应异常热烈，引得各个出版社趋之若婺鸳。正如彼得在自传中提到的，人偶尔会在镜中瞥见自己的身影而不 能立即自我辩认，于是在不自知前就加以嘲笑一番，这样的片刻里正好可以使人进一步认识自己，“彼得原理”扮演的正是那样一面镜子。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 七、&lt;font color="#ff0000"&gt;零和游戏&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;一个游戏无论几个人来玩，总有输家和赢家，赢家所赢的都是输家所翰的，所以无论输赢多少，正负相抵，最后游戏的总和都为零，这就是零和游戏。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 零和游戏之所以受人关注，是因为人们在社会生活中处处都能找到与零和游戏雷同或类似的现象。我们大肆开发利用煤炭石油资源，留给后人的便越来越少；我们研 究生产了大量的转基因产品，一些新的病毒也跟着冒了出来；我们修筑了葛洲坝水利工程，白鳍豚就再也不能洄游到金沙江产卵了……&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 发展是硬道理。人类在经历了经济高速增长、科技迅猛发展、全球经济一体化及曰益严重的生态破坏、环境污染之后，可持续发展理论才逐渐浮出水面。零和游戏原 理正在逐渐为“双赢”观念所取代，人们逐渐认识到“利己”而不“损人”才是最美好的结局。实践证明，通过有效合作，实现皆大欢喜的结局是可能的。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 领导者要善于跳出“零和”的圈子，寻找能够实现“双赢”的机遇和突破口，防止负面影响抵消正面成绩。批评下属如何才能做到使其接受而不抵触，发展经济如何才能做到不损害环境，开展竞争如何使自己胜出而不让对方受到伤害，这些都是每一个为官者应该仔细思考的问题。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 还是那句话，世上没有现成的标准答案。这些企业经营管理定律只能供我们参考和借鉴，至于什么条件下适合借鉴哪一种，回到手表定理上去，你需要自己选择一块戴着舒适而又走时准确的手表。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 八、&lt;font color="#ff0000"&gt;华盛顿合作规律&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 华盛顿合作规律说的是：一个人敷衍了事，两个人互相推诿，三个人则永无成事之日。多少有点类似于“三个和尚”的故事。&lt;/p&gt;
&lt;p&gt;　　人与人的合作不是人力的简单相加，而是复杂和微妙得多。在人与人的合作中，假定每一个人的能力都为1,那么10个人的合作结果有时比10大得多，有时甚至比1还要小。因为人不是静止的物，而更像方向不同的能量，相互推动时自然事半功倍，相互抵触时则一事无成。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 九、&lt;font color="#ff0000"&gt;酒与污水定律&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 酒与污水定律是指，如果把一匙酒倒进一桶污水中，你得到的是一桶污水；如果把一匙污水倒进一桶酒中，你得到的还是一桶污水。几乎在任何组织里，都存在几个 难弄的人物，他们存在的目的似乎就是为了把事情搞糟。他们到处搬弄是非，传播流言、破坏组织内部的和谐。最糟糕的是，他们像果箱里的烂苹果，如果你不及时 处理，它会迅速传染，把果箱里其它苹果也弄烂，“烂苹果”的可怕之处在于它那惊人的破坏力。一个正直能干的人进入一个混乱的部门可能会被吞没，而一个人无 德无才者能很快将一个高效的部门变成一盘散沙。组织系统往往是脆弱的，是建立在相互理解、妥协和容忍的基础上的，它很容易被侵害、被毒化。破坏者能力非凡 的另一个重要原因在于，破坏总比建设容易。一个能工巧匠花费时日精心制作的陶瓷器，一头驴子一秒钟就能毁坏掉。如果拥有再多的能工巧匠，也不会有多少像样 的工作成果。如果你的组织里有这样的一头驴子，你应该马上把它清除掉；如果你无力这样做，你就应该把它拴起来。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 十、&lt;font color="#ff0000"&gt;水桶定律&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一只水桶能装多少水取决于水桶中最短的一块木板而不是最长的那块木板。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 任何组织几乎都有一个共同的特点，即构成组织的各个部分往往是优劣不齐的，但劣势部分却往往决定着整个组织的水平。问题是劣势部分是组织中一个有用的部分，你不能把它当成烂苹果扔掉，否则，你会一点水也装不了，可它却让你那些长的东西白长了!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 劣势决定优势，劣势决定生死，这是市场竞争的残酷法则。水桶定律告诉我们，领导者要有忧患意识，如果你个人身上某个方面是“最短的一块”，你应该考虑尽快 把它补起来；如果你所领导的集体中存在着“一块最短的木板”，你一定要迅速将它做长补齐，否则，它带给你的损失可能是毁灭性的—叫艮多时候，往往就是因为 一件事没做好而毁了所有的努力。有