zoukankan      html  css  js  c++  java
  • SQL 常识

    1、varchar 与 nvarchar 的区别?

    varchar(n):长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。nvarchar(n):包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。

    通俗的说:一般如果包含中文或者其它特殊字符,我就会使用n开头的类型,否则的话直接使用var开头的。

    顺便介绍下Unicode字符:Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。

    附表:

    char(n)

    定长

    索引效率高 程序里面使用trim去除多余的空白

     n 的值必须介于1 和 8,000 之间,存储大小为 n 个字节

    nchar(n)

    定长

    处理Unicode数据类型(所有的字符使用两个字节表示)

    n 的值必须介于 1 与 4,000 之间,存储大小为 n 字节的两倍

    varchar(n)

    变长

    效率没char高 但灵活

    n 的值必须介于 1 和 8,000 之间,存储大小为输入数据的字节的实际长度,而不是   n 个字节

    nvarchar(n)

    变长

    处理Unicode数据类型(所有的字符使用两个字节表示)

    n 的值必须介于 1与 4,000 之间,字节的存储大小是所输入字符个数的两倍,所输入的数据字符长度可以为零

    text

    变长

     

     

    ntext

    变长

    处理Unicode数据类型(所有的字符使用两个字节表示)

     

    针对上表所属类型我做一个简单的分析:

    char:储定长数据很方便,char字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim()。

    varchar:存储变长数据,但存储效率没有char高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为varchar (10)是最合算的。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

    概括一下就是:

    char,nchar定长,速度快,占空间大,需处理

    varchar,nvarchar,text不定长,空间小,速度慢,无需处理

    nchar、nvarchar、ntext处理Unicode码

    2、 数据库索引

    要点:索引关键目的是为了加快检索速度而建立的,所以,怎么用索引是数据库系统本身的事情,作为数据库设计或使用者,设计并创建好索引然后体验加上索引后的查询变快的感觉就行了。所以,索引怎么用就变为了“怎么创建合适的索引”。

    是什么:索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构中,使 SQL Server 可以快速有效地查找与键值关联的行。

    索引的分类:

    聚集索引:将表中记录在物理数据页中的位置按索引字段值重新排序,再将重排后的结果写会到磁盘上,每个表只能有一个聚集索引。

    非聚集索引:与表中数据行的实际存储结构无关,不会改变数据表中记录的实际存储顺序,每个表都可以有多个非聚集索引;

    唯一索引:要求创建索引的关键字段值在表中不能有重复值。

    复合索引:对表创建的索引是基于多个字段对表中的记录排序的。

    作用:与 书中的索引一样,数据库中的索引使您可以快速找到表或索引视图中的特定信息。索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的 指针。通过创建设计良好的索引以支持查询,可以显著提高数据库查询和应用程序的性能。索引可以减少为返回查询结果集而必须读取的数据量。索引还可以强制表 中的行具有唯一性,从而确保表数据的数据完整性。

    设计良好的索引可以减少磁盘 I/O 操作,并且消耗的系统资源也较少,从而可以提高查询性能。对于包含 SELECT、UPDATE、DELETE 或 MERGE 语句的各种查询,索引会很有用。

    怎么用:怎么用索引是数据库系统本身的事情,作为数据库设计或使用者,设计并创建好索引,然后体验加上索引后的查询变快的感觉就行了。所以,索引怎么用就变为了“怎么创建合适的索引”。

    创建索引的原则:

    (1)、在经常用来检索的列上创建索引(比如经常在where语句中出现的列);

    (2)、在表的主键、或外键上创建索引;

    (3)、不在数据类型为text、ntext或image的列上创建索引;

    (4)、只有较少行数的表没有必要创建索引。

    (5)、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

    (6)、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

    总结归纳索引的优点:

    (1)、创建唯一性索引,保证数据库表中每一行数据的唯一性;

    (2)、大大加快数据的检索速度,这也是创建索引的最主要的原因;

    (3)、加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义;

    (4)、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间;

    (5)、通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。

    二)、建立方向索引的不利因素(缺点)
    也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点,但是,为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。

    第一,   创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
    第二,   索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
    第三,   当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    3、如何进行数据库优化?

    如何让你的数据库运行的更快,达到最好的性能效果,从多方面入手,比如:字段类型的定位、使用存储过程、建立索引、关键字的使用等等。概要归结如下:

    (1)、使用where子句过滤,而少使用或不使用having;

    (2)、使用表连接而不是多个表查询;

    (3)、少建立触发器,多使用存储过程;

    (4)、字段类型定位,建立索引;

    (5)、使用union all 而不是 union;

    (6)、使用exists而不是in、distinct;

    (7)、提高硬件环境。

  • 相关阅读:
    Encryption (hard) CodeForces
    cf 1163D Mysterious Code (字符串, dp)
    AC日记——大整数的因子 openjudge 1.6 13
    AC日记——计算2的N次方 openjudge 1.6 12
    Ac日记——大整数减法 openjudge 1.6 11
    AC日记——大整数加法 openjudge 1.6 10
    AC日记——组合数问题 落谷 P2822 noip2016day2T1
    AC日记——向量点积计算 openjudge 1.6 09
    AC日记——石头剪刀布 openjudge 1.6 08
    AC日记——有趣的跳跃 openjudge 1.6 07
  • 原文地址:https://www.cnblogs.com/albert-struggle/p/4467777.html
Copyright © 2011-2022 走看看