SQL 常识

一、varchar 与 nvarchar 的区别?数据库

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

通俗的说:通常若是包含中文或者其它特殊字符,我就会使用n开头的类型,不然的话直接使用var开头的。性能

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

附表:spa

char(n)设计

定长指针

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

 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码

二、 数据库索引

要点:索引关键目的是为了加快检索速度而创建的,因此,怎么用索引是数据库系统自己的事情,做为数据库设计或使用者,设计并建立好索引而后体验加上索引后的查询变快的感受就好了。因此,索引怎么用就变为了“怎么建立合适的索引”。

是什么:索引是与表或视图关联的磁盘上结构,能够加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构中,使 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)、提升硬件环境。

相关文章
相关标签/搜索