1 char 和 varchar
固定长度 (char) 或可变长度 (varchar) 字符数据类型。char[(n)]长度为 n 个字节的固定长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为 n 个字节。varchar[(n)]长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。
2 可以利用索引快速访问数据库表中的特定信息。索引是对数据库表中一个或多个列(例如,employee 表的姓氏 (lname) 列)的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。索引提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针。数据库使用索引的方式与使用书的目录很相似:通过搜索索引找到特定的值,然后跟随指针到达包含该值的行。在数据库关系图中,可以为选定的表创建、编辑或删除索引/键属性页中的每个索引类型。当保存附加在此索引上的表或包含此表的数据库关系图时,索引同时被保存。有关详细信息,请参见创建索引。通常情况下,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引将占用磁盘空间,并且降低添加、删除和更新行的速度。不过在多数情况下,索引所带来的数据检索速度的优势大大超过它的不足之处。然而,如果应用程序非常频繁地更新数据,或磁盘空间有限,那么最好限制索引的数量。在创建索引前,必须确定要使用的列和要创建的索引类型。

解决方案 »

  1.   

    设计索引
    当 SQL Server执行查询时,查询优化器会对可用的数据检索方法的成本进行评估,从中选用最有效的方法。SQL Server 可以扫描表,如果索引存在则使用索引。当 SQL Server 执行表扫描时,它从表的第一行开始逐行查找,将符合查询条件的行提取出来。当 SQL Server 使用索引时,它会查找查询所需的行的存储位置,并只提取出所需的行。在考虑是否为一个列创建索引时,应考虑被索引的列是否以及如何用于查询中。索引对下列查询很有帮助: 搜索符合特定搜索关键字值的行(精确匹配查询)。精确匹配比较是指查询使用 WHERE 语句指定具有给定值的列条目。例如: 
    WHERE emp_id = 'VPA30890F'搜索其搜索关键字值为范围值的行(范围查询)。范围查询是指查询指定其值介于两个值之间的任何条目。例如: 
    WHERE job_lvl BETWEEN 9 and 12或WHERE job_lvl >= 9 and job_lvl <= 12在表 T1 中搜索根据联接谓词与表 T2 中的某个行匹配的行(索引嵌套循环联接)。
    在不进行显式排序操作的情况下产生经排序的查询输出,尤其是经排序的动态游标。
    在不进行显式排序操作的情况下,按一种有序的顺序对行进行扫描,以允许基于顺序的操作,如合并联接和流聚合。
    以优于表扫描的性能对表中所有的行进行扫描,性能提高是由于减少了要扫描的列集和数据总量(该查询有覆盖索引可供使用)。
    搜索插入和更新操作中重复的新搜索关键字值,以实施 PRIMARY KEY 和 UNIQUE 约束。
    搜索已定义了 FOREIGN KEY 约束的两个表之间匹配的行。 
    使用 LIKE 比较进行查询时,如果模式以特定字符串如"abc%"开头,使用索引则会提高效率;如果模式以通配符如"%xyz"开头,则索引不起作用。在很多查询中,索引可以带来多方面的好处。例如,索引除了可以覆盖查询外,还使得可以进行范围查询。SQL Server 可以在同一个查询中为一个表使用多个索引,并可以合并多个索引(使用联接算法),以便搜索关键字共同覆盖一个查询。另外,SQL Server 会自动确定利用哪些索引进行查询,并且能够在表被改动时确保该表的所有索引都得到维护。其它索引设计准则
    设计索引时还要考虑的其它准则包括: 一个表如果建有大量索引会影响 INSERT、UPDATE 和 DELETE 语句的性能,因为在表中的数据更改时,所有索引都须进行适当的调整。另一方面,对于不需要修改数据的查询(SELECT 语句),大量索引有助于提高性能,因为 SQL Server 有更多的索引可供选择,以便确定以最快速度访问数据的最佳方法。
    覆盖的查询可以提高性能。覆盖的查询是指查询中所有指定的列都包含在同一个索引中。例如,如果在一个表的 a、b 和 c 列上创建了组合索引,则从该表中检索 a 和 b 列的查询被视为覆盖的查询。创建覆盖一个查询的索引可以提高性能,因为该查询的所有数据都包含在索引自身当中;检索数据时只需引用表的索引页,不必引用数据页,因而减少了 I/O 总量。尽管给索引添加列以覆盖查询可以提高性能,但在索引中额外维护更多的列会产生更新和存储成本。
    对小型表进行索引可能不会产生优化效果,因为 SQL Server 在遍历索引以搜索数据时,花费的时间可能会比简单的表扫描还长。
    应使用 SQL 事件探查器和索引优化向导帮助分析查询,确定要创建的索引。为数据库及其工作负荷选择正确的索引是非常复杂的,需要在查询速度和更新成本之间取得平衡。窄索引(搜索关键字中只有很少的列的索引)需要的磁盘空间和维护开销都更少。而另一方面,宽索引可以覆盖更多的查询。确定正确的索引集没有简便的规则。经验丰富的数据库管理员常常能够设计出很好的索引集,但是,即使对于不特别复杂的数据库和工作负荷来说,这项任务也十分复杂、费时和易于出错。可以使用索引优化向导使这项任务自动化。有关更多信息,请参见索引优化向导。 
      

  2.   

    1、char得速度比nvarchar要快
    就像你写程序得时候,搜索文件,如果不知道位置你必须从头搜索
    但是如果知道位置,你可以算出来
    过去得数据库是没有nvarchar得
    sql可能后来进行了算法得改进
    两个区别不大
    不过用c得还是比较喜欢用char得2、虽然搜索速度快了
    但是在插入、更新、删除得时候
    他还要对索引进行计算
      

  3.   

    http://expert.csdn.net/Expert/topic/2425/2425091.xml?temp=.3195459
    http://expert.csdn.net/Expert/topic/2501/2501147.xml?http://expert.csdn.net/Expert/topic/2445/2445235.xml?temp=.5432398
    http://expert.csdn.net/Expert/topic/2273/2273963.xml?temp=.9493677
    http://expert.csdn.net/Expert/topic/2020/2020888.xml?temp=.489834
    http://expert.csdn.net/Expert/topic/2028/2028886.xml?temp=.8783838这些文章不错,讲优化的
      

  4.   

    多謝兩位的指點﹐特別是"程序員"的對索引的詳細解說﹐讓我對它了解多了﹐但對于char和varchar目前我則還不清楚﹐數據類型的區別我是知道﹐不過使用時對效率有否影響我則不知道﹐ adinna(想写程序)說char比nvarchar(應該是varchar吧)快﹐只是我不明白它為什么快﹐而"就像你写程序得时候,搜索文件,如果不知道位置你必须从头搜索"這句話我也沒搞懂,后面加了空格又怎么跟位置有關系呢﹖
    水平有限﹐太多不明白﹐望能得到更深入指教﹐謝謝