﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-邀月工作室</title><link>http://www.cnblogs.com/downmoon/</link><description>年轻的时候，多走走，走不动的时候，静下来写回忆录。3w@live.cn</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 06:13:51 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 06:13:51 GMT</pubDate><ttl>60</ttl><item><title>《Microsoft Sql server 2008 Internal》读书笔记--第六章Indexes:Internals and Management(3)</title><link>http://www.cnblogs.com/downmoon/archive/2010/02/08/1665639.html</link><dc:creator>邀月</dc:creator><author>邀月</author><pubDate>Sun, 07 Feb 2010 17:43:00 GMT</pubDate><guid>http://www.cnblogs.com/downmoon/archive/2010/02/08/1665639.html</guid><description><![CDATA[<p>阅读: 663 评论: 4 作者: <a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a> 发表于 2010-02-08 01:43 <a href="http://www.cnblogs.com/downmoon/archive/2010/02/08/1665639.html" target="_blank">原文链接</a></p><p><a target="_blank" id="homepage1_HomePageDays_ctl04_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/downmoon/archive/2010/02/archive/2010/01/26/1656411.html">《Microsoft  Sql server 2008 Internal》读书笔记--目录索引</a></p> <p>上节主要学习了聚集健的依赖（The Dependancy on the Clustering  key）和建立非聚集索引的聚集键的三个基本要点：<strong style="font-size: 10pt;">聚集键应该是惟一的、窄的、静态的</strong>。 本节我们继续深入学习物理的索引结构(physical&nbsp; Index Structures),这一部分分为两类：一、聚集索引的物理结构。二、  非聚集索引的物理结构。<br /> </p> <p>今天我们先来看第一部分： <strong>聚集索引的物理结构</strong><br /> </p> <p>索引页(index pages)的结构和前面学过的数据页(data pages)  非常类似。惟一区别是前者存的是索引记录，而后者存的是数据记录。像SQL  Server中大多数其它类型的页一样，索引页也是固定的8K大小或8192字节。索引页也有一个96字节的Header,在每个页的末端都有一个两字节 的偏移数组，用以指示每行在页中的偏移量。一个非聚集的索引拥有全部三类分配单元，分别是IN_ROW_DATA，ROW_OCERFLOW_DATA和 LOB_DATA。每一个索引在目录视图sys.indexes中对应一行。index_id是1(聚集索引）或2-250,256-1005（非聚集索 引)。正如data pages一样，251-255是系统保留值。<br /> </p> <p><strong>索引行格式</strong> （Index Row Format）<br /> </p> <p>索引行(Index rows)和数据行(Data rows)的结构非常类似。但有两个主要的区别：一、一个索引行不能有稀疏列(Sparse  columns)。一个稀疏列可以用于索引，但不能作为主键，<strong>并且在创建索引时不能定义为稀疏列</strong>。二、如果一个聚集索引被创建时未定义成惟 一(unique),那么重复键值包含一个<span id="result_box"><span style="background-color: #ffffff;" title="uniquifier">唯一标志</span></span>(uniquifier)。<br /> </p> <p>另外两个区别是：一个索引行没有使用<em>TagB</em>或<em>FSize</em>行头部值(row header value) ,作为<em>FSize</em>字 段（本来是行末尾的固定长度部分）的替代，页头部(page header<em>)Pminlen</em>的值被用于解码一个索引行。<em>Pminlen</em>   Value表明行末尾的固定长度部分的偏移量。如果索引行没有可变长度列或可空列，那就是行的末尾。仅当索引行在字段Ncol有可空列，同时空位图 (null bitmap)也被设置（这句翻译不好，原文是Only if thd index row has nulable columns  are the field called Ncol and the null bitmap both  present)。Ncol字段包括一个表明索引行有多少列的值，这个值被用于决定在null  bitmap中有多少bits。数据行有一个Ncol字段和空位图（决定是否任何列允许为空），而索引行只有一个空位图和一个Ncol字段（决定索引的任 何列是否允许Nulls,如下表：<br /> </p> <table border="2" width="80%">      <tbody>          <tr>              <th>              <p> Information</p>              </th> <th>              <p> Mnemonic</p>              </th> <th>              <p> Size</p>              </th>          </tr>          <tr>              <td>              <p><strong> Status Bits A</strong></p>              </td>              <td>              <p> TagA<br />              Bits1 through3 <br />              </p>              </td>              <td>              <p> 1 byte</p>              </td>          </tr>          <tr>              <td>              <p><strong> Fixed-length data</strong></p>              </td>              <td>              <p> Fdata</p>              </td>              <td>              <p>pminlen-1</p>              </td>          </tr>          <tr>              <td>              <p> <strong>Number of columns</strong></p>              </td>              <td>              <p> Ncol</p>              </td>              <td>              <p> 2 bytes</p>              </td>          </tr>          <tr>              <td>              <p> <strong>NULL bitmap(1 byte for each column in table; </strong></p>              <p><strong>1 indicates that the corresponding column is NULL)</strong></p>              </td>              <td>              <p> Nullbits</p>              </td>              <td>              <p> Ceiling (Ncol / 8)</p>              </td>          </tr>          <tr>              <td>              <p> <strong>Number of variable-length columns<br />              only Present if &gt;0<br />              </strong></p>              </td>              <td>              <p> VarCount</p>              </td>              <td>              <p> 2 bytes</p>              </td>          </tr>          <tr>              <td>              <p> <strong>Variable column offset array;Only present if  VarCount&gt;0<br />              </strong></p>              </td>              <td>              <p> VarOffset</p>              </td>              <td>              <p> 2 * VarCount</p>              </td>          </tr>          <tr>              <td>              <p><strong> Variable-length data;if any<br />              </strong></p>              </td>              <td>              <p> VarData</p>              </td>              <td>              <p><br />              </p>              </td>          </tr>      </tbody> </table> <p>&nbsp;<strong>聚集索引结构(Clustered Index Structures)</strong><br /></p><p>聚集索引的叶级是数据本身。当一个 聚集索引被创建时，这些数据被物理复制并基于聚集健排序。聚集索引的行结构和Heap的行结构完全相同，除了以下一种情况：</p><p>当一个聚集健没 有被用"UNIQUE" 定义时。在这种情况下，SQL　Server必须确保内部惟一性。为此，每个重复行需要一个附加的惟一值。<br /></p><p><strong>带 Uniquifier限定符聚集索引行</strong>(Clustered Index Rows with&nbsp; uniquifier)<br /></p><p>正 如前面所了解的，当没有使用UNIQUE属性时，SQL  Server会增加一个4字节的惟一标志符以确保每一个nonunique健值的惟一。因为聚集键被用于识别非聚集索引(书签查询)所引用的基本行，这就 需要一个惟一的方式去指向聚集索引的每一行。<br /></p><p>SQL Server仅仅在必须的时候增加<span id="result_box"><span style="background-color: #ffffff;" title="uniquifier">唯一标志</span></span>（uniquifier),也就是说，当重复键被加到表里的时候。我们看一 个例子：<br /></p><div class="cnblogs_code" onclick="cnblogs_code_show('83e83686-7c49-4ff9-b981-c04e57e91c57')"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_83e83686-7c49-4ff9-b981-c04e57e91c57" alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_83e83686-7c49-4ff9-b981-c04e57e91c57" onclick="cnblogs_code_hide('83e83686-7c49-4ff9-b981-c04e57e91c57',event)" style="display: none;"><span class="cnblogs_code_collapse">代码</span><div id="cnblogs_code_open_83e83686-7c49-4ff9-b981-c04e57e91c57" class="cnblogs_code_hide"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff;">Use</span><span style="color: #000000;">&nbsp;TestDb<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">IF</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff00ff;">OBJECTPROPERTY</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">Clustered_Dupes</span><span style="color: #ff0000;">'</span><span style="color: #000000;">),&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">IsUserTable</span><span style="color: #ff0000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">IS</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">DROP</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;Clustered_Dupes;<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">CREATE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;Clustered_Dupes<br />(<br />&nbsp;&nbsp;&nbsp;&nbsp;Col1&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">CHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;Col2&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">INT</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;Col3&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">CHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;Col4&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">CHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />);<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">CREATE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">CLUSTERED</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">INDEX</span><span style="color: #000000;">&nbsp;Cl_dupes_col1<br /></span><span style="color: #0000ff;">ON</span><span style="color: #000000;">&nbsp;Clustered_Dupes(col1);<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;indid,&nbsp;keycnt,&nbsp;name<br /></span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;sysindexes<br /></span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff00ff;">OBJECT_ID</span><span style="color: #000000;">&nbsp;(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">Clustered_Dupes</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /></span></div></div></div><p>第二列KeyCnt，显示了一个索引的键值数量。这个结果是;<br /></p><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000;">indid&nbsp;&nbsp;&nbsp;&nbsp;keycnt&nbsp;&nbsp;&nbsp;&nbsp;name<br /></span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;C1_depes_Col1</span></div></div><p>这个值是2（需要注意<strong>这是在兼容性视图 sysindexes,而不是在目录视图sys.Indexes中</strong>）。如果使用"UNIQUE"属性，这个值应该是1。因为在一个非惟一的健上创 建一个聚集索引是不被推荐的，原因是这样SQL Server为保证行惟一将不得不浪费时间和空间。这个已经在前面讨论过了。</p><p><strong>聚集索 引的非叶级(The Non-Leaf Level(s)of a Clustered Index)</strong></p><p>&nbsp;当一个B-Tree被创建 时，为了导航到索引的叶级，它包含了叶级的数据行。非叶级的每一个行(针对叶级的每一个页(Page))有一个项(entry)，这个项包含了一个索引键 值和一个6字节的指针，指向这个页。在本例中，页指针由一个2字节的FileID和一个4字节的PageNumberlnTheFile组成。SQL  Server并不需要一个8字节的RID，因为slot  Number不需要被存储。这个项(entry)的索引键部分总是显示能被用于指针页的最小值(mininum  value)。注意，这并不是实际的最低值(Lowest  value)。仅仅是页最低的可能值。（当一个页上的具有最低值的行被删除时，这个级上方的索引行并没有被更新）<br /></p><p><strong>分析一个聚 集索引的结构</strong>(Analyzing a Clustered Index Structure)<br /></p><p>我们先看一个例子：</p><div class="cnblogs_code" onclick="cnblogs_code_show('6b671133-f0ff-457e-b09d-d9d711a7fd90')"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_6b671133-f0ff-457e-b09d-d9d711a7fd90" alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_6b671133-f0ff-457e-b09d-d9d711a7fd90" onclick="cnblogs_code_hide('6b671133-f0ff-457e-b09d-d9d711a7fd90',event)" style="display: none;"><span class="cnblogs_code_collapse">代码</span><div id="cnblogs_code_open_6b671133-f0ff-457e-b09d-d9d711a7fd90" class="cnblogs_code_hide"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff;">CREATE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;Employee<br />(<br />EmployeeID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff;">Identity</span><span style="color: #000000;">,<br />LastName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">nchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">30</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;</span><span style="color: #008080;">--</span><span style="color: #008080;">&nbsp;created&nbsp;as&nbsp;fixed&nbsp;width&nbsp;to&nbsp;make&nbsp;our&nbsp;row&nbsp;size&nbsp;exactly&nbsp;400&nbsp;bytes&nbsp;(to&nbsp;simplify&nbsp;the&nbsp;math/visualization)</span><span style="color: #008080;"><br /></span><span style="color: #000000;">FirstName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">nchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">29</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />MiddleInitial&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">nchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />SSN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">11</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />OtherColums&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">258</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">DEFAULT</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">Junk</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br />)<br /></span><span style="color: #0000ff;">go</span></div></div></div><p>注意我们每行刚 好400字节，换句话说，每个数据页(8096/400=20.24)可以放20行数据。这里有个原因是IN_ROW数据行不能跨页。<br /></p><p>在 上面的定义中，这个表是一个Heap ,我们给它加一个聚集索引<br /></p><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008080;">--</span><span style="color: #008080;">&nbsp;Add&nbsp;the&nbsp;clustered&nbsp;index</span><span style="color: #008080;"><br /></span><span style="color: #0000ff;">ALTER</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;Employee<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ADD</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">CONSTRAINT</span><span style="color: #000000;">&nbsp;EmployeePK<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">KEY</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">CLUSTERED</span><span style="color: #000000;">&nbsp;(EmployeeID)<br /></span><span style="color: #0000ff;">ON</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff0000;">[</span><span style="color: #ff0000;">PRIMARY</span><span style="color: #ff0000;">]</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;">&nbsp;</span></div></div><p>我们使用前 面介绍过的DMV来查看索引的存储状态：<br /></p><div class="cnblogs_code" onclick="cnblogs_code_show('a5b6cc72-28c6-437c-9f35-1396a4ab5ed4')"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_a5b6cc72-28c6-437c-9f35-1396a4ab5ed4" alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_a5b6cc72-28c6-437c-9f35-1396a4ab5ed4" onclick="cnblogs_code_hide('a5b6cc72-28c6-437c-9f35-1396a4ab5ed4',event)" style="display: none;"><span class="cnblogs_code_collapse">代码</span><div id="cnblogs_code_open_a5b6cc72-28c6-437c-9f35-1396a4ab5ed4" class="cnblogs_code_hide"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #008080;">--</span><span style="color: #008080;">----------------------------------------------------------------------------</span><span style="color: #008080;"><br />--</span><span style="color: #008080;">&nbsp;Analyze&nbsp;the&nbsp;Employee&nbsp;Table's&nbsp;Clustered&nbsp;Index</span><span style="color: #008080;"><br />--</span><span style="color: #008080;">----------------------------------------------------------------------------</span><span style="color: #008080;"><br /></span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;index_depth&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;D<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;index_level&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;L<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;record_count&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">Count</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;page_count&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;PgCnt<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;avg_page_space_used_in_percent&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">PgPercentFull</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;min_record_size_in_bytes&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">MinLen</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;max_record_size_in_bytes&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">MaxLen</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;avg_record_size_in_bytes&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">AvgLen</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;sys.dm_db_index_physical_stats<br />&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #ff00ff;">DB_ID</span><span style="color: #000000;">&nbsp;(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">IndexInternals</span><span style="color: #ff0000;">'</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;</span><span style="color: #ff00ff;">OBJECT_ID</span><span style="color: #000000;">&nbsp;(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">IndexInternals.dbo.Employee</span><span style="color: #ff0000;">'</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">DETAILED</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br /></span><span style="color: #0000ff;">go</span></div></div></div><p>结果：</p><p><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pV5pcCTnrAqmh9CzhwiQUnUUdM7uQRgEG8Va8S0FyoDJVTDDCiXfv1vrq5_nwfARhteRFRJCF6e8LmyoJRNrwkQ/pageIndex2010_01.png" height="409" width="480" /><br /></p><p>&nbsp;从上图中我们看到：正如我们所期望的那样，80000行数据的表一个 4000页的叶级。从Minlen我们看到，非叶级的行长度只有11字节。这个结构很容易被细分成:4字节对应EmployeeID,6个字节对应页指 针，每行仅增加一个字节的开销(overhead)。为什么呢？因为我们的索引行只包含一个固定宽度的列，并且这些列中没有一个允许空值(Null),因 此，不需要在索引页放置一个空位图。此外，你可以在结果中看到，在Level  1仅仅只有7页数据，回忆以前我们介绍的B-Tree存储结构，我们再看看以上数据的存储结构：<br /><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pQHqLck22dg9RHJpaG8uSOucIrzcHZSJqgDNJE8boV3nRaxag4f2hVAyTZl4WruWvKiS2mOLG4gqgvzUeRSKQ3g/pageIndex2010.png" height="506" width="628" /><br /></p><p>&nbsp;我们可能通过DBCC IND命令进一步了解索引页的存储明细。<br /></p><div class="cnblogs_code" onclick="cnblogs_code_show('8641c77f-46f0-4c39-9dc2-b926f1079417')"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_8641c77f-46f0-4c39-9dc2-b926f1079417" alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_8641c77f-46f0-4c39-9dc2-b926f1079417" onclick="cnblogs_code_hide('8641c77f-46f0-4c39-9dc2-b926f1079417',event)" style="display: none;"><span class="cnblogs_code_collapse">代码</span><div id="cnblogs_code_open_8641c77f-46f0-4c39-9dc2-b926f1079417" class="cnblogs_code_hide"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff;">IF</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff00ff;">OBJECTPROPERTY</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">sp_tablepages</span><span style="color: #ff0000;">'</span><span style="color: #000000;">),&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">IsUserTable</span><span style="color: #ff0000;">'</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">IS</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">DROP</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;sp_tablepages;<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">CREATE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;sp_tablepages<br />(<br />&nbsp;&nbsp;&nbsp;&nbsp;PageFID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">tinyint</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;PagePID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;IAMFID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">tinyint</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;IAMPID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;ObjectID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;IndexID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">tinyint</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;PartitionNumber&nbsp;</span><span style="color: #0000ff;">tinyint</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;PartitionID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bigint</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;iam_chain_type&nbsp;&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">30</span><span style="color: #000000;">),<br />&nbsp;&nbsp;&nbsp;&nbsp;PageType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">tinyint</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;IndexLevel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">tinyint</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;NextPageFID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">tinyint</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;NextPagePID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;PrevPageFID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">tinyint</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;PrevPagePID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">CONSTRAINT</span><span style="color: #000000;">&nbsp;sp_tablepages_PK<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">KEY</span><span style="color: #000000;">&nbsp;(PageFID,&nbsp;PagePID)<br />);<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /></span><span style="color: #008080;">--</span><span style="color: #008080;">TRUNCATE&nbsp;TABLE&nbsp;sp_tablepages;</span><span style="color: #008080;"><br /></span><span style="color: #0000ff;">INSERT</span><span style="color: #000000;">&nbsp;sp_tablepages<br /></span><span style="color: #0000ff;">EXEC</span><span style="color: #000000;">&nbsp;(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">DBCC&nbsp;IND&nbsp;(IndexInternals,&nbsp;Employee,&nbsp;1)</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;IndexLevel<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;PageFID<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;PagePID<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;PrevPageFID<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;PrevPagePID<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;NextPageFID<br />&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;NextPagePID<br /></span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;sp_tablepages<br /></span><span style="color: #0000ff;">ORDER</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">BY</span><span style="color: #000000;">&nbsp;IndexLevel&nbsp;</span><span style="color: #0000ff;">DESC</span><span style="color: #000000;">,&nbsp;PrevPagePID;<br /></span><span style="color: #0000ff;">GO</span><span style="color: #000000;">&nbsp;</span></div></div></div><p><br /></p><p>&nbsp;</p><p>&nbsp;部分结果;<br /><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1px5XF5Gid-Y2GDkYLW0QmnwyKpPjzaINF50YX8V9ERC3mN37aMmfmK9L67KZBeMFk8HAIzT6tM7ZPFP77zbhnRQ/pageIndex2010_02.png" height="445" width="538" /><br /></p><p>&nbsp;注意上图中黄色部分，页数是完全连续的，这是因为表创建时我们在空表中建 立了聚集索引，然而从Root往下，就不一定连续，因为索引被从叶级到Root按照(对应的每一个叶级)排序。这很重要，想像我们查询：<br /></p><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff;">Select</span><span style="color: #000000;">&nbsp;e.</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;dbo.Employee&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;e&nbsp;&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;e.EmployeeID</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">27682</span><span style="color: #000000;">&nbsp;</span></div></div><p>&nbsp;为了找到所有 EmployeeID=27682的行，（记住，这是聚集索引键值）SQL Server开始从Root页开始沿着叶级向下浏览，root  Page我们已经知道是234 (IndexLevel最高2）,我们进&#183;一步用DBCC Page命令分析：<br /></p><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff;">DBCC</span><span style="color: #000000;">&nbsp;TRACEON&nbsp;&nbsp;(</span><span style="color: #800000; font-weight: bold;">3604</span><span style="color: #000000;">)<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">DBCC</span><span style="color: #000000;">&nbsp;PAGE&nbsp;(IndexInternals,&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000; font-weight: bold;">234</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">)</span><span style="color: #008080;">--</span><span style="color: #008080;">参数3表示Grid格式，这里复习一下。哈，考试内容啊。</span></div></div><p>&nbsp;结果如下：<br /><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pFn_7UE2SgD_Vwa2OzXAAHFtG2Rh6GTdyyL8_XQ-9Id9HTOuoQAhewtlpWuvy_sitd5_5cJsq9Knr1uyxSTVZVQ/pageIndex2010_03.png" height="293" width="524" /><br /></p><p>根据结果，我们大致判断一下27682应该在24881与37321之间, 也就是在第三页与第四页之间，为了精确定位，我们不得不沿FileID1的第三页的子页(ChildPageID)235,命令如下：<br /></p><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff;">DBCC</span><span style="color: #000000;">&nbsp;PAGE&nbsp;(IndexInternals,&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000; font-weight: bold;">235</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">)<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;">&nbsp;</span></div></div><p>结果：<br /><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pwboBOXsiU44cIN9d3jkoP9diMcHjI2n-czGsdNa0qaIH4I4iYnCN-moy9uvRHCE_eM27Hjs8wDgCAgy2Da-AWQ/pageIndex2010_04.png" height="213" width="529" /> <br /></p><p>&nbsp;继续： <br /></p><div class="cnblogs_code"><div><span style="color: #0000ff;">DBCC</span><span style="color: #000000;">&nbsp;PAGE&nbsp;(IndexInternals,&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000; font-weight: bold;">1616</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">);<br /></span><span style="color: #0000ff;">go</span></div></div><p>&nbsp;</p><p>&nbsp;<img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pB-vYDyNh_BFaxHSekvzTcH6lpzxWECoAtYWlrLNf6U5wEprHXCH7FZaVtcJ3meq56NspkmgFDl93OPQ8_u-7pA/pageIndex2010_05.png" height="383" width="489" /></p><p>&nbsp;小结：通过预览一个行结构，我们复习了两样东西，索引内幕和进程。并通过一个聚集 索引值查找一个行。这个方法在从一个非聚集索引攀（检索已经聚集的表的数据时）执行一个书签查找(bookmark  lookup)时被用到。为了更好地理解非聚集索引是如何被使用的，我们需要继续了解非聚集索引是如何被存储，以及它怎样找到数据行。这正是下一节将要了 解的内容。快两点了，打个盹先。<br /></p> <p>&nbsp;</p> <p>&nbsp; </p><img src="http://www.cnblogs.com/downmoon/aggbug/1665639.html?type=1" width="1" height="1" alt=""/><p>评论: 4　<a href="http://www.cnblogs.com/downmoon/archive/2010/02/08/1665639.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/downmoon/archive/2010/02/08/1665639.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>程序物语(九):解读你的生存法则</title><link>http://www.cnblogs.com/downmoon/archive/2010/02/06/1664818.html</link><dc:creator>邀月</dc:creator><author>邀月</author><pubDate>Sat, 06 Feb 2010 02:01:00 GMT</pubDate><guid>http://www.cnblogs.com/downmoon/archive/2010/02/06/1664818.html</guid><description><![CDATA[<p>阅读: 1108 评论: 10 作者: <a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a> 发表于 2010-02-06 10:01 <a href="http://www.cnblogs.com/downmoon/archive/2010/02/06/1664818.html" target="_blank">原文链接</a></p><p><span style="font-size: 12pt;">　　昨天，与一位朋友聊天，他刚吃完公司的年夜饭，情绪非常低落。我断断续续地了解了他的的近况。由于工资收入不佳，股市几乎赔去十之六七，家人的 生活成本的压力非常大，据他自称，已经严重影响了家庭的稳定。</span></p> <p><span style="font-size: 12pt;">　　我这位朋友的经历非常典型，他的现状其实提出了一个极为现实的问题：程序人该如何解读自己的生存法则？</span></p> <p><span style="font-size: 12pt;">　　第一条路：我们一般人都有一份稳定的工作，作为收入的主要来源。另外，一般都有一些额外收入，例如股市房市晃悠或干点私活，或合伙业余创业。</span></p><p><span style="font-size: 12pt;">　 　当然，还有第二条路：如果你不用考虑生存问题，专心进入某一行业的高层管理，那也挺诱人，虽然路途挤了，累了，像春运的无座站票，但终点是让你满意的。 与春运不同的是，每个人基本都能到家，而这条路只有极少极少数的人能成功走完。失败的经历，我们叫它人生财富；成功的经历，那是财富人生！所以，对绝大部 分的人来说，这条路是可以修炼，不可强求结果。</span></p><p><span style="font-size: 12pt;">　　我们可能还是得从稳定的基本工作做起。人过了一定的岁数，比如很多人喜欢提到的30大 关，心态会慢慢的起变化，请注意，是从内而外的，先是自己觉得好像需要改变，然后老板也觉得需要更新鲜的血液来补充，于是有意无意地给你压力，这更加剧了 你内心的争斗。我的朋友就是处于这个当口。  有句古话：&#8220;千里马常有，而伯乐不常有&#8221;。意思是说有才能的人很多，关键是要有会识别人才的能力，而识别的功夫只有伯乐才能做得到。伯乐很少有，于是大量 的千里马被埋没了。</span><br /></p><p><span style="font-size: 12pt;">　　牢骚可以发，人的情绪是需要发泄，而不是压抑。发泄过后，有两种结果：</span><br /></p><p><span style="font-size: 12pt;">　　一种是： 心情舒服了，继续过日子，更加埋头做技术。</span></p><p><span style="font-size: 12pt;">　　另一种：不断总结，寻 求人生境界的突破。最重要的是付出实实在在的行动。</span></p><p><span style="font-size: 12pt;">　　我们今天就来看看，问题究竟出在哪儿？</span></p><p>　　<strong style="font-size: 12pt;">首先，问题从自身找起。</strong><span style="font-size: 12pt;">有人说过，</span><span style="font-size: 12pt;" id="ing_body_61422">在沙滩上要想被人找到，你必须成为贝壳，而不是一粒沙子！</span><span style="font-size: 12pt;">  我觉得，之所以有今日之困境，重要的原因是我们是百里马而不是千里马。当然，有些人是一专多能的百里马，但仍然不是千里马。这对伯乐的要求太高了，因为百里马实在是太多了，每年有数百万的增量从各个学校涌入马厩</span><span style="font-size: 12pt;">抢槽抢草，伯乐即使有心也无力啊，招呼不过来。</span><strong style="font-size: 12pt;">像NBA的角色球员，主教 练是不会为你量身定做战术的，只有核心才有资格让教练付出脑细胞来做这些战术设计</strong><span style="font-size: 12pt;">。所以，</span><strong style="font-size: 12pt;">百里马的首要技能是识途</strong><span style="font-size: 12pt;">，至少知道自己的槽在哪儿，什么地方的草 料最有保障，更重要的是，知道自己在什么位置最容易被拉风的伯乐看到。</span></p><p><span style="font-size: 12pt;">　　这里有个建议：</span><strong style="font-size: 12pt;">即使内在的修炼是关键，也要注意适当的外在表现  </strong>。<span style="font-size: 12pt;">我们时常看到有人在采访或其他公开场合侃侃而谈，头头是道，那形象帅呆了。很少人去想，这些人除了颇具慧根之外，背后付出了多少的努力。台上三分钟，台 下十年功，那真不是唬人的。我们常犯的两类错误是：过于封闭或过于沉不住气。过于封闭者，则秉持&#8220;大中华局域程序员&#8221;的本色，长期划地为牢，跟人交谈，三句必扯到程序，也不管听者对此感兴趣还是讨厌。可地球人都知道，</span><span style="font-size: 12pt;" id="ing_body_61909">在中国</span><span style="font-size: 12pt;" id="ing_body_61909">闷头做技术是是很伤人的，有点像葵花宝典，不，</span><span style="font-size: 12pt;">比葵花宝典还要惨，同样失去很多，至少练那玩意儿 可以给你天下第一的快感。如今的现实，过长时间思绪封闭，大多数人只会收获抑郁和淘汰。（不绝对，不要找我算账啊。）酒香不怕巷子深，一句话害死多少懵懂 少年哪。过于沉不住气者，则缺乏城府和做人的深度，心里藏不住事，有什么情绪都挂在脸上，该说的时候说，该沉默的时候还是忍不住说,，忘了那句古训&#8220;祸从口 出&#8221;。不妨换一种思路：平时多用心，读书看好文，培养自己独特的分析能力，注意观察团队成员的爱好，尽量做到话出见效，要求高点，那叫&#8220;画龙点晴&#8221;。厚积薄发，你会收获意想不到的东东。 </span><br /></p><p><span style="font-size: 12pt;">&nbsp;　　智商、情商、财商是现代人成功必备的核心要素。智商，反映一般人的生存能力。情商，反映一个社会人的生存能力。财商，则反映现代经济人的生存能力。这里，我承认有的人智商很高。但是，说句实话，跟程序打交道的人有几个人傻啊，这应该是最精英的群 体之一，只是很多人不注意自己的策略和方法去展现，去发挥而已。所以，大多数人的智商差距不大，情商的差距可以靠后天的悟性和修炼来弥补，而财商，则可能是我们最最欠缺的东东。学都没地方学。失败了更是代价不菲。这就是我们所处的环境。 </span><br /></p><p>　　<strong style="font-size: 12pt;">其次，要有敏锐的选槽意识。</strong><span style="font-size: 12pt;">马 儿的寿命本不长，何况还有疾病等意外因素的困扰，要想保持数百里的水平也不易啊，所以，要不断地选好的槽。跳槽的意义，在于得到更大的槽，更适合你的槽， 为你量身定做的槽。既然现实的状况是&#8220;千里马不常有，伯乐更不常有&#8221;，那么，就让百里马来相伯乐吧。如果在一个团队，你始终做的是代码、数据、架构，由于 公司的经营策略等问题，你无法在这里得到成长性的回报，你的努力由于种种原因打了水漂，那么，就不妨换个槽口试试。当然，前提是你有更强的奔跑能力，这样 做基于两个原因：一、人往高处走对个人和团队都是适用的，个人不适应团队，个人被淘汰。同样，个人成长过快，团队停滞或进展缓慢，团队被抛弃。这是社会的 自然法则，是良性的竞争。二、根据需要层次说，人的一生有五个层次，在人生的每个阶段都应有更高的追求，最高的目标应该是自我价值的实现。而30岁，正好 是一个关口，从某某层次上升的关口。那，谁为跳槽买单？这个要看，你所代表的是一个职位，还是一种无可替代的能力。如果是职位，团队没有损失。如果是后者，团队巨亏。当然，跳也有跳的技巧，关键是成熟的心智和信心。雄关漫道真如铁，而今迈步从头越。信心源于行动。</span></p><p><span style="font-size: 12pt;">　　这里要说的是，</span><strong style="font-size: 12pt;">如果你只是为了 换槽而换，一个换一个，可能永远也不会得到价值的累积。</strong> <span style="font-size: 12pt;"> 因为，你只服务于一个老板。你的收入绝大部分来源于此。他的经营境界的高低，直接决定了你的价值。而你，是被动的。所以，邀月的建议是：既然打着灯笼也找 不到伯乐，不妨多添几口槽吧。比如巴菲特，比尔&#183;盖茨，google的创始人谢尔盖&#183;布林和拉里&#183;佩奇，****。善于理财的高手，哪一个人是因为只为一 家公司工作的？他们善于多渠道的投资，善于从0到1，更善于从1到1,000,000乃至更多。这才是他们高明的地方，也是财商的魅力所在。他们知道：把 所有鸡蛋放在一个篮子里是多么疯狂。</span></p><p><span style="font-size: 12pt;">　　此外，社会的因素可能更重要，但那是一个更为复杂的系统，比起灵魂之树的神经网络更为繁杂，我们确实没有精力去深究，暂且略去。 但请不要忘记：自身的修炼是前提。</span><br /></p><p><span style="font-size: 12pt;">　　结语： 程序世界里，生存是第一要务，是第一层关口，解码正确，则不断升级成功。解读失败，则是无言的Over结局。虎年将至，兼以此文作为牛年的总结，在这里邀月祝愿所有的百里马得其善所，冲关成功！祝愿所有千里马奋蹄疾驰，所向披靡！ </span><br /><p><strong style="color: #ff0000; font-size: 12pt;">所有程序物语系列文章：</strong><strong style="color: #ff0000; font-size: 12pt;"><br />   </strong></p> <p><strong><a target="_blank" href="http://www.cnblogs.com/downmoon/category/226146.html"><span style="font-size: 12pt;">http://www.cnblogs.com/downmoon/category/226146.html</span></a></strong></p><br /></p><img src="http://www.cnblogs.com/downmoon/aggbug/1664818.html?type=1" width="1" height="1" alt=""/><p>评论: 10　<a href="http://www.cnblogs.com/downmoon/archive/2010/02/06/1664818.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/downmoon/archive/2010/02/06/1664818.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>《Microsoft Sql server 2008 Internal》读书笔记--第六章Indexes:Internals and Management(2)</title><link>http://www.cnblogs.com/downmoon/archive/2010/02/04/1663956.html</link><dc:creator>邀月</dc:creator><author>邀月</author><pubDate>Thu, 04 Feb 2010 13:51:00 GMT</pubDate><guid>http://www.cnblogs.com/downmoon/archive/2010/02/04/1663956.html</guid><description><![CDATA[<p>阅读: 849 评论: 18 作者: <a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a> 发表于 2010-02-04 21:51 <a href="http://www.cnblogs.com/downmoon/archive/2010/02/04/1663956.html" target="_blank">原文链接</a></p><p><a target="_blank" id="homepage1_HomePageDays_ctl04_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/downmoon/archive/2010/02/archive/2010/01/26/1656411.html">《Microsoft Sql server 2008 Internal》读书笔记--目录索引</a></p>
<p>&nbsp;</p><p><span style="font-size: 10pt;">上篇主要介绍了索引中的基本概念B-Tree及分析索引的工具，下面我们继续学习理解索引的存储结构。这一节太费时间了，整整看了两个晚上，将近六 个小时.累啊！</span></p> <p><strong style="font-size: 10pt;">The Dependancy on the Clustering key</strong> </p> <p><span style="font-size: 10pt;">从上面的学习我们了解到：索引结构被分为两类索引组件：叶级(leaf level)和非叶级(non-leaf Level(s)) 。</span></p> <p><span style="font-size: 10pt;">一个聚集索引的叶级包含索引键和数据。&#8220;聚集索引的叶级除了键值还有什么？&#8221;答案是&#8220;其他的任何东东(everything  else)&#8221;。也就是说，表中的所有行的列都在一个聚集索引的叶级中。换种说法是：当一个聚集索引被创建的时候，数据(data)变成了聚集索引的叶级， 同 时，表中的数据被聚集键复制和排序。一旦被创建，一个聚集索引被逻辑维护而不是物理维护，排序被通过一个双链列表（称为页链page  Chain)维护。（注意：</span><strong style="font-size: 10pt;">在一个堆(Heap)中页是不会有任何方式互相链接的。</strong> ）在页链中的页的排序和数据页中行的排序，均是基于聚集 索引的定义。决定哪些列用于索引是一个重要的性能参考指标。</p> <p><span style="font-size: 10pt;">由于数据页的实际页链只能被一种方式排序，所以一个表只能有一个聚集索引。而且，通常情况下，大多数在使用聚集索引的时候性能更佳。然而，聚集键需 要被慎重选择，为了适当选择索引键，你必须理解索引是如何工作的。即聚集键的内部依赖，特别是非聚集索引。</span></p> <p><span style="font-size: 10pt;">位于聚集键上的非聚集索引的依赖(dependency)在SQL Server  7.0时代存储引擎被重新架构时就已经存在了，它最初是用于（当使用一个非聚集索引去引用表中相应的行时）行如何被标识。如果一个表有聚集索引，行被聚集 键标记(和查找）。如果没有聚集索引，则行被物理行标识(identifier RID)标记（和查找）。查找相应的数据行的处理就好像查找书的书签。</span></p> <p><strong style="font-size: 10pt;">非聚集索引仅仅包含索引定义的数据</strong> 。当在一个非聚集索引中查找一行的时候，你通常不得不到实际的数据行以得到没有包含在非聚集索引部 分的数据。为了检索这部分附加数据，你必须深入表的内部。</p> <p><strong style="font-size: 10pt;">首先</strong> ，最重要的是，所有聚集索引必须是惟一的。为什么必须是惟一的首要原因是非聚集索引项能够准确地指向一个特定的行。考虑到如果一 个表被最后一个名字（last  name)的不惟一的值聚集，问题来了。如果一个非聚集索引存在于一个惟一的值，比如社会安全号（对我们而言就是身份证号），一个查询社会安全号为 123-45-6789的索引，结果，聚集键是&#8220;Smith&#8221;,那么多个最后名字为Smith的行出现，到底是哪个？这个社会安全号为 123-45-6789的特定行，如何被有效定位？</p> <p><span style="font-size: 10pt;">为了聚集键能被有效使用，所有非聚集索引项必须准确地指向一行。因为SQL  Server中的指针是聚集索引，所以，聚集索引必须是惟一的。如果你创建一个聚集索引时没有使用Unique关键字，系统在必要时会自动向这些行添加一 个惟一标志列以确保内部的惟一性。这个惟一标志(uniquifier)是一个4字节的整数，当行的聚集键不惟一时，自动被回到数据行，一旦被添加，它变 成了聚集键的一部分，意味着它在每一个非聚集索引中被复制。　</span></p> <p><strong style="font-size: 10pt;">第二</strong> ，如果一个聚集键(Clustering  key)被用于从一个非聚集索引到一个聚集索引的（数据）内部查找相应的数据行，那么,这个聚集键是表中最被过多使用的数据。所有列都组织索引键，这些 键被包含于每一个非聚集索引附加于实际数据行中。结果，索引键的宽度变得重要了。考虑一个拥有12个非聚集索引和一百万数据的表的一个聚集索引拥有64字 节的聚集健。不计算内部和结构头部，仅仅用于存储在每一个非聚集索引键的索引键将是732MB,而如果聚集键只有8字节的话，这开销是92MB，而如果4 字节的话，将只有46MB。尽管这只是一个粗略的估计，它表明如果你使用了一个过宽的聚集键，将浪费大量的空间（以及潜在的缓 存池内存）,性能的损耗是比较可观的。因此，一个过宽的非聚集索引是应该避免的。</p> <p><span style="font-size: 10pt;">第三，因为聚集索引键是整个表中最冗余的数据，你应该确信你的聚集键是不易变的(not  volatile）,如果一个聚集健改变，它有以下几个副作用：1、它会引起聚集索引内的记录的搬迁，造成页page的分离与碎片。2、它引起每一个非聚 集索引被修改，以便于所有相关的非聚集索引的行的索引键的值被纠正。这既浪费时间和空间，导致需要整理的碎片，增加了不必要的开销（每个列重组聚集键）。</span></p> <p><span style="font-size: 10pt;">这三个属性：惟一、窄和静态也被用一个好的主键（但不总是）。因为你只有一个主键（仅仅一个聚集键）。SQL  Server使用一个惟一的聚集索引以强化主键约束。然而，并不是每一个表的创建者（唉，别睡着了，说你呢！）都知道这一点。于是，主键没有被坚持这些标 准(举例，当主键被选为数据的自然健(natural  key)，即，如一个宽的7个列的100个字节组合)，那么使用一个聚集索引去强化惟一性，并在每一个非聚集索引复制完全的100字节的列组合将具有极强 的反作用。l因此，对一些不知情的（unsuspecting）数据库开发人员（具体就是刚才睡觉的那几位),一个非常宽的聚集健在创建表时就被系统不知 不觉的加上了，好消息是：</span><strong style="font-size: 10pt;">你可以定义主键是非聚集索引，并且轻易地在一个不同的列上创建一个聚集索引</strong> 。当然，你必须知道什么时候和怎样做这 些。</p> <p><span style="font-size: 10pt;">最后，一个表的聚集键也应当以Insert时产生最小碎片为依据。尽管一旦聚集索引被创建后只有一个逻辑排序被维护，这个结构的维护确实有开销。如 果行需要持续地被插入在随机点（如插入一个以last  name排序的表中），那么这个表的逻辑排序的维护成本比总是插入一个以自增长列排序的表（总是在表的末尾处）略微有些提高。</span></p> <p><strong style="font-size: 10pt;">小结：表的聚集键应该基于表的用途，同时也应当基于SQL  Server在聚集健的内部依赖。聚集键应该是惟一的、窄的、静态的，最好，不断增长？（</strong> ever-increasing)。</p> <p><span style="font-size: 10pt;">好的聚集键的例子如下：</span></p> <p><span style="font-size: 10pt;">&#9632;、单个列键被定义为一个不断增长的自增长列(如int 或bigint)</span></p> <p><span style="font-size: 10pt;">&#9632;、一个不断增长的日期列(date而不是datetime)，紧跟着一个惟一的行标识（如自增长列）组成一个复合键，这对基于日期分区的表非常有用。如SalesDate(8字 节）+SalesNumber(4字节）组合为12字节，注意在SQL Server  2008中，一个日期列(date)不包含时间。但是<span style="font-size: 10pt;">单独</span>的一个日期列(date)并不是一个好的聚集键，因为它不惟一。</span></p> <p><span style="font-size: 10pt;">&#9632;、一个GUID能被成功地用作一个聚集键，因为它本身就是惟一的。相对的窄(12字节）,可能是静态的。然而，仅仅在不断增长的模式下，GUID 才适合被用作聚集健。</span><strong style="font-size: 10pt;">在一些情况下，GUID是在SQL Server的外部被生成或在SQL Server内部用  NewID()生成，这种模式下产生的碎片抵消了这个列作为聚集健的作用。如果可能，请选择NEWSEQUENTIALID()函数或选择其他列。如果你 想用GUID作为一个主键，并且不是自增长的，你可以把这个列作为一个非聚集索引代替聚集索引。</strong> </p> <p><span style="font-size: 10pt;">总之，没有一个通用的最好的绝对有效的法则来决定一个聚集键的选择。然而，一个表如果只有一个索引，并且是非聚集索引，那么在聚集健上的非聚集索引 依赖将不再相关。如果是聚集索引，可以采取任何形式。幸运的是，大多数表有一个以上的非聚集索引，大多数的表有一个聚集索引性能更佳。因此，第一步：精心 选择聚集键，第二步，查找一个正确的平衡，选择适当的，最小数量的非聚集索引。</span></p> <p><strong style="font-size: 10pt;">非聚集索引</strong> （ＮonClustering Indexes)</p> <p><span style="font-size: 10pt;">正如前面所述，所有索引中有两类主要组件：叶级(leaf level)和非叶级(non-leaf Level(s))  。一个聚集索引的叶级就是数据。一个非聚集索引叶级是一个独立的、额外的结构（一些数据的copy),特别地，一个非聚集索引取决于它的叶级形式的定义， 非聚集索引由索引键，任何包含性列、数据行的书签(bookmark)值,,一个蜚聚集索引的数量跟表中的数据行一样多，除非索引定义时使用了过滤谓词 (Filter predicate)。过滤谓词在SQl Server 2008是新增的。</span></p> <p><span style="font-size: 10pt;">非聚集索引的工作方式有两种：</span></p> <p><span style="font-size: 10pt;">１、辅助指向数据或直接回答查询。当一个非聚集索引拥有查询中请求的全部数据时，这就是所谓的&#8220;查询覆盖(query  covering)&#8221;，这时索引被称为覆盖索引，此时，非聚集索引被用于直接回答查询而避免了书签查询(bookmark  lookup)，一种对于非聚集索引异常昂贵的查询。</span></p> <p><span style="font-size: 10pt;">２、当一个非聚集索引没有包含查询中请求的全部数据时，这个查询被一个索引能找到的谓词驱动，此时，书签查询发生。如果一个表有一个聚集索引，非聚 集索引被用于驱动查询去通过聚集键找到相应的数据行。如果是Heap(没有聚集索引），查询值是一个8字节的RID，实际行位置如下格式 FileID:PageID:SlotNumber。这个8字节值：2字节:4字节:2字节。后面还有深入了解。</span></p> <p><span style="font-size: 10pt;">非聚集索引的设置与否并不会影响数据页被组织。SQL Server　2008中，一个表中可以有999个非聚集索引。SQL Server  2005中是249个。实际使用环境中，你尽可能少数量的使用（因为一些例外(Exception)，比如Filtered Indexes）。</span></p> <p><span style="font-size: 10pt;">总而言之，非聚集索引不会影响基表，相反，基表的结构会影响非聚集索引的结构。如果你想减少开销和架构最佳性能，你最好理解这些。</span></p><p>&nbsp;</p>
<p><strong style="font-size: 10pt;">约束和索引(Constaits and Indexes)</strong></p>
<p><span style="font-size: 10pt;">有关Primary Key约束和UNIQUE 约束，请查看MSDN:</span></p>
<p><a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/ms191236.aspx"><span style="font-size: 10pt;">http://msdn.microsoft.com/zh-cn/library/ms191236.aspx</span></a></p>
<p><a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/ms191166.aspx"><span style="font-size: 10pt;">http://msdn.microsoft.com/zh-cn/library/ms191166.aspx</span></a></p>
<p><span style="font-size: 10pt;">一个基本的区别是后者可以是NUll,前者不允许NUll,两者都不允许重复。</span></p>
<p><strong style="font-size: 10pt;">Indexes Creation Options</strong></p>
<p><span style="font-size: 10pt;">CREATE INDEX命令的更多选项，请查看MSDN:</span></p>
<p><a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/ms188783.aspx"><span style="font-size: 10pt;">http://msdn.microsoft.com/zh-cn/library/ms188783.aspx</span></a></p>
<p><span style="font-size: 10pt;">后面一节将学习物理的索引结构。</span></p><img src="http://www.cnblogs.com/downmoon/aggbug/1663956.html?type=1" width="1" height="1" alt=""/><p>评论: 18　<a href="http://www.cnblogs.com/downmoon/archive/2010/02/04/1663956.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/downmoon/archive/2010/02/04/1663956.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>《Microsoft Sql server 2008 Internal》读书笔记--第六章Indexes:Internals and Management(1)</title><link>http://www.cnblogs.com/downmoon/archive/2010/02/02/1661509.html</link><dc:creator>邀月</dc:creator><author>邀月</author><pubDate>Tue, 02 Feb 2010 04:29:00 GMT</pubDate><guid>http://www.cnblogs.com/downmoon/archive/2010/02/02/1661509.html</guid><description><![CDATA[<p>阅读: 797 评论: 0 作者: <a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a> 发表于 2010-02-02 12:29 <a href="http://www.cnblogs.com/downmoon/archive/2010/02/02/1661509.html" target="_blank">原文链接</a></p><p><a target="_blank" id="homepage1_HomePageDays_ctl04_DayList_ctl00_TitleUrl" href="../archive/2010/01/26/1656411.html">《Microsoft Sql server 2008 Internal》读书笔记--目录索引</a></p>
<p>在第五章主要学习了table的内部存储结构，第七章《Special storage》中将继续深入学习存储机制，那将是本书最难理解的一章。第六章主要介绍index的基础知识，第八章是《query Optimizer》,下面我们先来看看第六章：Indexes:Internals and Management。这一章分为三部分：</p>
<p>1、介绍Index的使用、概念和内部构造,你也将了解索引如何被存储和它们是如何被检索的。</p>
<p>2、深入了解数据被修改时内部存储发生了什么，是如何发生的，以及SQL Server如何确保一致性(consistence)。你还将了解到修改数据的索引（对性能的）的潜在影响，比如整理。</p>
<p>3、索引的管理和维护。</p>
<p>前言：索引的好处是不言而喻的。一个良好的索引可能将你的查询请求从数百万的I/O下降到few甚至更少。同样，一个过度的索引设计(over-indexing)比起不用索引可能后果更为严重。因此，掌握必要的索引物理存储及存储引擎、策略、优化知识对于一个SQL设计人员是至关重要的。</p>
<p>首先，我们来一起学习第一部分：</p>
<p>索引分为聚集索引 (clustered index)和非聚集索引(nonclustered index)两种，在聚集索引的表中，表数据是按照聚集键排序被逻辑存放的。当你找到你要的数据时，搜索同时完成。而非聚集索引的表中。索引结构是完全和数据自身分离的。当你开始查找索引的时候，你必须按照某些引用指针(Reference Pointer)的排序得到实际的数据。</p>
<p>关于如何创建索引(index)，请查阅MSDN:<br /><a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/ms188783.aspx">http://msdn.microsoft.com/zh-cn/library/ms188783.aspx</a></p>
<p>◆<b>SQL Server Index B-Tree</b></p>
<p>在SQL Server中，索引被按照B-Tree结构组织，B-Tree即(balanced-tree),SQL Server使用一种特殊的B+tree结构。不像通常的树，B-Tree总是倒的(inverted)，它的根root(单个page)在顶部,叶(Leaf)在底部。中间级别的level取决于多种因素。B-Tree是一个在不同场合被重载(overload)的词,在本书中。它意味着整个的索引结构，如下图所示：</p>
<p><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pWTjnLRVHRiW1Shm2ZUKgqHnlaw-zJ2gP6-0Y6hsDai62EWSY0G2tIZGFidWWNVClLOFxZLc8u3jzPehxYPAbww/2010-02-02%2009-31-41.png" height="430" width="597" /></p>
<p>重要的是，我们需要理解SQL　Server中B-Tree是如何被构建的(constructed)，以及每一个Level中包含什么。我们通过一些简单的概念入手。</p>
<p>首先，索引有两个很基本的组件：一个叶级(leaf level)，一个或多个非叶级(non-leaf levels)。后者主要用于叶级的导航。此外，第一个中间级(first intermediate level)也被用于整理分析和在大序列索引查询的驱动预读(read-ahead)。</p>
<p>非页级(non-leaf Level)的存在主要是为了在叶级帮助迅速导航到一行的架构，而不是直接到数据本身。每个非页级存储了自下而上在每一页(page),直到Root级被创建。越高的级（即距离leaf越远的）存放更少的信息, 因为每个处于该级的行只包含位于下一级的最小键值，加一个指针。实际上，这些key（最多900字节或16个列）在SQL　Server中有助于保持索引树相对的小。</p>
<p>下面我们使用一个包含1,000,000（即1百万）&ldquo;行&rdquo;的索引的叶级为例。首先我们得明确，无论是leaf leave还是non-leaf level都是被存储在SQL Server pages(8KB pages)中。在这个例子中，non-leaf&ldquo;&lsquo; 行&rdquo;将有4000字节。也就是说，每页只能存储两行。对于一个百万&ldquo;行&rdquo;的表而言，我们的索引的叶级将有500,000页。相对而言，这是一个非常宽的行结构，然而，我们并没有浪费很大的空间。假如我们叶级页有两个3,000字节的行，我们仍然每页两&ldquo;行&rdquo;，于是我们将浪费2,000字节的空间。</p>
<p>注意，这里为什么用"行"而不用数据行(Data Rows)，这是因为：这个页级可能是聚集索引（这自然就等于数据行），也可能这些叶级行是一些非聚集索引的包含性非键值列被加到索引的叶级中的行。当包含性列被使用时，叶级页可以包含更宽的行（超过900字节或16列限制）。在本例中，索引创建时页级将是4GB大小，(500,000个8kb大小的page)。如果使用最大限制，那么最后长到Root的树将会更小，并且最多有8个级，如下：<br />■ Root page of non-leaf level(Level 7)=2 rows=1 page(8 rows per page)</p>
<p>■ Intermediate page of non-leaf level(Level 6)=16 rows=2 page(8 rows per page)</p>
<p>■ Intermediate&nbsp; non-leaf level(Level 5)=123 rows=16 page(8 rows per page)</p>
<p>■ Intermediate&nbsp; non-leaf level(Level 4)=977 rows=123 page(8 rows per page)</p>
<p>■ Intermediate&nbsp; non-leaf level(Level 3)=7,813 rows=977 page(8 rows per page)</p>
<p>■ Intermediate non-leaf level(Level 2)=6,2500 rows=7,813 page(8 rows per page)</p>
<p>■ Intermediate&nbsp; non-leaf level(Level 1)=50,000 rows=6,2500 page(8 rows per page)</p>
<p>■ Leaf&nbsp; level(Level 0)=1,000,000 rows=500,000 page(8 rows per page)</p>
<p>更小的键大小将会有更快的级别，以同样数据为例，如果有更小的索引键将在非叶级带来更小的行大小，因此可以存储更多的行。如果只有20字节，将可以每而存储404行数据：</p>
<p>■ Root page of non-leaf level(Level 3)=4 rows=1 page(404 rows per page)</p>
<p>■ Intermediate non-leaf level(Level 2)=1,238 rows=4 page(404 rows per page)</p>
<p>■ Intermediate&nbsp; non-leaf level(Level 1)=50,000 rows=1,238 page(404 rows per page)</p>
<p>■ Leaf&nbsp; level(Level 0)=1,000,000 rows=500,000 page(2 rows per page)</p>
<p>请记住：更窄而不是更宽的键(key)将给索引带来更好的效率。最重要的是：索引的大小（即级的数量）取决于三点：1、索引定义。2、基表(table)是否有一个聚集索引。3、索引叶级的page数量。其中，叶级页的数量直接表中行大小和行数量。这并不是说在索引中一定要使用窄索引。有时还要适当使用宽索引。此外，像"包含性列"和filtered indexes也会影响索引的大小和用途。当然，最重要的是，使用正确的索引。不是吗？<br /><b>分析索引的工具(Tools for Analyzing Indexes)</b></p>
<p><b>一、使用</b>sys.dm_db_index_physical_stats</p>
<p>select * from sys.dm_db_index_physical_stats(DB_ID('testdb'),null,null,null,null);</p>
<p>关于sys.dm_db_index_physical_stats的更多使用，请参看MSDN：<br /><a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/ms188917.aspx">http://msdn.microsoft.com/zh-cn/library/ms188917.aspx</a></p>
<p>二、使用DBCC IND命令,这是一个MSDN未公开的命令。</p>
<p>exec ('DBCC IND(testdb,[dbo.Fixed],-1)')</p>
<p>下一节将继续学习物理索引结构(phisical Index Structure)。</p><img src="http://www.cnblogs.com/downmoon/aggbug/1661509.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/downmoon/archive/2010/02/02/1661509.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/downmoon/archive/2010/02/02/1661509.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>《Microsoft Sql server 2008 Internal》读书笔记--第五章Table(6)</title><link>http://www.cnblogs.com/downmoon/archive/2010/02/01/1661074.html</link><dc:creator>邀月</dc:creator><author>邀月</author><pubDate>Mon, 01 Feb 2010 07:41:00 GMT</pubDate><guid>http://www.cnblogs.com/downmoon/archive/2010/02/01/1661074.html</guid><description><![CDATA[<p>阅读: 900 评论: 1 作者: <a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a> 发表于 2010-02-01 15:41 <a href="http://www.cnblogs.com/downmoon/archive/2010/02/01/1661074.html" target="_blank">原文链接</a></p><p><a target="_blank" id="homepage1_HomePageDays_ctl04_DayList_ctl00_TitleUrl" href="../archive/2010/01/26/1656411.html">《Microsoft Sql server 2008 Internal》读书笔记--目录索引</a></p>
<p>上篇文章中提到五种典型的存储结构：一、固定长度的行；二、可变长度的行；三、Null和可变长度列；四、时间和日期数据；五、SQL_variant 数据。今天我们继续来看<b>可变长度的行的存储</b>：可变长度的列要比固定长度的列的存储复杂一些。</p>
<p>我们先来测试一个表Variable，有三个variable 列和两个固定长度列:</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">CREATE</span><span style="color: #000000;"> </span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;"> variable  <br />(<br />Col1 </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">)       </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />Col2 </span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">250</span><span style="color: #000000;">)  </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />Col3 </span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">)    </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />Col4 </span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">20</span><span style="color: #000000;">)   </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />Col5 </span><span style="color: #0000ff;">smallint</span><span style="color: #000000;">      </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />);<br /><br /></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">,  type_desc,  <br />    </span><span style="color: #ff00ff;">indexproperty</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">, name, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">minlen</span><span style="color: #ff0000;">'</span><span style="color: #000000;">) </span><span style="color: #0000ff;">as</span><span style="color: #000000;"> minlen<br />    </span><span style="color: #0000ff;">FROM</span><span style="color: #000000;"> sys.indexes </span><span style="color: #0000ff;">where</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">object_id</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">variable</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br /> <br /></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">  name, column_id, max_inrow_length, pc.system_type_id, leaf_offset  <br /> </span><span style="color: #0000ff;">FROM</span><span style="color: #000000;"> sys.system_internals_partition_columns pc<br />    </span><span style="color: #808080;">JOIN</span><span style="color: #000000;"> sys.partitions p  <br />          </span><span style="color: #0000ff;">ON</span><span style="color: #000000;"> p.partition_id </span><span style="color: #808080;">=</span><span style="color: #000000;"> pc.partition_id<br />    </span><span style="color: #808080;">JOIN</span><span style="color: #000000;"> sys.columns c<br />         </span><span style="color: #0000ff;">ON</span><span style="color: #000000;"> column_id </span><span style="color: #808080;">=</span><span style="color: #000000;"> partition_column_id </span><span style="color: #808080;">AND</span><span style="color: #000000;"> c.</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;"> </span><span style="color: #808080;">=</span><span style="color: #000000;"> p.</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;"> p.</span><span style="color: #ff00ff;">object_id</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">variable</span><span style="color: #ff0000;">'</span><span style="color: #000000;">); </span></div></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>可以看到:<br /><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pt4_rjTM6abNjKWO9Ee1JrZOmIXoZULe7COVRIydxMY6cD2mLt0QgOpyBoQOLGkAvDTMuM-QpdbD7a_j7b20ovA/2010-02-01%2013-29-54.png" height="230" width="447" /></p>
<p>现在，插入一行数据：</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">INSERT</span><span style="color: #000000;"> variable </span><span style="color: #0000ff;">VALUES</span><span style="color: #000000;">  (</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">AAA</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff00ff;">REPLICATE</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">X</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">250</span><span style="color: #000000;">), </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">ABC</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">123</span><span style="color: #000000;">);</span></div></pre>
</div>
<p>
说明:REPLICATE函数仅仅填充了250个X到col2,很有用的一个函数哟，特别在填充测试数据的时候。</p>
<p>&nbsp;</p>
<p>我们可以按照前一篇所述的方法来查看data pages的存储状况：<br /><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1p_u4FCZhS1EYDDN0-HLxGLmrQIFn32TPHTvWDzuz9fbgbEyGGuNdZ_xuqIwGgfHQ00EFjOow6tJ4kC5NiYH5Baw/2010-02-01%2013-41-02.png" height="692" width="581" /></p>
<p>简要说明：</p>
<p>1、还记得前面学过的存放顺序吗？先固定列，再可变列。所以Col1和Col5要先存储，并且偏移量为正值，而col2\Col3\col4偏移量分别是-1,-2,-3。正好表示它们分别是可变列的第一、第二、第三个序号。</p>
<p>2、0500表示该行有5列。</p>
<p>3、04代表null Bitmap没有使用。</p>
<p>4、0300代表共有三个可变长度的列。</p>
<p>5、0e01代表第一个可变列的结束位置，与第二个可变列的位置相同。这是为什么呢？可能有人猜出来了，因为<b>插入的是Null,所以实际上并没有数据存储到行中。这与固定长度的行不同。固定长度的行，Null值也占用存储空间。</b></p>
<p>6、该行数据的总长度为273字节，计算方法是0X1101,经过字节换算，应该是0X0111=273</p>
<p>那么，存储这行数据到底用去多少空间呢？可变长度列意味着更大的开销(overhead),它们的实际长度是无法预测的。即便对于固定长度的列，开销的数量也会取决于表中列的数量。记住：Null bitmap必须有足够的空间来存放每列的bit值。此外，每行还必须包含2个字节overhead和行底部的行偏移量数组</p>
<p>再来看第三种存储：<b>Null和可变长度列</b></p>
<p>可能，有人看了上面的图会说，可变长度的列既然并不存放实际数据，那么应该不会占用空间。可为什么还是有2个字节的偏移呢？这个-2是从哪儿来的呢？</p>
<p>因此，我们不能说SQL Server一点空间也不用。实际上，它仍然用了两个字节来存放了偏移数组。我们看一个例子：</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">CREATE</span><span style="color: #000000;"> </span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;"> dbo.null_varchar<br />    (<br />      id </span><span style="color: #0000ff;">INT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;"> </span><span style="color: #0000ff;">KEY</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">IDENTITY</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">,</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />      col1 </span><span style="color: #0000ff;">VARCHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">) </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />      col2 </span><span style="color: #0000ff;">VARCHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">) </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />      col3 </span><span style="color: #0000ff;">VARCHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">) </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />      col4 </span><span style="color: #0000ff;">VARCHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">) </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />      col5 </span><span style="color: #0000ff;">VARCHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">) </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />      col6 </span><span style="color: #0000ff;">VARCHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">) </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />      col7 </span><span style="color: #0000ff;">VARCHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">) </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />      col8 </span><span style="color: #0000ff;">VARCHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">) </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />      col9 </span><span style="color: #0000ff;">VARCHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">) </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,<br />      col10 </span><span style="color: #0000ff;">VARCHAR</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">) </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;"><br />    );<br /></span><span style="color: #0000ff;">GO</span><span style="color: #000000;"><br /><br /></span><span style="color: #0000ff;">SET</span><span style="color: #000000;"> NOCOUNT </span><span style="color: #0000ff;">ON</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">INSERT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">INTO</span><span style="color: #000000;"> null_varchar(col10)<br />   </span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">a</span><span style="color: #ff0000;">'</span><span style="color: #000000;">;<br /></span><span style="color: #0000ff;">INSERT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">INTO</span><span style="color: #000000;"> null_varchar(col1)<br />   </span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">b</span><span style="color: #ff0000;">'</span><span style="color: #000000;">;<br /></span><span style="color: #0000ff;">INSERT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">INTO</span><span style="color: #000000;"> null_varchar<br />   </span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> </span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">c</span><span style="color: #ff0000;">'</span><span style="color: #000000;">;<br /></span><span style="color: #0000ff;">INSERT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">INTO</span><span style="color: #000000;"> null_varchar<br />   </span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">  </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">d</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">,</span><span style="color: #ff0000;">''</span><span style="color: #000000;">;<br /></span><span style="color: #0000ff;">GO</span></div></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pxEpdEAY1QPxwgRsouUD6UibDXQLTLuwJURvnBfGlYLt12PQkO9gdmgyy7OkpxosGT3n220Ws1weFT0hHWmH_gQ/2010-02-01%2014-45-20.png" height="562" width="624" /></p>
<p>从红色部分显示，0x03fe意味着0000001111111110，从右往左看，第一列是not Null,第10列是not Null,其余列是Null。共11列，后5列被忽略了。</p>
<p>同理：0x07fc意味着0000011111111100，从右往左看，第一列和第二列是not Null,其余列是Null。</p>
<p>第四种存储方式:<b>日期和时间格式</b></p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">CREATE</span><span style="color: #000000;"> </span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;"> times (<br />    a </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    dt1 </span><span style="color: #0000ff;">datetime</span><span style="color: #000000;">,<br />    b </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    sd </span><span style="color: #0000ff;">smalldatetime</span><span style="color: #000000;">,<br />    c </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    dt2 datetime2,<br />    d </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    dt date,<br />    e </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    dto datetimeoffset,<br />    f </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    t time,<br />    g </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    t0 time(</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">),<br />    h </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    t1 time(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    i </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    t2 time(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">),<br />    j </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    t3 time(</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">),<br />    k </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    t4 time(</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">),<br />    l </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    t5 time(</span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">),<br />    m </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    t6 time(</span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">),<br />    n </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">),<br />    t7 time(</span><span style="color: #800000; font-weight: bold;">7</span><span style="color: #000000;">));<br /></span><span style="color: #0000ff;">GO</span><span style="color: #000000;"><br /><br /><br /></span><span style="color: #0000ff;">INSERT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">INTO</span><span style="color: #000000;"> times<br /></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"><br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">a</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">b</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">c</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">d</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">e</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">f</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">g</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">h</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">i</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">j</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">k</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">l</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">m</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">,<br />    </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">n</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">01:02:03.123</span><span style="color: #ff0000;">'</span><span style="color: #000000;">;</span></div></pre>
</div>
<p>&nbsp;</p>
<p>
<br /><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pn451SrcSRtkBO5iPtcntYjKqnaSv_sG-8Npt4Iqv45v1LVN-LsHv1VcgS87HO4tMyF46cCDtPxp86mlzAdORMQ/2010-02-01%2015-14-17.png" height="274" width="661" /><br />需要说明的是：</p>
<p>&nbsp;</p>
<p>对于datatime和smalldatetime,存储值为0意味着日期是'1900-01-01"，对于其他类型的日期值为693595意味着日期是"0001-01-01"</p>
<p>你可以通过这个语句查看对应的日期：</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">DATEADD</span><span style="color: #000000;">(dd, </span><span style="color: #800000; font-weight: bold;">693595</span><span style="color: #000000;">, </span><span style="color: #ff00ff;">CAST</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">0001/1/1</span><span style="color: #ff0000;">'</span><span style="color: #000000;"> </span><span style="color: #0000ff;">AS</span><span style="color: #000000;"> datetime2));</span></div></pre>
</div>
<p>
结果为默认值：1900-01-01 00:00:00.0000000</p>
<p>&nbsp;</p>
<p><b>第五种：SQL_variant 数据</b></p>
<p>在此略去。</p>
<p>关于存储行更多的信息，在后面的第七章学习中将继续展开。</p>
<p>下一节将继续学习列和行的存储相关操作。</p><img src="http://www.cnblogs.com/downmoon/aggbug/1661074.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/downmoon/archive/2010/02/01/1661074.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/downmoon/archive/2010/02/01/1661074.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>《Microsoft Sql server 2008 Internal》读书笔记--第五章Table(5)</title><link>http://www.cnblogs.com/downmoon/archive/2010/01/31/1660642.html</link><dc:creator>邀月</dc:creator><author>邀月</author><pubDate>Sun, 31 Jan 2010 14:32:00 GMT</pubDate><guid>http://www.cnblogs.com/downmoon/archive/2010/01/31/1660642.html</guid><description><![CDATA[<p>阅读: 762 评论: 1 作者: <a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a> 发表于 2010-01-31 22:32 <a href="http://www.cnblogs.com/downmoon/archive/2010/01/31/1660642.html" target="_blank">原文链接</a></p><p><a target="_blank" id="homepage1_HomePageDays_ctl04_DayList_ctl00_TitleUrl" href="../archive/2010/01/26/1656411.html">《Microsoft Sql server 2008 Internal》读书笔记--目录索引</a></p>
<p>前面我们学习了数据页 的存储结构以及如何检查一个data page。那么如何查询一个物理页呢？</p>
<p>记得在上篇文章时，我们介绍了了一个未公开的DBCC PAGE命令。该命令前需要知道页的具体参数，如<br /><span style="color: #008080;">--</span><span style="color: #008080;">查询testdb数据库的第一个文件的第157页的数据页</span><span style="color: #008080;"><br /></span><span style="color: #0000ff;">--DBCC</span><span style="color: #000000;">&nbsp;PAGE&nbsp;(testdb,</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">,</span><span style="color: #800000; font-weight: bold;">157</span><span style="color: #000000;">,</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">);</span></p>
<p>那么，如何查询第一页(first_page)的值呢？我们来看一个例子：假定我们创建一个表Fixed，语句如下：</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">CREATE</span><span style="color: #000000;"> </span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;"> Fixed  <br />( <br />Col1 </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">)     </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">, <br />Col2 </span><span style="color: #0000ff;">int</span><span style="color: #000000;">         </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">, <br />Col3 </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">)     </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">, <br />Col4 </span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">)     </span><span style="color: #808080;">NOT</span><span style="color: #000000;"> </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">  <br />);<br /></span><span style="color: #0000ff;">INSERT</span><span style="color: #000000;"> Fixed </span><span style="color: #0000ff;">VALUES</span><span style="color: #000000;"> (</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">ABCDE</span><span style="color: #ff0000;">'</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">123</span><span style="color: #000000;">, </span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">CCCC</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br /></span></div></pre>
</div>
<p>
用下列语句，可以查询Fixed表的first_page的值。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">object_name</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">) </span><span style="color: #0000ff;">AS</span><span style="color: #000000;"> name,  <br />    rows, type_desc </span><span style="color: #0000ff;">as</span><span style="color: #000000;"> page_type_desc, <br />    total_pages </span><span style="color: #0000ff;">AS</span><span style="color: #000000;"> pages, first_page <br /></span><span style="color: #0000ff;">FROM</span><span style="color: #000000;"> sys.partitions p  </span><span style="color: #808080;">JOIN</span><span style="color: #000000;"> sys.system_internals_allocation_units a <br />   </span><span style="color: #0000ff;">ON</span><span style="color: #000000;"> p.partition_id </span><span style="color: #808080;">=</span><span style="color: #000000;"> a.container_id <br /></span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">object_id</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">dbo.Fixed</span><span style="color: #ff0000;">'</span><span style="color: #000000;">); <br /></span></div></pre>
</div>
<p>
结果为:<br />name&nbsp;&nbsp; &nbsp;rows&nbsp;&nbsp; &nbsp;page_type_desc&nbsp;&nbsp; &nbsp;pages&nbsp;&nbsp; &nbsp;first_page<br />Fixed&nbsp;&nbsp; &nbsp;1&nbsp;&nbsp; &nbsp;IN_ROW_DATA&nbsp;&nbsp; &nbsp;2&nbsp;&nbsp; &nbsp;0xEE0000000100</p>
<p>&nbsp;</p>
<p>我们将这个十六进制结果转化一下，00　10　00　00　00　EE。</p>
<p>前两个group代表一个2字节的文件数。这里是0x0001，页数是00EE,十进制是。可以通过一个function来转换。</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">CREATE</span><span style="color: #000000;"> </span><span style="color: #0000ff;">FUNCTION</span><span style="color: #000000;"> convert_page_nums (</span><span style="color: #008000;">@page_num</span><span style="color: #000000;"> </span><span style="color: #0000ff;">binary</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">)) <br />   </span><span style="color: #0000ff;">RETURNS</span><span style="color: #000000;"> </span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">11</span><span style="color: #000000;">)  <br /></span><span style="color: #0000ff;">AS</span><span style="color: #000000;">  <br />  </span><span style="color: #0000ff;">BEGIN</span><span style="color: #000000;"> <br />   </span><span style="color: #0000ff;">RETURN</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">convert</span><span style="color: #000000;">(</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">), (</span><span style="color: #ff00ff;">convert</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">, </span><span style="color: #ff00ff;">substring</span><span style="color: #000000;">(</span><span style="color: #008000;">@page_num</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">))  <br />          </span><span style="color: #808080;">*</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">power</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">8</span><span style="color: #000000;">)) </span><span style="color: #808080;">+</span><span style="color: #000000;">  <br />             (</span><span style="color: #ff00ff;">convert</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">, </span><span style="color: #ff00ff;">substring</span><span style="color: #000000;">(</span><span style="color: #008000;">@page_num</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)))) </span><span style="color: #808080;">+</span><span style="color: #000000;"> </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">:</span><span style="color: #ff0000;">'</span><span style="color: #000000;"> </span><span style="color: #808080;">+</span><span style="color: #000000;">  <br />               </span><span style="color: #ff00ff;">convert</span><span style="color: #000000;">(</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">11</span><span style="color: #000000;">),  <br />   (</span><span style="color: #ff00ff;">convert</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">, </span><span style="color: #ff00ff;">substring</span><span style="color: #000000;">(</span><span style="color: #008000;">@page_num</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)) </span><span style="color: #808080;">*</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">power</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">24</span><span style="color: #000000;">)) </span><span style="color: #808080;">+</span><span style="color: #000000;">  <br />   (</span><span style="color: #ff00ff;">convert</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">, </span><span style="color: #ff00ff;">substring</span><span style="color: #000000;">(</span><span style="color: #008000;">@page_num</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)) </span><span style="color: #808080;">*</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">power</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">16</span><span style="color: #000000;">)) </span><span style="color: #808080;">+</span><span style="color: #000000;">  <br />   (</span><span style="color: #ff00ff;">convert</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">, </span><span style="color: #ff00ff;">substring</span><span style="color: #000000;">(</span><span style="color: #008000;">@page_num</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)) </span><span style="color: #808080;">*</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">power</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">8</span><span style="color: #000000;">)) </span><span style="color: #808080;">+</span><span style="color: #000000;">  <br />   (</span><span style="color: #ff00ff;">convert</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">, </span><span style="color: #ff00ff;">substring</span><span style="color: #000000;">(</span><span style="color: #008000;">@page_num</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">, </span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)))) ) <br />  </span><span style="color: #0000ff;">END</span><span style="color: #000000;">;<br /></span></div></pre>
</div>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> dbo.convert_page_nums(</span><span style="color: #800000; font-weight: bold;">0xEE0000000100</span><span style="color: #000000;">);</span></div></pre>
</div>
<p>
结果为1:238</p>
<p>&nbsp;</p>
<p><b>警告：first_page列并不一直是指向表的第一页。毕竟这是一个未公开的命令。</b></p>
<p>第二种获取页实际数字的方式是使用另外一个未公开的命令DBCC　IND。例如：</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">DBCC</span><span style="color: #000000;"> IND(testdb, fixed, </span><span style="color: #808080;">-</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">); </span></div></pre>
</div>
<p>&nbsp;</p>
<p>
得到如下类似结果：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">PageFID    PagePID    IAMFID    IAMPID    ObjectID    IndexID    PartitionNumber    PartitionID    iam_chain_type    PageType    IndexLevel    NextPageFID    NextPagePID    PrevPageFID    PrevPagePID<br /></span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">    </span><span style="color: #000000;">238</span><span style="color: #000000;">    </span><span style="color: #000000;">1</span><span style="color: #000000;">    </span><span style="color: #000000;">239</span><span style="color: #000000;">    </span><span style="color: #000000;">1029578706</span><span style="color: #000000;">    </span><span style="color: #000000;">0</span><span style="color: #000000;">    </span><span style="color: #000000;">1</span><span style="color: #000000;">    </span><span style="color: #000000;">72057594041925632</span><span style="color: #000000;">    In-row data    </span><span style="color: #000000;">1</span><span style="color: #000000;">    </span><span style="color: #000000;">0</span><span style="color: #000000;">    </span><span style="color: #000000;">0</span><span style="color: #000000;">    </span><span style="color: #000000;">0</span><span style="color: #000000;">    </span><span style="color: #000000;">0</span><span style="color: #000000;">    </span><span style="color: #000000;">0</span></div></pre>
</div>
<p>
第三种方式是使用一个未公开的function：sys.fn_PhysLocFormatter</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> sys.fn_PhysLocFormatter (</span><span style="color: #808080;">%%</span><span style="color: #000000;">physloc</span><span style="color: #808080;">%%</span><span style="color: #000000;">) </span><span style="color: #0000ff;">AS</span><span style="color: #000000;"> RID, </span><span style="color: #808080;">*</span><span style="color: #000000;"> </span><span style="color: #0000ff;">FROM</span><span style="color: #000000;"> Fixed;</span></div></pre>
</div>
<p>&nbsp;</p>
<p>
结果：<br />RID&nbsp;&nbsp; &nbsp;Col1&nbsp;&nbsp; &nbsp;Col2&nbsp;&nbsp; &nbsp;Col3&nbsp;&nbsp; &nbsp;Col4<br />(1:60928:0)&nbsp;&nbsp; &nbsp;ABCDE&nbsp;&nbsp; &nbsp;123&nbsp;&nbsp; &nbsp;NULL&nbsp;&nbsp; &nbsp;CCCC&nbsp; <br />请注意这个结果有所不同。</p>
<p>&nbsp;</p>
<p>下面将分别介绍五种类型的存储方式：</p>
<p>一、固定长度的行；二、可变长度的行；三、Null和可变长度列；四、时间和日期数据；五、SQL_variant 数据</p>
<p>首先，我们来看第一种:固定长度的行的存储。</p>
<p>我们以前面创建的Fixed表为例：</p>
<p>一旦表被创建，我们可以从目录视图中查看到相关列的信息；</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">,  type_desc,  <br />    </span><span style="color: #ff00ff;">indexproperty</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">, name, </span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">minlen</span><span style="color: #ff0000;">'</span><span style="color: #000000;">) </span><span style="color: #0000ff;">as</span><span style="color: #000000;"> min_row_len <br />    </span><span style="color: #0000ff;">FROM</span><span style="color: #000000;"> sys.indexes </span><span style="color: #0000ff;">where</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">object_id</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">Fixed</span><span style="color: #ff0000;">'</span><span style="color: #000000;">); <br /> <br /></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">  column_id, name, system_type_id, max_length </span><span style="color: #0000ff;">as</span><span style="color: #000000;"> max_col_len<br /></span><span style="color: #0000ff;">FROM</span><span style="color: #000000;"> sys.columns  <br /></span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;"> </span><span style="color: #ff00ff;">object_id</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">Fixed</span><span style="color: #ff0000;">'</span><span style="color: #000000;">); </span></div></pre>
</div>
<p>&nbsp;</p>
<p>
结果：</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">object_id    type_desc    min_row_len<br /></span><span style="color: #000000;">1029578706</span><span style="color: #000000;">    HEAP    </span><span style="color: #000000;">22</span><span style="color: #000000;"><br /><br />column_id    name    system_type_id    max_col_len<br /></span><span style="color: #000000;">1</span><span style="color: #000000;">    Col1    </span><span style="color: #000000;">175</span><span style="color: #000000;">    </span><span style="color: #000000;">5</span><span style="color: #000000;"><br /></span><span style="color: #000000;">2</span><span style="color: #000000;">    Col2    </span><span style="color: #000000;">56</span><span style="color: #000000;">    </span><span style="color: #000000;">4</span><span style="color: #000000;"><br /></span><span style="color: #000000;">3</span><span style="color: #000000;">    Col3    </span><span style="color: #000000;">175</span><span style="color: #000000;">    </span><span style="color: #000000;">3</span><span style="color: #000000;"><br /></span><span style="color: #000000;">4</span><span style="color: #000000;">    Col4    </span><span style="color: #000000;">175</span><span style="color: #000000;">    </span><span style="color: #000000;">6</span></div></pre>
</div>
<p>&nbsp;</p>
<p>
注意：<b>sysindexes目录视图包含列minlen和xmaxlen，存储了行的最小和最大长度。在Sql Server2008中，这些值在任何视图中是不可用的，除非你通过一个未公开的function:indexproperty读取它。对于一个只包含固定长度的列的表来说，indexproperty函数通过传入的minlen返回值等于列长度的总和（从sys.columns.max_length)加上4个字节。它不包含列数目的两个字节和用于null位图的字节。</b></p>
<p>&nbsp;</p>
<p>通过以下语句可以查看列的偏移量：</p>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">  c.name </span><span style="color: #0000ff;">AS</span><span style="color: #000000;"> column_name, column_id, max_inrow_length,  <br />         pc.system_type_id, leaf_offset  <br /> </span><span style="color: #0000ff;">FROM</span><span style="color: #000000;"> sys.system_internals_partition_columns pc <br />    </span><span style="color: #808080;">JOIN</span><span style="color: #000000;"> sys.partitions p  <br />      </span><span style="color: #0000ff;">ON</span><span style="color: #000000;"> p.partition_id </span><span style="color: #808080;">=</span><span style="color: #000000;"> pc.partition_id <br />    </span><span style="color: #808080;">JOIN</span><span style="color: #000000;"> sys.columns c <br />         </span><span style="color: #0000ff;">ON</span><span style="color: #000000;"> column_id </span><span style="color: #808080;">=</span><span style="color: #000000;"> partition_column_id  <br />            </span><span style="color: #808080;">AND</span><span style="color: #000000;"> c.</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;"> </span><span style="color: #808080;">=</span><span style="color: #000000;"> p.</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;"> <br /></span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;"> p.</span><span style="color: #ff00ff;">object_id</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">fixed</span><span style="color: #ff0000;">'</span><span style="color: #000000;">); </span></div></pre>
</div>
<div class="cnblogs_code">
<pre><div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">Col1    </span><span style="color: #000000;">1</span><span style="color: #000000;">    </span><span style="color: #000000;">5</span><span style="color: #000000;">    </span><span style="color: #000000;">175</span><span style="color: #000000;">    </span><span style="color: #000000;">4</span><span style="color: #000000;"><br />Col2    </span><span style="color: #000000;">2</span><span style="color: #000000;">    </span><span style="color: #000000;">4</span><span style="color: #000000;">    </span><span style="color: #000000;">56</span><span style="color: #000000;">    </span><span style="color: #000000;">9</span><span style="color: #000000;"><br />Col3    </span><span style="color: #000000;">3</span><span style="color: #000000;">    </span><span style="color: #000000;">3</span><span style="color: #000000;">    </span><span style="color: #000000;">175</span><span style="color: #000000;">    </span><span style="color: #000000;">13</span><span style="color: #000000;"><br />Col4    </span><span style="color: #000000;">4</span><span style="color: #000000;">    </span><span style="color: #000000;">6</span><span style="color: #000000;">    </span><span style="color: #000000;">175</span><span style="color: #000000;">    </span><span style="color: #000000;">16</span></div></pre>
</div>
<p>
<img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pK1VbFWx384tnNOIT-HKTS37iVaOJ0A6PB7bCdDlcmTIIyqLrxHw6Vp80eVO1-T8RVrKGwDPAwWigqYU8METkbQ/2010-01-31%2021-59-10.png" height="461" width="653" /></p>
<p>&nbsp;</p>
<p>对了，如何显示Buffer数据，请参看<a target="_blank" href="http://www.cnblogs.com/downmoon/archive/2010/01/28/1658145.html">上篇内容</a><br />简要说明：</p>
<p>1、第一个字节：状态位A是0x10显示bit4打开，bit5未打开。我们得知该行没有可变长度列。</p>
<p>2、第二个字节未使用。</p>
<p>3、第三和第四字节是0x16等于22,显示了固定长度的列长度之和。</p>
<p>4、各列的偏移量分别为4,9,13,16。</p>
<p>5、第22字节处是0400,表明列数为4</p>
<p>6、null bitmap未使用。</p>
<p>说实话，这节和下节是本书第二难理解的内容。最难理解的内容要数第七章了。呵呵。邀月确实有点半生不熟。共同学习是我的目的。</p><img src="http://www.cnblogs.com/downmoon/aggbug/1660642.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/downmoon/archive/2010/01/31/1660642.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/downmoon/archive/2010/01/31/1660642.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>程序物语(八):我心戚戚</title><link>http://www.cnblogs.com/downmoon/archive/2010/01/29/1659124.html</link><dc:creator>邀月</dc:creator><author>邀月</author><pubDate>Fri, 29 Jan 2010 04:12:00 GMT</pubDate><guid>http://www.cnblogs.com/downmoon/archive/2010/01/29/1659124.html</guid><description><![CDATA[<p>阅读: 1273 评论: 7 作者: <a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a> 发表于 2010-01-29 12:12 <a href="http://www.cnblogs.com/downmoon/archive/2010/01/29/1659124.html" target="_blank">原文链接</a></p><p>&nbsp;　　<span style="font-size: 12pt;">有人说，地上本没有程序员这条路，走的人多了，也就成了路。</span></p>
<p><span style="font-size: 12pt;">　　其实，程序员真正成为一个面向公众开放的职业，的确是不长的。  大约从上世纪八十年代中期，特别是九十年代网络的普及，程序员便如一夜春风万树开，突突冒了出来，望去一大片一大片满是的。客观上，由于我们所处的社会环 境，经历了极为深刻的社会变革，不仅仅是上辈人不适应，反应快的年青人面对这种变革也有些手足无措。于是，出现了许许多多的指导类书籍，如《****精 通****》，《***实战***》，也有像《****速成**》之类的快餐文化，更有许多培训机构，像&ldquo;北大****&rdquo;等提供了你无法拒绝的服务内容。</span></p>
<p><span style="font-size: 12pt;">　　  接触这些内容无疑是有益的，至少开阔了我们的眼界，丰富了我们的思路。邀月在这里想要说的是，你不能把这些当成生活的重心。</span><b style="font-size: 12pt;">比起外在的交流，我更相信内心的修炼对一个人的影响，而修炼的对象是情商。</b></p>
<p><span style="font-size: 12pt;">　　如果你是一位女性读者，请善待你的男友或爱人，他们活得并不容易，从事程序员 或相关行业是一项很艰苦的工作，很可能未到40岁，他们的身体机能已经衰老到60岁了，而且，他们还要承担社会责任和人们对他们的高期望。他们努力了，可 这个行业有太多的不确定性。请不要抱怨他们，他们面对的抱怨多得也许你无法想像。</span></p>
<p><span style="font-size: 12pt;">　　如果你是一位男人，更请珍爱你的女友或爱人。问问自己：在你二十多岁的事业无为期，是谁把自己生 命中最好的年华给了你？这个阶段的女人是最具无私精神的，她不求回报，只相信你会给她带来幸福。她可以不要物质享受，因为你没有。她可以不讲究生活品质和 情调，因为你也没有时间和精力。当她需要你陪伴的时候，你却在加班或解决技术难题。当她略带羡慕地提到朋友出国旅游时，你千万要记得那是你也应该让她享受 的。请相信：</span><b style="font-size: 12pt;">你得来这一切，全是因为她给你带来幸运，无论如何不要把 她付出的这一切看成是理所当然的。</b></p>
<p><span style="font-size: 12pt;">&nbsp;　　人生，有很多场战争，爱情战、婚姻战、良心战、命运战，一场场打下来，女人 的心变得很脆弱，即使不用锄头挖，墙角也会自然塌！男人的信条是：永不放弃！你可以错误，但不能退却。情感之路不会有不劳而获的事等着你，你的心智成熟到 什么地步，你会有什么样的收获。用你的坚强保护你的女人，保护你的家人，给她们一间永不漏雨的小屋。</span><span style="font-size: 12pt;">《蜗居》中的郭海萍和苏淳最后被导演捆在了一起，现实中经历这样的风雨还能在一起的概率跟彩票中五百万的机率大致相当。</span></p>
<p>　<b style="font-size: 12pt;">　 除了情感的修炼，还有一项更重要的能力培养是商业的敏锐性。</b></p>
<p><span style="font-size: 12pt;">　　在某一段时期，我们总是会沉浸在一个技术领域，对外界不闻不问。如果你的生活周期一直如此，那么是很可怕的。你可能不知道，危机就像沙 漠中的饿狼，已经来到你的身后，就等你回头呢。我时常跟新来的程序员说，不要因步自封，把自己限制在一个&ldquo;程序员&rdquo;的套子里而不自知。因为，你处在一个商 业社会里，你首先要解决的是生存问题，不是一个人，是你的一家人。而没有一点点商业嗅觉，你也无法完成你的程序生涯，你百分百会中途退场！</span></p>
<p><span style="font-size: 12pt;">　　这阵子，海南的房产炒得很火。很多人在议论，房价从２****涨到7****元，却很少有人想 为什么我没赚一把呢？我想先问几个问题：天朝的旅游指导文件是在什么条件下出台的？  出台的前六个月你有没有从其他渠道来了解相关背景？中国经济和旅游业的宏观背景如何？现阶段中国的海洋与能源的解决方案？民间游资是在什么样的海域作什么 规律的流动？****。</span><br /><span style="font-size: 12pt;">　　如果这些问题，你都有清晰的答案，那 么，恭喜你，无论如何，有一天你一定会成为你想成为的那种人。所以，请记住</span><b style="font-size: 12pt;">一定要搞清楚：狼来的前几天晚上，羊圈里究竟发生了什么？</b><span style="font-size: 12pt;">如果你只是一只普通的羊，过着跟其他羊无二的生活，即幻想着有一天会成为会飞的羊，对不起，你一定会像其他羊一样，最终死在倒塌的羊圈里。</span></p>
<p><span style="font-size: 12pt;">　　所以，在人生的某个阶段，宁静的小岛，心灵的积淀，是必须的。人生，不总是步履匆忙在向前，有 时可能在倒退，辨清方向，更好。请相信我一句话：生活不是我们的目的，生活得更好才是我们的目的。</span></p>
<p><span style="font-size: 12pt;">　　怎么做？据国外研究，每个人都有自己的情绪周期，一般为五周左右。（这是针对西方人的，因为东方 人含蕴，可能周期更长些。）在这个周期中，人的情绪像正则曲线一样起伏，其中有两周左右是人情绪最佳时期，这两周内几乎是文如泉涌，思路敏捷，出口成章， 有股无法抵制的兴奋，有用不完的精力。所以，用心记录一段时间，记下自己最佳的情绪周期，情绪好时，惜之，不佳时，运用其他方法调节之。  既然是活，为什么不每天活得更好一点呢？既然是做，为什么不每天做得更好一点呢？ </span></p>
<p><b> <a target="_blank" id="homepage1_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/downmoon/archive/2009/09/24/1573438.html"><span style="font-size: 12pt;">&nbsp;</span></a></b></p>
<p><br /><span style="font-size: medium;"><a target="_blank" id="homepage1_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/downmoon/archive/2009/09/24/1573438.html"><span style="font-size: 12pt;">&nbsp;</span></a></span></p>
<p><b style="color: #ff0000; font-size: 12pt;">所有程序物语系列文章：</b><b style="color: #ff0000; font-size: 12pt;"><br />   </b></p>
<p><b><a target="_blank" href="http://www.cnblogs.com/downmoon/category/226146.html"><span style="font-size: 12pt;">http://www.cnblogs.com/downmoon/category/226146.html</span></a></b></p>
<p><a target="_blank" href="http://www.cnblogs.com/downmoon/archive/2010/01/29/1659124.html"><span style="font-size: 12pt;">&nbsp;</span></a></p>
<p><b><span style="font-size: 12pt;"><a target="_blank" href="http://www.cnblogs.com/downmoon/archive/2010/01/29/1659124.html"></a></span></b></p><img src="http://www.cnblogs.com/downmoon/aggbug/1659124.html?type=1" width="1" height="1" alt=""/><p>评论: 7　<a href="http://www.cnblogs.com/downmoon/archive/2010/01/29/1659124.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/downmoon/archive/2010/01/29/1659124.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>《Microsoft Sql server 2008 Internal》读书笔记--第五章Table(4)</title><link>http://www.cnblogs.com/downmoon/archive/2010/01/28/1658145.html</link><dc:creator>邀月</dc:creator><author>邀月</author><pubDate>Thu, 28 Jan 2010 06:25:00 GMT</pubDate><guid>http://www.cnblogs.com/downmoon/archive/2010/01/28/1658145.html</guid><description><![CDATA[<p>阅读: 743 评论: 0 作者: <a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a> 发表于 2010-01-28 14:25 <a href="http://www.cnblogs.com/downmoon/archive/2010/01/28/1658145.html" target="_blank">原文链接</a></p><p><a target="_blank" id="homepage1_HomePageDays_ctl04_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/downmoon/archive/2010/01/26/1656411.html">《Microsoft Sql server 2008 Internal》读书笔记--目录索引</a></p>
<p>上篇我们主要学习了元数据(metadata)的存储及利用目录视图来查询这些信息，今天，我们继续学习数据页(Data Pages)。<br />
</p>
<p>&nbsp;数据页(Data pages)是包含已经添加到数据库的表中的用户数据的结构。正如前面所看到的，数据页有三类，每类数据页以不同的方式存储数据。复习一下，分别是in-row data pages、row-overflow data pages和LOB data pages。与其它类型的page一样，data pages也是固定的8K大小或8192 bytes。它由三类组件组成：the page Header,data rows和the row offset array,如下图所示：<br />
</p>
<p><img alt="邀月工作室" src="http://public.blu.livefilestore.com/y1pMRSLZBC69R4SlRZTx2jPhOnctSvPaK4c7eOrdOpaeCXCyFjGrBCPCSZhpruWRvq08BwyiegBF3ZPCD8MPFpSVA/2010-01-28%2010-42-32.png" height="328" width="392" /></p>
<p><span style="font-weight: bold;">1、Page Header </span><br />
</p>
<p>正如上图所示，每个data page (除去96 bytes,还有8096 bytes存放data,row overhead和row offset)。你可以使命下面的DBCC Page命令来查看。<br />
</p>
<p><span style="font-weight: bold;">2、Data Rows for in-Rows</span></p>
<p>&nbsp;Page Header的下面是row data,单个数据行最大可以存放8060 bytes的in-row data，这就是以前<span style="font-weight: bold;">数据行不能超过8060限制的原因</span>！有些行也可以在独立的页面(pages)中存放row-overflow data和LOB数据，存储在一个给定的page变量中的行数取决于表结构及数据被存放的结构。一个拥有全部固定长度列的表每页能存储相同的行数。一个拥有可变长度列的表在页中存放不同的行数以适应数据的实际长度。保持行长度尽量短，允许更多的行以适应页面，减少了I/O,改善了高速缓存命中率(cache-hit ratio)。<br />
</p>
<p>因此，<span style="font-weight: bold;">作为系统架构师或数据库Designer，实在有必要了解这些啊。</span>邀月深有体会。呵呵。<span style="font-weight: bold;">程序很烂，是后天的，但数据结构不合理，那是先天的，两者的杀伤力同样惊人！</span><br />
</p>
<p><span style="font-weight: bold;">３、Row Offset Array</span></p>
<p>行偏移数组(row offset array) 是一个2-byte entries的块(block),每个项说明对应数据行在页开始的偏移，每行(row)有一个两字节的项。尽管这些字节不会和数据一起存储在行中，它们能影响适应page的行数。行偏移数组揭示了行在页上的逻辑顺序。比如，如果一个表有一个聚集索引，SQL Server按聚集索引键的顺序存放数据。这并不意味着数据是物理按聚集索引键的顺序存放，而是行偏移数组的Slot 0 指向聚集索引键序列的第一行(row),Slot 1 指向第二行,等等。当我们要快速查看实际页的时候，这些行的物理位置可能在页的任何位置。<br />
</p>
<p><span style="font-weight: bold;">&nbsp;检查数据页(Exampling Data Pages)</span><br />
</p>
<p>&nbsp;DBCC page命令可以帮我们查询：<strong>MSDN文档中中没有提供此命令</strong>，微软真的很那个啊。语法为：<br />
</p>
<div class="cnblogs_code">
<div><!--<br/ />
<br/ />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />
http://www.CodeHighlighter.com/<br/ />
<br/ />
--><span style="color: #0000ff;">DBCC</span><span style="color: #000000;">&nbsp;PAGE&nbsp;({dbid&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;dbname},filenum,pagenum</span><span style="color: #ff0000;">[</span><span style="color: #ff0000;">,printopt</span><span style="color: #ff0000;">]</span><span style="color: #000000;">)</span></div>
</div>
<p>其中，最后一个参数可以是0,1,2,3,默认为0,有兴趣的朋友可以比较下这个参数的区别。我们作个示例：<br />
</p>
<div class="cnblogs_code">
<div><!--<br/ />
<br/ />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />
http://www.CodeHighlighter.com/<br/ />
<br/ />
--><span style="color: #0000ff;">DBCC</span><span style="color: #000000;">&nbsp;traceON(</span><span style="color: #800000; font-weight: bold;">3604</span><span style="color: #000000;">)<br />
</span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">--</span><span style="color: #008080;">查询testdb数据库的第一个文件的第157页的数据页</span><span style="color: #008080;"><br />
</span><span style="color: #0000ff;">DBCC</span><span style="color: #000000;">&nbsp;PAGE&nbsp;(testdb,</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">,</span><span style="color: #800000; font-weight: bold;">157</span><span style="color: #000000;">,</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">);<br />
</span><span style="color: #0000ff;">GO</span></div>
</div>
<p>查询结果如下：<br />
</p>
<p><img alt="" src="http://public.blu.livefilestore.com/y1piYCJ8xr-EPPLNNVtX1i9JzpE0jBLXOM4YyRaPqA0zLoC2suoljTP8EofwklqtdX4nLW8i80aPDQCuW0ONZRdAw/2010-01-28%2013-43-17.png" height="684" width="807" /><br />
</p>
<p><img alt="" src="http://public.blu.livefilestore.com/y1paRtqZxpl73nAJxLhw7BAMgImec6leDUecnvF1h-Fh5mNOFVEVI4hl--IeDMFCYo3tPyMIw68LhPlwF4iKSUdcg/2010-01-28%2013-45-25.png" height="217" width="519" /><br />
</p>
<p>此外，还有更详细的第Ｘ到第X行的数据显示。更多信息，请查看:</p>
<p><a target="_blank" href="http://support.microsoft.com/?scid=kb%3Ben-us%3B83065&amp;x=15&amp;y=13http://blogs.msdn.com/sqlserverstorageengine/archive/2006/12/13/More-undocumented-fun_3A00_-DBCC-IND_2C00_-DBCC-PAGE_2C00_-and-off_2D00_row-columns.aspx">&nbsp;http://support.microsoft.com/?scid=kb%3Ben-us%3B83065&amp;x=15&amp;y=13http://blogs.msdn.com/sqlserverstorageengine/archive/2006/12/13/More-undocumented-fun_3A00_-DBCC-IND_2C00_-DBCC-PAGE_2C00_-and-off_2D00_row-columns.aspx</a></p>
<p><a target="_blank" href="http://support.microsoft.com/?scid=kb%3Ben-us%3B83065&amp;x=8&amp;y=12">&nbsp;http://support.microsoft.com/?scid=kb%3Ben-us%3B83065&amp;x=8&amp;y=12<br />
</a></p>
<p>查询结果分为四部分：<strong>BUFFER、PAGE HEADER、DATA、和OFFSET TABLE</strong>(即真实的offset array) ，<br />
</p>
<p>&nbsp; 注意，要想得到类似上图的查询的明细信息，<strong>必须选择打开TRACEON开关</strong>，语法为：<br />
</p>
<div class="cnblogs_code">
<div><!--<br/ />
<br/ />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />
http://www.CodeHighlighter.com/<br/ />
<br/ />
--><span style="color: #0000ff;">DBCC</span><span style="color: #000000;">&nbsp;traceON(</span><span style="color: #800000; font-weight: bold;">3604</span><span style="color: #000000;">)<br />
</span><span style="color: #000000;">GO<br />
</span></div>
</div>
<p>关于DBCC TRACEON (Transact-SQL)的更多用法，请参考MSDN<br />
<a target="_blank" href="http://msdn.microsoft.com/en-us/library/ms187329.aspx">http://msdn.microsoft.com/en-us/library/ms187329.aspx</a><br />
</p>
<p>比如你想得知系统硬件的相关信息，可以通过DBCC traceON(3205)打开跟踪开关。<br />
<span id="ctl00_MTCS_main_ctl27_ctl00_ctl00"></span></p>
<p><strong>&nbsp;数据行的结构(the structure of data rows)</strong><br />
一个表的通用结构如下图所示：<br />
</p>
<p>&nbsp;<img alt="" src="http://public.blu.livefilestore.com/y1pByhU6URDcDnDa7F6dJaV9Pn3r4TaJjOFU9RSQROLdUElXHU9PC_lggtnyK9Iw8tlkOXPFk0vYprQ0bToXy65Eg/2010-01-28%2010-25-09.png" height="297" width="774" /></p>
<p>&nbsp;其中：状态位A包含一个关于行的位图信息。这个bits有如下含义： <br />
</p>
<div class="cnblogs_code">
<div><!--<br/ />
<br/ />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />
http://www.CodeHighlighter.com/<br/ />
<br/ />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bit&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;Versioning&nbsp;information</span><span style="color: #008000;">;</span><span style="color: #008000;">&nbsp;in&nbsp;SQL&nbsp;Server&nbsp;2008,&nbsp;it's&nbsp;always&nbsp;0.</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bits&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;through&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;Taken&nbsp;as&nbsp;a&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">-bit&nbsp;value</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;indicates&nbsp;a&nbsp;primary&nbsp;record</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;indicates&nbsp;a&nbsp;forwarded&nbsp;record</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;indicates&nbsp;a&nbsp;forwarded&nbsp;stub</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;indicates&nbsp;an&nbsp;index&nbsp;record</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;indicates&nbsp;a&nbsp;blob&nbsp;fragment</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;indicates&nbsp;a&nbsp;ghost&nbsp;index&nbsp;record</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;and&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;indicates&nbsp;a&nbsp;ghost&nbsp;data&nbsp;record.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bit&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;Indicates&nbsp;that&nbsp;a&nbsp;NULL&nbsp;bitmap&nbsp;exists</span><span style="color: #008000;">;</span><span style="color: #008000;">&nbsp;in&nbsp;SQL&nbsp;Server&nbsp;2008,&nbsp;a&nbsp;NULL&nbsp;bitmap&nbsp;is&nbsp;always&nbsp;present,&nbsp;even&nbsp;if&nbsp;no&nbsp;NULLs&nbsp;are&nbsp;allowed&nbsp;in&nbsp;any&nbsp;column.</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bit&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;Indicates&nbsp;that&nbsp;variable-length&nbsp;columns&nbsp;exist&nbsp;in&nbsp;the&nbsp;row.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bits&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;Indicates&nbsp;that&nbsp;the&nbsp;row&nbsp;contains&nbsp;versionings&nbsp;information.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bits&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">&nbsp;Not&nbsp;used&nbsp;in&nbsp;SQL&nbsp;Server&nbsp;</span><span style="color: #000000;">2008</span><span style="color: #000000;">.<br />
</span></div>
</div>
<p><strong>状态位Ｂ显示了该记录是前一记录的复本？？这句邀月不理解</strong>。原文是Only one bit is used in the status Bits B field,indicating that the record is a ghost forwarded record.<br />
下表显示了表数据行的存储信息：<br />
<br />
<table border="2" width="80%">
     <tbody><tr>
         <th>
         <p>
         Information</p>
         </th>
         <th>
         <p>
         Mnemonic</p>
         </th>
         <th>
         <p>
         Size</p>
         </th>
     </tr>
     <tr>
         <td>
         <p><strong>
         Status Bits A</strong></p>
         </td>
         <td>
         <p>
         TagA</p>
         </td>
         <td>
         <p>
         1 byte</p>
         </td>
     </tr>
     <tr>
         <td>
         <p><strong>
         Status Bits B (not used in SQL Server 2008)</strong></p>
         </td>
         <td>
         <p>
         TagB</p>
         </td>
         <td>
         <p>
         1 byte</p>
         </td>
     </tr>
     <tr>
         <td>
         <p><strong>
         Fixed-length size</strong></p>
         </td>
         <td>
         <p>
         Fsize</p>
         </td>
         <td>
         <p>
         2 bytes</p>
         </td>
     </tr>
     <tr>
         <td>
         <p><strong>
         Fixed-length data</strong></p>
         </td>
         <td>
         <p>
         Fdata</p>
         </td>
         <td>
         <p>
         Fsize --4</p>
         </td>
     </tr>
     <tr>
         <td>
         <p>
         <strong>Number of columns</strong></p>
         </td>
         <td>
         <p>
         Ncol</p>
         </td>
         <td>
         <p>
         2 bytes</p>
         </td>
     </tr>
     <tr>
         <td>
         <p>
         <strong>NULL bitmap(1 byte for each column in table; 1 indicates that the corresponding
         column is NULL)</strong></p>
         </td>
         <td>
         <p>
         Nullbits</p>
         </td>
         <td>
         <p>
         Ceiling (Ncol / 8)</p>
         </td>
     </tr>
     <tr>
         <td>
         <p>
         <strong>Number of variable-length columns</strong></p>
         </td>
         <td>
         <p>
         VarCount</p>
         </td>
         <td>
         <p>
         2 bytes</p>
         </td>
     </tr>
     <tr>
         <td>
         <p>
         <strong>Variable column offset array</strong></p>
         </td>
         <td>
         <p>
         VarOffset</p>
         </td>
         <td>
         <p>
         2 * VarCount</p>
         </td>
     </tr>
     <tr>
         <td>
         <p><strong>
         Variable-length data</strong></p>
         </td>
         <td>
         <p>
         VarData</p>
         </td>
         <td>
         <p>
         VarOff[VarCount]<br />
         -- (fsize + 4 + Ceiling
         <br />
         (Ncol / 8) + 2 * VarCount)</p>
         </td>
     </tr>
</tbody></table>
</p>
<p>有趣的是，当你创建一个表的时候，固定长度的列是先被存储的，比如这样一个语句<br />
</p>
<div class="cnblogs_code">
<div><!--<br/ />
<br/ />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />
http://www.CodeHighlighter.com/<br/ />
<br/ />
--><span style="color: #0000ff;">CREATE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;dbo.Demotable2010(&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;PKID,</span><span style="color: #808080;">not</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emp_fname&nbsp;&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;phone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">12</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job_level&nbsp;&nbsp;</span><span style="color: #0000ff;">smallint</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;<br />
);<br />
</span></div>
</div>
<p>首先存储的是pkid,再是phone,<span style="color: #000000;">job_level</span>,最后才是<span style="color: #000000;">&nbsp;emp_fname</span>,因为它是可变长度的。<br />
</p>
<p>后一篇我们将继续学习固定长度的行和可变长度的行的存储。真累啊！</p><img src="http://www.cnblogs.com/downmoon/aggbug/1658145.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/downmoon/archive/2010/01/28/1658145.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/downmoon/archive/2010/01/28/1658145.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>程序物语(七):项目经理预成长</title><link>http://www.cnblogs.com/downmoon/archive/2010/01/27/1657675.html</link><dc:creator>邀月</dc:creator><author>邀月</author><pubDate>Wed, 27 Jan 2010 08:34:00 GMT</pubDate><guid>http://www.cnblogs.com/downmoon/archive/2010/01/27/1657675.html</guid><description><![CDATA[<p>阅读: 1082 评论: 3 作者: <a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a> 发表于 2010-01-27 16:34 <a href="http://www.cnblogs.com/downmoon/archive/2010/01/27/1657675.html" target="_blank">原文链接</a></p><p><b style="color: #ff0000; font-size: 12pt;">所有程序物语系列文章：</b><b style="color: #ff0000; font-size: 12pt;"><br />   </b></p>
<p><b><a target="_blank" href="http://www.cnblogs.com/downmoon/category/226146.html"><span style="font-size: 12pt;">http://www.cnblogs.com/downmoon/category/226146.html</span></a></b></p>
<p>&nbsp;</p>
<p><span style="font-size: medium;">&nbsp;　　最近，一些汇聚点滴感悟的文章得到了大家的关注，邀月希望得到更多的交流，尤其是指出不足之处，今天，根据自己的体会，我来谈谈项目经理的&ldquo;初始化&rdquo;阶段。</span> </p>
<p><span style="font-size: medium;">　　新人工作一段时间后，或长或短，可能一至两年后，有可能出任项目经理。此 时，考验你能力的时候真正来临。项目分很多类，如基础研究项目，大型综合性项目。这里我们选取小的商业应用型项目为例。</span> </p>
<p><span style="font-size: medium;">　　刚开始，我们是没什么经验的，好在有热情。但这是项目，是一个讲究人与人 之间配合的技巧性的活，光靠热情是难以持久的。退一步说，你是能力很强的聪慧之人，什么都拿得起放得下，那你充其量只是个精兵，而不是一个好的管理者。</span><span style="font-size: medium;"><b>管 理者的目标让整个组织的效率更高，管理者是没有那么多时间老是冲锋在前的，请深刻体会这一点。</b> 因此我们得掌握一些基本的&ldquo;技术&rdquo;，讲究一些策略，力求避免未做勇士，先做烈士。</span> </p>
<p><span style="font-size: medium;">　　需要先补的课程是，项目的三要素：时间、成本、范围。<br />
<img src="http://public.blu.livefilestore.com/y1p7NuL0n9LC1mCJNSsklzehkZbDTRZEdhsGQ11xl7R42Z7JcH_6ZzmhPJZDxIGdg99rzhjWTk496VlSXXFpXaqWA/%E9%A1%B9%E7%9B%AE%E4%B8%89%E8%A6%81%E7%B4%A0.png" alt="邀月工作室" height="351" width="347" /> </span> </p>
<p><span style="font-size: medium;">　　第一：时间</span> </p>
<p><span style="font-size: medium;">　　如果三峡项目做得很漂亮，质量很高，专家也很满意，惟一不足的是项目比预 期推迟了两年半，那么这个项目的考评可能从A+会直降到C-甚至D-。因为这样一个大项目群，耽误一天便产生数以亿计的成本损耗。我们的项目虽然小，但道 理是相通的。所以在执行项目之前。项目的时间至关重要。</span> </p>
<p><span style="font-size: medium;">　　客户有个时间表，老板有个预期的时间表，每个项目成员都有个时间表，作为 项目经理，必须把这些协调起来，达成一个各方满意的结果、按照利益相关方的优先级别排序。这里有个分析的小技巧：请注意，老板说是下月底完工，你得有两手 准备。一方面：alpha版一定要在下月上旬先给老板看下，给他一个初步印象，避免到时心里落差过大，情绪失控，万一有错，也来得及修正。另一方面，不要 做得太细太完善，既浪费时间，又不给领导提意见的空间，领导只会怪你不会做事。于是，你得留一些简单的易于完成的小破绽给领导。是不是很委琐？！我相信这 样做，对项目组有利。当然，看具体的人，看性格。</span> </p>
<p><span style="font-size: medium;">　　第二：成本</span> </p>
<p><span style="font-size: medium;">　　项目花下去多少成本，</span> <span style="font-size: medium;">预算时要心中有数</span> <span style="font-size: medium;">。多大的西瓜多大的秤。这个成本包括时间成本、人力成本、费用成本等。在项目中间要 勤计算</span><span style="font-size: medium;"><b>挣值</b> 。这是一个很关键的指标。投入与产出必须有一定的正相关系数关系。&ldquo;人有多大胆，地有多大产&rdquo;的教训在我身上太深刻了，记住，<b>什么事都不 要拍脑门，项目中没有任何板上钉钉的事，特别在公开会议上，要控制自己的情绪和言行。</b> 有时候，一时不必要的斗气，让项目成员苦不堪言。</span> </p>
<p><span style="font-size: medium;">　　第三：范围</span> </p>
<p><span style="font-size: medium;">　　有了时间、成本的到位分析。范围就是一件简单的事了，简单的说，范围就是 项目需要完成的程度。时间长、成本允许，可以内外兼修，各环节都做得漂亮，各方满意，自己也挺有成就。这是理想中的理想，基本上在实际中属于空想的范畴。 所以，如何控制好范围，而又保持好项目成员的积极性，是一门学问，水很深哪！项目经理的一个基本观念是：</span><span style="font-size: medium;"><b>项目是独立核算的,项目的考评是 本项目完成到什么程度</b> ，而不是为了别的项目组或者为了下一次项目做了多少。如果这个项目可能为了别的项目组做出一些牺牲或额外努力，请尽量避免！如果必须得做，也需要在项目组 会议上言明，为自己项目组争取既得的回报，不一定非得物质的，比如领导的心知肚明，客户的理解和感激等，这些会帮你加分。千万不要偷偷摸摸的干，把项目成 员的暗中努力不当回事，&ldquo;我是雷锋我怕谁&rdquo;已经不能用来唬人了，这是个讲究科学、兼顾效益的商业社会。</span> </p>
<p><span style="font-size: medium;">　　有人会问，在这三者冲突的情况下，如何取舍。邀月的建议很明确：先砍功 能，也就是范围，把一些能推到项目二期的先往后推，向范围要时间。所以，</span><span style="font-size: medium;"><b>在项目开始之前，要给项目孵出20%左右的可压缩时间，这个只有 项目经理自己清楚，不必言明。</b> </span> </p>
<p><span style="font-size: medium;"><b>　　</b></span><span style="font-size: medium;"> 最不可取的就是项目经理挥刀自宫，让整个项目组在低成本下高速运行，这样的项目最后成败我们先不说，在项目成员的眼中，你基本上与黄世仁无异，甚至不用等 到项目结束，就已经*****了。所以在第一次项目中一定不要让项目成员感觉跟你就是为了体验雪山草地，他们配合你，一是出于利益，二才是看你这个人值不 值得跟。都看着你呢。所以，遇到不顺事先忍着，抓重点，回头再总结。这就是前文所说的做人、做事的原则：</span><span style="font-size: medium;"><b>为什么级别的事情，就得付出什么 级别的代价！</b> </span> </p>
<p><span style="font-size: medium;"><b>　　</b></span><span style="font-size: medium;"> 其实，第一次，不要将成败看的太重，教训要自己书写。有人说，哪怕只打一次仗，一个兵才会淬火成为真正的军人。谁没有第一次呢?做人，要经得起失败，但得 明明白白地失败。　</span> </p>
<p><span style="font-size: medium;">　　有人说 程序员的人生有三重境界。第一重、见山是山，见水是水。刚入门的程序员基本只能看到表面的东西，由于各种原因，没法了解更深入。第二重</span> <span style="font-size: medium;">、见山不是山，见 水不是水。</span> <span style="font-size: medium;">成长并有经验 后，看到的表面现象渐渐有头脑中成型，犹如行军详细地图已经了然于胸。第三重、见山亦是山，见水亦是水。大悟之后，举重若轻，外松内紧，处事看似笨拙，实 则暗藏玄机，惜语如金，然字字珠矶。此时，胸中亦有各种框图，然表面内敛以藏拙，见人说人话，见鬼与鬼语，谓之通灵也。</span> </p>
<p>
<span style="font-size: medium;">　　要想修炼到气定神闲的第三重境界，那就用心和智慧体验吧！</span><br />
<br /></p><img src="http://www.cnblogs.com/downmoon/aggbug/1657675.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/downmoon/archive/2010/01/27/1657675.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/downmoon/archive/2010/01/27/1657675.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>《Microsoft Sql server 2008 Internal》读书笔记--第五章Table(3)</title><link>http://www.cnblogs.com/downmoon/archive/2010/01/27/1657140.html</link><dc:creator>邀月</dc:creator><author>邀月</author><pubDate>Tue, 26 Jan 2010 16:06:00 GMT</pubDate><guid>http://www.cnblogs.com/downmoon/archive/2010/01/27/1657140.html</guid><description><![CDATA[<p>阅读: 917 评论: 3 作者: <a href="http://www.cnblogs.com/downmoon/" target="_blank">邀月</a> 发表于 2010-01-27 00:06 <a href="http://www.cnblogs.com/downmoon/archive/2010/01/27/1657140.html" target="_blank">原文链接</a></p><p><a target="_blank" id="homepage1_HomePageDays_ctl04_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/downmoon/archive/2010/01/26/1656411.html">《Microsoft  Sql server 2008 Internal》读书笔记--目录索引</a></p><p>&nbsp;</p><p>在上一篇中，我们主要学习了如何在系统视图中察看我们创建表和索引的元数据信息，今天，我们继续学习数据存储的元数据结构。<br />  <strong>数据存储无数据(Data Storage Metadata)</strong>  </p> <p>还记得Haep吗？，就是没有聚集索引的表。每一个Heap和索引都在sys.indexes视图中有一行记录，SQL2008中每个表和索引能被 存储在多个分区中。sys.Partitions包含一个Row对应于每一个Heap或索引的分区。每一个Heap或索引至少有一(到1000)个分区， 即使你没有定义分区结构。因此，sys.indexes与sys.Partitions是一对多的关系，在SQL2008中用了一个词"hobt" (Heap Or  B-Tree)来称谓表或索引在一个分区中的子集(subset),所以在sys.partitions中有一列是hobt_id。实际 上，hobt_id和partition_id是一一对应关系。这两列的值也完全一样。</p> 示例：<p>&nbsp;</p><div class="cnblogs_code" onclick="cnblogs_code_show('a70465a2-849a-4e38-847c-7a5a94c827f5')"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_a70465a2-849a-4e38-847c-7a5a94c827f5" alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_a70465a2-849a-4e38-847c-7a5a94c827f5" onclick="cnblogs_code_hide('a70465a2-849a-4e38-847c-7a5a94c827f5',event)" style="display: none;"><span class="cnblogs_code_collapse">代码</span><div id="cnblogs_code_open_a70465a2-849a-4e38-847c-7a5a94c827f5" class="cnblogs_code_hide"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff;">CREATE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;dbo.employee(&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emp_lname&nbsp;&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">15</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emp_fname&nbsp;&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">30</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;phone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">12</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job_level&nbsp;&nbsp;</span><span style="color: #0000ff;">smallint</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">NOT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;<br />);<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">alter</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;dbo.employee&nbsp;<br /></span><span style="color: #0000ff;">add</span><span style="color: #000000;">&nbsp;Emp_ID&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff;">identity</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">,</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)<br /></span><span style="color: #0000ff;">alter</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;dbo.employee<br /></span><span style="color: #0000ff;">add</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">constraint</span><span style="color: #000000;">&nbsp;PK_Employee&nbsp;</span><span style="color: #0000ff;">primary</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;(Emp_ID)<br /></span><span style="color: #0000ff;">go</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">,&nbsp;name,&nbsp;index_id,&nbsp;type_desc&nbsp;<br /></span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;sys.indexes&nbsp;<br /></span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff00ff;">object_id</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">dbo.employee</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br /></span></div></div></div><p>&nbsp;</p><p>结果：<br />  <img src="http://public.blu.livefilestore.com/y1pA5ghKL791qmBJzUCHRNzJCDoAchtgumxw13NcWmLOef-d2RlEIUsWI5c8jAIEslwgPAIYXeC9B27piPRbsuebQ/SQl2008%E8%A1%A8%E5%AD%98%E5%82%A8009.png" alt="邀月工作室" height="179" width="532" />  <br />  每一个分区（无论是一个Heap或者索引）能存储三种类型的行，分别存储在自己特定的页面（pages）中。即in-row data  pages（可以理解为规则数据）、row-overflow data pages和LOB data  pages。针对于一个特定分区的一个特定的页面被称为allocation  unit(分配单元)，每个分区在视图sys.allocation_units中有多个行，因为每个分区我们多个分配单元。总有一个分配单元针对n- row data,也可能有分配单元针对LOB data和row-overflow data,下图展示了这种关系：<br />  <img src="http://public.blu.livefilestore.com/y1pumCzXhk_msnJpts9IarWf307nUdF9Cu2VU8UubQhjmiQw6pfOKyAhlw-eAtHKCdPFEltzs2cBiayO8bKpzYgiQ/SQl2008%E8%A1%A8%E5%AD%98%E5%82%A8008.png" alt="邀月工作室" title="邀月工作室" height="414" width="725" />  </p> <p><strong>查询目录视图</strong>  (Querying Catalog Views)</p> <p>其实前面已经多次应用，这里我们再练习一下sys.allocation_units</p><p>&nbsp;</p><div class="cnblogs_code" onclick="cnblogs_code_show('e7cc0243-a18f-439f-bd8b-60186fbed58a')"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_e7cc0243-a18f-439f-bd8b-60186fbed58a" alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_e7cc0243-a18f-439f-bd8b-60186fbed58a" onclick="cnblogs_code_hide('e7cc0243-a18f-439f-bd8b-60186fbed58a',event)" style="display: none;"><span class="cnblogs_code_collapse">代码</span><div id="cnblogs_code_open_e7cc0243-a18f-439f-bd8b-60186fbed58a" class="cnblogs_code_hide"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff00ff;">object_name</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;name,&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;partition_id,&nbsp;partition_number&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;pnum,&nbsp;&nbsp;rows,&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;allocation_unit_id&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;au_id,&nbsp;type_desc&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;page_type_desc,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;total_pages&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;pages&nbsp;<br /></span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;sys.partitions&nbsp;p&nbsp;</span><span style="color: #808080;">JOIN</span><span style="color: #000000;">&nbsp;sys.allocation_units&nbsp;a&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ON</span><span style="color: #000000;">&nbsp;p.partition_id&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;a.container_id&nbsp;<br /></span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff00ff;">object_id</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">dbo.employee</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);</span></div></div></div><p>&nbsp;</p><p>结果如下：<br />  <br />  <img src="http://public.blu.livefilestore.com/y1pYRduCh8r1cDfi5KzRJAto5Bd6hmcnzhnk2qpCMUEmx1hVB0DLduUffa8wcV-hHuzMYj8HHM-_GahBBpIWLbuLA/SQl2008%E8%A1%A8%E5%AD%98%E5%82%A8010.png" alt="邀月工作室" height="250" width="561" />   </p> 再增加不&#8220;规则列&#8221;<br /><p>&nbsp;</p><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff;">alter</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;dbo.Employee&nbsp;<br /></span><span style="color: #0000ff;">add</span><span style="color: #000000;">&nbsp;Desc_Long&nbsp;</span><span style="color: #0000ff;">Nvarchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">4000</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,<br />Notes&nbsp;</span><span style="color: #0000ff;">text</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,<br />LongVar&nbsp;</span><span style="color: #0000ff;">Nvarchar</span><span style="color: #000000;">(</span><span style="color: #ff00ff;">max</span><span style="color: #000000;">)<br /></span></div></div><p>&nbsp;</p><p>结果：</p> <p><img src="http://public.blu.livefilestore.com/y1pVZibn5KDG-Uoq5Qm0Vlun14yx6OlEZfiaDpaIWkHxmZUUwjFyCsS8e9YqnEQPv5Ff5rU99CgNxwW5KYKlm3mwQ/SQl2008%E8%A1%A8%E5%AD%98%E5%82%A8011.png" alt="邀月工作室" height="270" width="607" /> </p> 你也可发创建一个或两个索引来测试索引视图，应该注意到仅仅增加一个聚集索引并不会改变sys.allocation_units的行数，但却改变 了partition_id 数字，<strong>因为创建一个聚集索引的时候表完全被内部重建了</strong> 。你可以从经下语句的结果中看到这个差异：<br /><p>&nbsp;</p><div class="cnblogs_code" onclick="cnblogs_code_show('c56ef40f-1c63-45d7-8614-1c63418107ca')"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_c56ef40f-1c63-45d7-8614-1c63418107ca" alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_c56ef40f-1c63-45d7-8614-1c63418107ca" onclick="cnblogs_code_hide('c56ef40f-1c63-45d7-8614-1c63418107ca',event)" style="display: none;"><span class="cnblogs_code_collapse">代码</span><div id="cnblogs_code_open_c56ef40f-1c63-45d7-8614-1c63418107ca" class="cnblogs_code_hide"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #ff00ff;">convert</span><span style="color: #000000;">(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">8</span><span style="color: #000000;">),</span><span style="color: #ff00ff;">object_name</span><span style="color: #000000;">(i.</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">))&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;table_name,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;i.name&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;index_name,&nbsp;i.index_id,&nbsp;i.type_desc&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;index_type,<br />&nbsp;&nbsp;&nbsp;&nbsp;partition_id,&nbsp;partition_number&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;pnum,&nbsp;&nbsp;rows,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;allocation_unit_id&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;au_id,&nbsp;a.type_desc&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;page_type_desc,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;total_pages&nbsp;</span><span style="color: #0000ff;">AS</span><span style="color: #000000;">&nbsp;pages<br /></span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;sys.indexes&nbsp;i&nbsp;</span><span style="color: #808080;">JOIN</span><span style="color: #000000;">&nbsp;sys.partitions&nbsp;p&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ON</span><span style="color: #000000;">&nbsp;i.</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;p.</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">AND</span><span style="color: #000000;">&nbsp;i.index_id&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;p.index_id<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">JOIN</span><span style="color: #000000;">&nbsp;sys.allocation_units&nbsp;a<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ON</span><span style="color: #000000;">&nbsp;p.partition_id&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;a.container_id<br /></span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;i.</span><span style="color: #ff00ff;">object_id</span><span style="color: #808080;">=</span><span style="color: #ff00ff;">object_id</span><span style="color: #000000;">(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">dbo.employee</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);</span></div></div></div><p>&nbsp;</p><p>大家可能注意到rows和Pages都是0,那是因为我们还没有插入任何数据。</p> <p>到目前为止，我们并没有查询关于page的分配信息情况。在SQL2000中sysindexes表包含了三列关于空间分配的信 息：first,root和firstIAM,</p> <p><strong>在SQL2008中这三个列名改为first_page,root_page,和first_iam_page，但只在MSDN未 公开的sys.system_allocation_units中可以查到。</strong> 而公开的一个视图是sys.allocation_units。看来，微软还是藏了不少压箱货啊！呵呵。</p> <p>关于更多的目录视图的知识，请看MSDN:</p> <p><a href="http://msdn.microsoft.com/zh-cn/library/ms174365%28SQL.90%29.aspx" target="_blank">http://msdn.microsoft.com/zh-cn/library/ms174365%28SQL.90%29.aspx</a> </p> <p>下一节将更深入学习数据页Data Pages</p>&nbsp;<img src="http://www.cnblogs.com/downmoon/aggbug/1657140.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/downmoon/archive/2010/01/27/1657140.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/downmoon/archive/2010/01/27/1657140.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>