﻿<?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>IT博客-玄铁剑-文章分类-Sqlserver相关</title><link>http://www.cnitblog.com/MartinYao/category/4540.html</link><description>成功的途径：抄，创造，研究，发明...</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 13:52:51 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 13:52:51 GMT</pubDate><ttl>60</ttl><item><title>2010年10大热门的开源NoSQL服务器软件</title><link>http://www.cnitblog.com/MartinYao/articles/72562.html</link><dc:creator>玄铁剑</dc:creator><author>玄铁剑</author><pubDate>Fri, 31 Dec 2010 08:45:00 GMT</pubDate><guid>http://www.cnitblog.com/MartinYao/articles/72562.html</guid><description><![CDATA[<div class=blkCont>
<p>
<p>NoSQL，就是反SQL，是一项全新的数据库革新运动，特别是在 2010 年得以迅猛发展。而各种开源的 NoSQL 软件突然间涌现在你面前。目前似乎没有对 NoSQL 给出一个标准的定义，也没有相应的规范，但从这些软件可以看出 NoSQL 软件的共同点：独立运行、K/V存储结构，这之前有人称之为集中式缓存服务，其实你可以把二者等同起来。</p>
<p>那么多的 NoSQL 软件，到底哪些更受欢迎呢？为此，开源中国社区为你评选出10款2010年最受关注的 NoSQL 软件。</p>
<p><strong>1. Cassandra</strong></p>
<p>Cassandra 在 2010 年出尽风头，但最终都以失败告终，包括 Twitter 以及 Digg 的案例使我们不得不对 NoSQL 技术是否成熟，是否能在大规模系统中应用产生了怀疑。但这并不影响 Cassandra 拔得头筹，因为还有 Facebook 的支持。</p>
<p>Apache Cassandra 是一套开源分布式Key-Value存储系统。它最初由Facebook开发，用于储存特别大的数据。Facebook目前在使用此系统。</p>
<p>主要特性：</p>
<p>分布式</p>
<p>基于column的结构化</p>
<p>高伸展性</p>
<p>Cassandra 采用 Java 开发，Apache 授权协议。</p>
<p><strong>2. memcached</strong></p>
<p>memcached 是老牌的独立缓存服务的领头羊，目前国内使用该系统的网站非常的多，在这基础上还有国内开发的 memcachedb 是 memcached 支持持久化存储。</p>
<p>memcached 是一套分布式的快取系统，当初是Danga Interactive为了LiveJournal所发展的，但目前被许多软件（如MediaWiki）所使用。不过，memcached 缺乏认证以及安全管制</p>
<p>memcached 采用 C 语言开发，可在 Linux 系统下使用，采用 BSD 授权。</p>
<p><strong>3. Membase</strong></p>
<p>Membase 是 NoSQL 家族的一个新的重量级的成员，其完全兼容 memcached 的方式，有望笼络 memcached 的用户群。Membase 的可伸缩性、集群、复制以及管理方便等特性又是 memcached 无法匹敌的。</p>
<p style="TEXT-ALIGN: center"><img style="CURSOR: pointer" onclick="window.open('http://articles.csdn.net/uploads/allimg/101231/79_101231092757_1.png')" border=0 alt="" src="http://articles.csdn.net/uploads/allimg/101231/79_101231092757_1.png" width=400 height=338></p>
<p style="TEXT-ALIGN: left">Membase 同样采用 C 语言开发，支持 Windows 和 Linux 系统，使用 Apache 授权协议。</p>
<p>接下来介绍两款国产的 NoSQL 软件：</p>
<p><strong>4. Tair</strong></p>
<p>Tair 是由淘宝网自主开发的分布式Key/Value结构数据存储系统，在淘宝网有着大规模的应用。您在登录淘宝、查看商品详情页面或者在淘江湖和好友&#8220;捣浆糊&#8221;的时候，都在直接或间接地和Tair交互。</p>
<p style="TEXT-ALIGN: center"><img style="CURSOR: pointer" onclick="window.open('http://articles.csdn.net/uploads/allimg/101231/79_101231092813_1.jpg')" border=0 alt="" src="http://articles.csdn.net/uploads/allimg/101231/79_101231092813_1.jpg" width=554 height=284></p>
<p style="TEXT-ALIGN: left">Tair 采用 C 语言开发，支持 Linux 系统，使用 GPLv2 授权协议。</p>
<p><strong>5. BeansDB</strong></p>
<p>BeansDB 是豆瓣网开发的一个主要针对大数据量、高可用性的分布式Key Value存储系统，采用HashTree和简化的版本号来快速同步保证最终一致性（弱），一个简化版的 Dynamo。</p>
<p>它采用类似memcached的去中心化结构，在客户端实现数据路由。目前只提供了 Python版本的客户端，其它语言的客户端可以由memcached的客户端稍加改造得到。</p>
<p>主要特性包括：</p>
<p>高可用：通过多个可读写的用于备份实现高可用；</p>
<p>最终一致性：通过哈希树实现快速完整数据同步（短时间内数据可能不一致）；</p>
<p>容易扩展：可以在不中断服务的情况下进行容量扩展；</p>
<p>高性能：异步IO和高性能的Key Value数据Tokyo Cabinet；</p>
<p>可配置的可用性和一致性：通过N,W,R进行配置；</p>
<p>简单协议：Memcached兼容协议，大量可用客户端。</p>
<p>BeansDB 采用 Python 语言开发，支持 Linux 系统，使用 BSD 授权协议。</p>
<p><strong>6. Redis</strong></p>
<p>Redis 是一个高性能的key-value数据库。 redis的 出现，很大程度补偿了memcached这类keyvalue存储的不足，在部分场合可以对关系数据库起到很好的补充作用。它提供了Python，Ruby，Erlang，PHP客户端，使用很方便。</p>
<p>Redis 的短板：</p>
<p>这个项目还很新，可能还不足够稳定，而且没有在实际的一些大型系统应用的实例。</p>
<p>缺乏mc中批量get也是比较大的问题，始终批量获取跟多次获取的网络开销是不一样的。</p>
<p>Redis 采用 C 语言开发，支持 Linux 系统，使用 BSD 授权协议。</p>
<p><strong>7. CouchDB </strong></p>
<p>Apache CouchDB 是一个面向文档的数据库管理系统。它提供以 JSON 作为数据格式的 REST 接口来对其进行操作，并可以通过视图来操纵文档的组织和呈现。 CouchDB 是 Apache 基金会的顶级开源项目。</p>
<p>CouchDB落实到最底层的数据结构就是两类B+Tree 。</p>
<p style="TEXT-ALIGN: center"><img style="CURSOR: pointer" onclick="window.open('http://articles.csdn.net/uploads/allimg/101231/79_101231092911_1.png')" border=0 alt="" src="http://articles.csdn.net/uploads/allimg/101231/79_101231092911_1.png" width=292 height=340></p>
<p style="TEXT-ALIGN: left">不过最近有消息说 CouchDB 将走一条不同于 NoSQL 的路子，具体情况如何我们只能拭目以待。</p>
<p>CouchDB 是用 ErLang 开发的哦，跨平台支持，Apache 授权协议。</p>
<p><strong>8. Tokyo Cabinet</strong></p>
<p style="TEXT-ALIGN: center"><img style="CURSOR: pointer" onclick="window.open('http://articles.csdn.net/uploads/allimg/101231/79_101231092925_1.png')" border=0 alt="" src="http://articles.csdn.net/uploads/allimg/101231/79_101231092925_1.png" width=300 height=110></p>
<p style="TEXT-ALIGN: left">Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列，既可以是二进制也可以是字符串。这里没有数据类型和数据表的概念。</p>
<p>当做为Hash表数据库使用时，每个key必须是不同的，因此无法存储两个key相同的值。提供了以下访问方法:提供key，value参数来存储，按 key删除记录，按key来读取记录，另外，遍历key也被支持，虽然顺序是任意的不能被保证。这些方法跟Unix标准的DBM,例如GDBM,NDBM 等等是相同的，但是比它们的性能要好得多（因此可以替代它们)</p>
<p>当按B+树来存储时，拥用相同key的记录也能被存储。像hash表一 样的读取，存储，删除函数也都有提供。记录按照用户提供的比较函数来存储。可以采用顺序或倒序的游标来读取每一条记录。依照这个原理，向前的字符串匹配搜 索和整数区间搜索也实现了。另外，B＋树的事务也是可用的。</p>
<p>Tokyo Cabinet 采用 C 语言开发，支持 Linux 系统，使用 LGPL 授权协议。</p>
<p><strong>9. OrientDB</strong></p>
<p>Orient DB 是一个可伸缩的文档数据库，支持 ACID 事务处理。使用 Java 5 实现。OrientDB 最强的一个地方是可以使用 类 SQL 的查询语句进行数据查询。</p>
<p>OrientDB 采用 Java 语言开发，跨平台支持，使用 Apache 授权协议。</p>
<p><strong>10. Hibari </strong></p>
<p>Hibari （在日语中意思为&#8220;云雀&#8221;）是一个专为高可靠性和大数据存储的数据库引擎，可用于云计算环境中，例如 webmail、SNS 和其他要求T/P级数据存储的环境中。Hibari 支持 Java, C/C++， Python, Ruby， 和 Erlang 语言的客户端。</p>
<p>Hibari 并不是一个关系数据库，主要是通过 key-value 的方法进行数据存储。</p>
<p>Hibari 使用 ErLang 语言开发，支持 Linux/BSD 系统，Apache 授权协议</p>
<p>本文转载自：http://www.oschina.net/news/14209/2010-top-10-nosql-projects</p>
</div>
<img src ="http://www.cnitblog.com/MartinYao/aggbug/72562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/MartinYao/" target="_blank">玄铁剑</a> 2010-12-31 16:45 <a href="http://www.cnitblog.com/MartinYao/articles/72562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sqlserver系统表说明</title><link>http://www.cnitblog.com/MartinYao/articles/46116.html</link><dc:creator>玄铁剑</dc:creator><author>玄铁剑</author><pubDate>Sun, 29 Jun 2008 05:01:00 GMT</pubDate><guid>http://www.cnitblog.com/MartinYao/articles/46116.html</guid><wfw:comment>http://www.cnitblog.com/MartinYao/comments/46116.html</wfw:comment><comments>http://www.cnitblog.com/MartinYao/articles/46116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/MartinYao/comments/commentRss/46116.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/MartinYao/services/trackbacks/46116.html</trackback:ping><description><![CDATA[sysaltfiles&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 主数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保存数据库的文件 <br>syscharsets&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 主数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;字符集与排序顺序 <br>sysconfigures&nbsp; &nbsp;&nbsp; 主数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;配置选项 <br>syscurconfigs&nbsp;&nbsp;&nbsp;&nbsp; 主数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当前配置选项 <br>sysdatabases&nbsp;&nbsp;&nbsp; 主数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;服务器中的数据库 <br>syslanguages&nbsp;&nbsp;&nbsp; 主数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语言 <br>syslogins&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;登陆帐号信息 <br>sysoledbusers&nbsp;&nbsp; 主数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;链接服务器登陆信息 <br>sysprocesses&nbsp;&nbsp;&nbsp; 主数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进程 <br>sysremotelogins 主数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;远程登录帐号 <br>syscolumns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;列 <br>sysconstrains&nbsp;&nbsp;&nbsp;&nbsp; 每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;限制 <br>sysfilegroups&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文件组 <br>sysfiles&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文件 <br>sysforeignkeys&nbsp; &nbsp;每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;外部关键字 <br>sysindexs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;索引 <br>sysmenbers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;角色成员 <br>sysobjects&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有数据库对象 <br>syspermissions&nbsp;每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;权限 <br>systypes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户定义数据类型 <br>sysusers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个数据库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户
<img src ="http://www.cnitblog.com/MartinYao/aggbug/46116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/MartinYao/" target="_blank">玄铁剑</a> 2008-06-29 13:01 <a href="http://www.cnitblog.com/MartinYao/articles/46116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>索引性能分析</title><link>http://www.cnitblog.com/MartinYao/articles/46115.html</link><dc:creator>玄铁剑</dc:creator><author>玄铁剑</author><pubDate>Sun, 29 Jun 2008 04:56:00 GMT</pubDate><guid>http://www.cnitblog.com/MartinYao/articles/46115.html</guid><wfw:comment>http://www.cnitblog.com/MartinYao/comments/46115.html</wfw:comment><comments>http://www.cnitblog.com/MartinYao/articles/46115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/MartinYao/comments/commentRss/46115.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/MartinYao/services/trackbacks/46115.html</trackback:ping><description><![CDATA[<p>聚集索引 , 表中存储的数据按照索引的顺序存储 , 检索效率比普通索引高 , 但对数据新增 / 修改 / 删除的影响比较大 </p>
<p>非聚集索引 , 不影响表中的数据存储顺序 , 检索效率比聚集索引低 , 对数据新增 / 修改 / 删除的影响很小 </p>
<p>如何让你的 SQL 运行得更快 <br>---- 人们在使用 SQL 时往往会陷入一个误区，即太关注于所得的结果是否正确，而忽略 <br>了不同的实现方法之间可能存在的性能差异，这种性能差异在大型的或是复杂的数据库 <br>环境中（如联机事务处理 OLTP 或决策支持系统 DSS ）中表现得尤为明显。笔者在工作实践 <br>中发现，不良的 SQL 往往来自于不恰当的索引设计、不充份的连接条件和不可优化的 whe<br>re 子句。在对它们进行适当的优化后，其运行速度有了明显地提高！下面我将从这三个 <br>方面分别进行总结： <br>---- 为了更直观地说明问题，所有实例中的 SQL 运行时间均经过测试，不超过１秒的均 <br>表示为（ &lt; 1 秒）。 <br>---- 测试环境 --<br>---- 主机： HP LH II<br>---- 主频： 330MHZ<br>---- 内存： 128 兆 <br>---- 操作系统： Operserver5.0.4<br>---- 数据库： Sybase11.0.3<br>一、不合理的索引设计 <br>---- 例：表 record 有 620000 行，试看在不同的索引下，下面几个 SQL 的运行情况： <br>---- 1. 在 date 上建有一非个群集索引 <br>select count(*) from record where date &gt;<br>'19991201' and date &lt; '19991214'and amount &gt;<br>2000 (25 秒 )<br>select date,sum(amount) from record group by date<br>(55 秒 )<br>select count(*) from record where date &gt;<br>'19990901' and place in ('BJ','SH') (27 秒 )<br>---- 分析： <br>----date 上有大量的重复值，在非群集索引下，数据在物理上随机存放在数据页上，在 <br>范围查找时，必须执行一次表扫描才能找到这一范围内的全部行。 <br>---- 2. 在 date 上的一个群集索引 <br>select count(*) from record where date &gt;<br>'19991201' and date &lt; '19991214' and amount &gt;<br>2000 （ 14 秒） <br>select date,sum(amount) from record group by date<br>（ 28 秒） <br>select count(*) from record where date &gt;<br>'19990901' and place in ('BJ','SH') （ 14 秒） <br>---- 分析： <br>---- 在群集索引下，数据在物理上按顺序在数据页上，重复值也排列在一起，因而在范 <br>围查找时，可以先找到这个范围的起末点，且只在这个范围内扫描数据页，避免了大范 <br>围扫描，提高了查询速度。 <br>---- 3. 在 place ， date ， amount 上的组合索引 <br>select count(*) from record where date &gt;<br>'19991201' and date &lt; '19991214' and amount &gt;<br>2000 （ 26 秒） <br>select date,sum(amount) from record group by date<br>（ 27 秒） <br>select count(*) from record where date &gt;<br>'19990901' and place in ('BJ', 'SH') （ &lt; 1 秒） <br>---- 分析： <br>---- 这是一个不很合理的组合索引，因为它的前导列是 place ，第一和第二条 SQL 没有引 <br>用 place ，因此也没有利用上索引；第三个 SQL 使用了 place ，且引用的所有列都包含在组 <br>合索引中，形成了索引覆盖，所以它的速度是非常快的。 <br>---- 4. 在 date ， place ， amount 上的组合索引 <br>select count(*) from record where date &gt;<br>'19991201' and date &lt; '19991214' and amount &gt;<br>2000(&lt; 1 秒 )<br>select date,sum(amount) from record group by date<br>（ 11 秒） <br>select count(*) from record where date &gt;<br>'19990901' and place in ('BJ','SH') （ &lt; 1 秒） <br>---- 分析： <br>---- 这是一个合理的组合索引。它将 date 作为前导列，使每个 SQL 都可以利用索引，并 <br>且在第一和第三个 SQL 中形成了索引覆盖，因而性能达到了最优。 <br>---- 5. 总结： <br>---- 缺省情况下建立的索引是非群集索引，但有时它并不是最佳的；合理的索引设计要 <br>建立在对各种查询的分析和预测上。一般来说： <br>---- ① . 有大量重复值、且经常有范围查询 <br>（ between, &gt;,&lt; ， &gt;=,&lt; = ）和 order by<br>、 group by 发生的列，可考虑建立群集索引； <br>---- ② . 经常同时存取多列，且每列都含有重复值可考虑建立组合索引； <br>---- ③ . 组合索引要尽量使关键查询形成索引覆盖，其前导列一定是使用最频繁的列。 </p>
<p>二、不充份的连接条件： <br>---- 例：表 card 有 7896 行，在 card_no 上有一个非聚集索引，表 account 有 191122 行，在 <br>account_no 上有一个非聚集索引，试看在不同的表连接条件下，两个 SQL 的执行情况： </p>
<p>select sum(a.amount) from account a,<br>card b where a.card_no = b.card_no （ 20 秒） <br>---- 将 SQL 改为： <br>select sum(a.amount) from account a,<br>card b where a.card_no = b.card_no and a.<br>account_no=b.account_no （ &lt; 1 秒） <br>---- 分析： <br>---- 在第一个连接条件下，最佳查询方案是将 account 作外层表， card 作内层表，利用 <br>card 上的索引，其 I/O 次数可由以下公式估算为： <br>---- 外层表 account 上的 22541 页 + （外层表 account 的 191122 行 * 内层表 card 上对应外层 <br>表第一行所要查找的 3 页） =595907 次 I/O<br>---- 在第二个连接条件下，最佳查询方案是将 card 作外层表， account 作内层表，利用 <br>account 上的索引，其 I/O 次数可由以下公式估算为： <br>---- 外层表 card 上的 1944 页 + （外层表 card 的 7896 行 * 内层表 account 上对应外层表每一 <br>行所要查找的 4 页） = 33528 次 I/O<br>---- 可见，只有充份的连接条件，真正的最佳方案才会被执行。 <br>---- 总结： <br>---- 1. 多表操作在被实际执行前，查询优化器会根据连接条件，列出几组可能的连接方 <br>案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的 <br>表；内外表的选择可由公式：外层表中的匹配行数 * 内层表中每一次查找的次数确定，乘 <br>积最小为最佳方案。 <br>---- 2. 查看执行方案的方法 -- 用 set showplanon ，打开 showplan 选项，就可以看到连 <br>接顺序、使用何种索引的信息；想看更详细的信息，需用 sa 角色执行 dbcc(3604,310,30<br>2) 。 <br>三、不可优化的 where 子句 <br>---- 1. 例：下列 SQL 条件语句中的列都建有恰当的索引，但执行速度却非常慢： <br>select * from record where<br>substring(card_no,1,4)='5378'(13 秒 )<br>select * from record where<br>amount/30&lt; 1000 （ 11 秒） <br>select * from record where<br>convert(char(10),date,112)='19991201' （ 10 秒） <br>---- 分析： <br>---- where 子句中对列的任何操作结果都是在 SQL 运行时逐列计算得到的，因此它不得不 <br>进行表搜索，而没有使用该列上面的索引；如果这些结果在查询编译时就能得到，那么 <br>就可以被 SQL 优化器优化，使用索引，避免表搜索，因此将 SQL 重写成下面这样： <br>select * from record where card_no like<br>'5378%' （ &lt; 1 秒） <br>select * from record where amount<br>&lt; 1000*30 （ &lt; 1 秒） <br>select * from record where date= '1999/12/01'<br>（ &lt; 1 秒） <br>---- 你会发现 SQL 明显快起来！ <br>---- 2. 例：表 stuff 有 200000 行， id_no 上有非群集索引，请看下面这个 SQL ： <br>select count(*) from stuff where id_no in('0','1')<br>（ 23 秒） <br>---- 分析： <br>---- where 条件中的 'in' 在逻辑上相当于 'or' ，所以语法分析器会将 in ('0','1') 转化 <br>为 id_no ='0' or id_no='1' 来执行。我们期望它会根据每个 or 子句分别查找，再将结果 <br>相加，这样可以利用 id_no 上的索引；但实际上（根据 showplan ） , 它却采用了 "OR 策略 "<br>，即先取出满足每个 or 子句的行，存入临时数据库的工作表中，再建立唯一索引以去掉 <br>重复行，最后从这个临时表中计算结果。因此，实际过程没有利用 id_no 上索引，并且完 <br>成时间还要受 tempdb 数据库性能的影响。 <br>---- 实践证明，表的行数越多，工作表的性能就越差，当 stuff 有 620000 行时，执行时 <br>间竟达到 220 秒！还不如将 or 子句分开： <br>select count(*) from stuff where id_no='0'<br>select count(*) from stuff where id_no='1'<br>---- 得到两个结果，再作一次加法合算。因为每句都使用了索引，执行时间只有 3 秒， <br>在 620000 行下，时间也只有 4 秒。或者，用更好的方法，写一个简单的存储过程： <br>create proc count_stuff as<br>declare @a int<br>declare @b int<br>declare @c int<br>declare @d char(10)<br>begin<br>select @a=count(*) from stuff where id_no='0'<br>select @b=count(*) from stuff where id_no='1'<br>end<br>select @c=@a+@b<br>select @d=convert(char(10),@c)<br>print @d<br>---- 直接算出结果，执行时间同上面一样快！ <br>---- 总结： <br>---- 可见，所谓优化即 where 子句利用了索引，不可优化即发生了表扫描或额外开销。 </p>
<p>---- 1. 任何对列的操作都将导致表扫描，它包括数据库函数、计算表达式等等，查询时 <br>要尽可能将操作移至等号右边。 <br>---- 2.in 、 or 子句常会使用工作表，使索引失效；如果不产生大量重复值，可以考虑把 <br>子句拆开；拆开的子句中应该包含索引。 <br>---- 3. 要善于使用存储过程，它使 SQL 变得更加灵活和高效。 <br>---- 从以上这些例子可以看出， SQL 优化的实质就是在结果正确的前提下，用优化器可 <br>以识别的语句，充份利用索引，减少表扫描的 I/O 次数，尽量避免表搜索的发生。其实 S<br>QL 的性能优化是一个复杂的过程，上述这些只是在应用层次的一种体现，深入研究还会 <br>涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计<br></p>
<img src ="http://www.cnitblog.com/MartinYao/aggbug/46115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/MartinYao/" target="_blank">玄铁剑</a> 2008-06-29 12:56 <a href="http://www.cnitblog.com/MartinYao/articles/46115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unicode DB</title><link>http://www.cnitblog.com/MartinYao/articles/28624.html</link><dc:creator>玄铁剑</dc:creator><author>玄铁剑</author><pubDate>Sun, 17 Jun 2007 05:23:00 GMT</pubDate><guid>http://www.cnitblog.com/MartinYao/articles/28624.html</guid><wfw:comment>http://www.cnitblog.com/MartinYao/comments/28624.html</wfw:comment><comments>http://www.cnitblog.com/MartinYao/articles/28624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/MartinYao/comments/commentRss/28624.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/MartinYao/services/trackbacks/28624.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 對於伺服器DB的定義可以使用Unicode方式，這樣可以和用戶端進行互動。DB要使用 nchar、nvarchar 和 ntext <br>類型來定義 Unicode 儲存體。使用時可以用Unicode 函數 UNICODE() 和 NCHAR() 取代使用 ASCII() 和 CHAR() 函數。<br>以 Unicode 定義預存程式和觸發程式的變數和參數。以字母 N 做為 Unicode 字元字串常數的前置詞。</p>
<p>例如：</p>
<p>CREATE TABLE tbl_Test<br>(<br>&nbsp;&nbsp; Home nchar(100)&nbsp; --對於字元使用nchar/nvarchar/ntext類型<br>)</p>
<p>--若沒有 N 前置詞，字串會被轉換為資料庫預設的字碼頁，這樣可能無法辨識某些字符<br>insert into Person.Info(home)<br>values(N'中華人民共和國') </p>
<p>insert into Person.Info(home)<br>values(N'中華人民共和國')&nbsp;&nbsp; --Notes裡顯示不了簡體的(這裡為簡體字)</p>
<p>另外，在Web Page上，傳送到伺服器的 Unicode 字元字串常數必須先加上大寫 N。在HTML 畫面的 META 屬性中指定CHARSET字碼。例如，如果 Unicode 編碼配置是 UTF-8，就指定 CHARSET = utf-8。在伺服器端上，請使用 Session.CodePage 屬性或 @Codepage 指示詞來指定用戶端的編碼配置。例如，codepage=65001 會指定 UTF-8 編碼配置。這樣Internet InformationServices (IIS) 5.0 或更新版本將順利的處理 UTF-8 和 UCS-2 之間的轉換，而不需要採取其他動作。<br></p>
<img src ="http://www.cnitblog.com/MartinYao/aggbug/28624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/MartinYao/" target="_blank">玄铁剑</a> 2007-06-17 13:23 <a href="http://www.cnitblog.com/MartinYao/articles/28624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多層次用料表查詢</title><link>http://www.cnitblog.com/MartinYao/articles/28625.html</link><dc:creator>玄铁剑</dc:creator><author>玄铁剑</author><pubDate>Sun, 17 Jun 2007 05:23:00 GMT</pubDate><guid>http://www.cnitblog.com/MartinYao/articles/28625.html</guid><wfw:comment>http://www.cnitblog.com/MartinYao/comments/28625.html</wfw:comment><comments>http://www.cnitblog.com/MartinYao/articles/28625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/MartinYao/comments/commentRss/28625.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/MartinYao/services/trackbacks/28625.html</trackback:ping><description><![CDATA[檢視父產品的多層次用料表清單<br>下列範例顯示用於建立特定父系產品的所有元件：ProductAssemblyID。<br>USE AdventureWorks;<br>GO<br>WITH Parts(AssemblyID, ComponentID, PerAssemblyQty, EndDate, ComponentLevel) AS<br>(<br>&nbsp;&nbsp;&nbsp; SELECT b.ProductAssemblyID, b.ComponentID, b.PerAssemblyQty,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.EndDate, 0 AS ComponentLevel<br>&nbsp;&nbsp;&nbsp; FROM Production.BillOfMaterials AS b<br>&nbsp;&nbsp;&nbsp; WHERE b.ProductAssemblyID = 800<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND b.EndDate IS NULL<br>&nbsp;&nbsp;&nbsp; UNION ALL<br>&nbsp;&nbsp;&nbsp; SELECT bom.ProductAssemblyID, bom.ComponentID, p.PerAssemblyQty,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bom.EndDate, ComponentLevel + 1<br>&nbsp;&nbsp;&nbsp; FROM Production.BillOfMaterials AS bom <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INNER JOIN Parts AS p<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON bom.ProductAssemblyID = p.ComponentID<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND bom.EndDate IS NULL<br>)<br>SELECT AssemblyID, ComponentID, Name, PerAssemblyQty, EndDate,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComponentLevel <br>FROM Parts AS p<br>&nbsp;&nbsp;&nbsp; INNER JOIN Production.Product AS pr<br>&nbsp;&nbsp;&nbsp; ON p.ComponentID = pr.ProductID<br>ORDER BY ComponentLevel, AssemblyID, ComponentID;<br>GO<br>
<img src ="http://www.cnitblog.com/MartinYao/aggbug/28625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/MartinYao/" target="_blank">玄铁剑</a> 2007-06-17 13:23 <a href="http://www.cnitblog.com/MartinYao/articles/28625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL2005较之SQL2000的改进</title><link>http://www.cnitblog.com/MartinYao/articles/24763.html</link><dc:creator>玄铁剑</dc:creator><author>玄铁剑</author><pubDate>Tue, 27 Mar 2007 06:35:00 GMT</pubDate><guid>http://www.cnitblog.com/MartinYao/articles/24763.html</guid><wfw:comment>http://www.cnitblog.com/MartinYao/comments/24763.html</wfw:comment><comments>http://www.cnitblog.com/MartinYao/articles/24763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/MartinYao/comments/commentRss/24763.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/MartinYao/services/trackbacks/24763.html</trackback:ping><description><![CDATA[
		<span class="t18"> 
<p>一、<a href="http://www.knowsky.com/sql.asp" snap_preview_added="no">数据库</a>设计方面<br />1、字段类型。<br />varchar(max)\nvarchar(max)类型的引入大大的提高了编程的效率，可以使用字符串函数对CLOB类型进行操作，这是一个亮点。但是这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据，是否会出现大规模的碎片？是否碎片会引发效率问题？这都是需要进一步探讨的东西。</p><p>varbinary(max)代替image也让SQL Server的字段类型更加简洁统一。</p><p>XML字段类型更好的解决了XML数据的操作。XQuery确实不错，但是个人对其没好感。（CSDN的开发者应该是相当的熟了！）</p><p>2、外键的级联更能扩展<br />可能大部分的同行在设计OLTP系统的时候都不愿意建立外键，都是通过程序来控制父子数据的完整性。但是再开发调试阶段和OLAP环境中，外键是可以建立的。新版本中加入了SET NULL 和 SET DEFAULT 属性，能够提供能好的级联设置。</p><p>3、索引附加字段<br />这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高，但是相对映射到数据表中效率还是提高了很多。我做过试验，在我的实验环境中会比映射到表中提高30%左右的效率。</p><p>4、计算字段的持久化<br />原来的计算字段其实和虚拟字段很像。只是管理方面好了而已，性能方面提高不多。但是SQL2005提供了计算字段的持久化，这就提高了查询的性能，但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。</p><p>5、分区表<br />分区表是个亮点！从分区表也能看出微软要做大作强SQL Server的信心。资料很多，这里不详细说。但是重点了解的是：现在的SQL Server2005的表，都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。<br />但是需要注意的一点，也是我使用过程中发现的一个问题。在建立function-&gt;schema-&gt;table后，如果在现有的分区表上建立没有显式声明的聚集索引时，分区表会自动变为非分区表。这一点很让我纳闷。如果你觉得我的非分区索引无法对起子分区，<br />你可以提醒我一下呀！没有任何的提醒，直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。</p><p>分区表效率问题肯定是大家关心的问题。在我的试验中，如果按照分区字段进行的查询（过滤）效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询，效率会低于未分区表的相同语句。但是随着数据量的增大，这种成本差距会逐渐减小，趋于相等。（500万数量级只相差10%左右）</p><p>6、CLR类型</p><p>微软对CLR作了大篇幅的宣传，这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜，感觉对象数据库的一些概念可以实现了。但是作了些试验，发现使用CLR的存储过程或函数在达到一定的阀值的时候，系统性能会呈指数级下滑！这是非常危险的！只使用几个可能没有问题，当一旦大规模使用会造成严重的系统性能问题！</p><p>其实可以做一下类比，Oracle等数据库产品老早就支持了java编程，而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程？！连Oracle自己的应用都不用为什么？！还不是性能有问题！否则面向对象的数据库早就实现了！</p><p>建议使用CLR的地方一般是和应用的复杂程度或<a href="http://www.knowsky.com/system.asp" snap_preview_added="no">操作系统</a>环境有很高的耦合度的场景。如你想构建复杂的算法，并且用到了大量的指针和高级数据模型。或者是要和操作系统进行Socket通讯的场景。否则建议慎重！</p><p>7、索引视图</p><p>索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。</p><p>8、语句和事务快照</p><p>语句级快照和事务级快照终于为SQL Server的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照，如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时，会杀人的！</p><p>9、数据库快照</p><p>原理很简单，对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜！</p><p>10、Mirror<br />Mirror可以算是SQL Server的Data guard了。但是能不能被大伙用起来就不知道了。</p><p>二、开发方面</p><p>1、Ranking函数集<br />其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史，而且SQL Server2005的row_number比Oracle的更先进。因为它把Order by集成到了一起，不用像Oracle那样还要用子查询进行封装。但是大家注意一点。如下面的例子：</p><p>select ROW_NUMBER() OVER (order by aa)<br />from tbl<br />order by bb</p><p>会先执行aa的排序，然后再进行bb的排序。</p><p>可能有的朋友会抱怨集成的order by，其实如果使用ranking函数,Order by是少不了的。如果担心Order by会影响效率，可以为order by的字段建立聚集索引，查询计划会忽略order by 操作（因为本来就是排序的嘛）。</p><p>2、top<br />可以动态传入参数，省却了动态SQL的拼写。</p><p>3、Apply<br />对递归类的树遍历很有帮助。</p><p>4、CTE<br />个人感觉这个真是太棒了！阅读清晰，非常有时代感。</p><p>5、try/catch<br />代替了原来VB式的错误判断。比Oracle高级不少。</p><p>6、pivot/unpivot<br />个人感觉没有case直观。而且默认的第三字段（还可能更多）作为group by字段很容易造成新手的错误。</p><p> </p><p>三、DBA管理方面</p><p>1、数据库级触发器<br />记得在最开始使用2k的时候就要用到这个功能，可惜2k没有，现在有了作解决方案的朋友会很高兴吧。</p><p>2、多加的系统视图和实时系统信息</p><p>这些东西对DBA挑优非常有帮助，但是感觉粒度还是不太细。</p><p>3、优化器的改进<br />一直以来个人感觉SQL Server的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。（有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。）<br />论坛例子：<br /><a href="http://community.csdn.net/Expert/topic/4543/4543718.xml?temp=.405987" snap_preview_added="spa" snap_icon_added="spa" act_suffix="" icon_trigger="false" text_trigger="true" parent_link_icon="false">http://community.csdn.net/Expert/topic/4543/4543718.xml?temp=.405987</a></p><p>4、profiler的新事件观察<br />这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。</p><p>5、sqlcmd</p><p>习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQL Server Management Studio的朋友使用。</p><p>四、遗憾</p><p>1、登陆的控制<br />始终遗憾SQL Server的登陆无法分配CPU/内存占用等指标数。如果你的SQL Server给别人分配了一个只可以读几个表的权限，而这个家伙疯狂的死循环进行连接查询，会给你的系统带来很大的负担。而SQL Server如果能像Oracle一样可以为登陆分配如：5%的cpu，10%的内存。就可以解决这个漏洞。</p><p>2、数据库物理框架没有变动<br />undo和redo都放在数据库得transaction中，个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库，可能能在一定程度上避免I/O效率问题。但是同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中，就能感觉到目前架构的尴尬。</p><p>3、还是没有逻辑备份<br />备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。</p><p>4、SSIS(DTS)太复杂了</p><p>SQL Server的异构移植功能个人感觉最好了。（如果对比过SQL Server的链接服务器和Oracle的透明网关的朋友会发现SQL Server的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。）<br />以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多，但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了，往往会有很多用户不会用了。</p></span>
<img src ="http://www.cnitblog.com/MartinYao/aggbug/24763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/MartinYao/" target="_blank">玄铁剑</a> 2007-03-27 14:35 <a href="http://www.cnitblog.com/MartinYao/articles/24763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>