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)、提高硬件环境。
SQL 常识的更多相关文章
- sql常识- UNIQUE
SQL UNIQUE 约束 UNIQUE 约束唯一标识数据库表中的每条记录. UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证. PRIMARY KEY 拥有自动定义的 ...
- sql常识-FULL JOIN
SQL FULL JOIN 关键字 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行. FULL JOIN 关键字语法 SELECT column_name(s) FROM table_n ...
- sql常识-LEFT JOIN
SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键 ...
- sql常识-INNER JOIN
SQL INNER JOIN 关键字 在表中存在至少一个匹配时,INNER JOIN 关键字返回行. INNER JOIN 关键字语法 SELECT column_name(s) FROM table ...
- sql常识-Join
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表 ...
- sql常识-Alias
SQL Alias 表的 SQL Alias 语法 SELECT column_name(s) FROM table_name AS alias_name 列的 SQL Alias 语法 SELECT ...
- sql常识-BETWEEN 操作符
BETWEEN 操作符 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围.这些值可以是数值.文本或者日期. SQL BETWEEN 语法 SELECT column_name(s ...
- sql常识-IN 操作符
IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值. SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name ...
- sql常识-SQL 通配符
在搜索数据库中的数据时,您可以使用 SQL 通配符. SQL 通配符 在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符. SQL 通配符必须与 LIKE 运算符一起使用. 在 SQL 中, ...
随机推荐
- SSIS Data Flow 的 Execution Tree 和 Data Pipeline
一,Execution Tree 执行树是数据流组件(转换和适配器)基于同步关系所建立的逻辑分组,每一个分组都是一个执行树的开始和结束,也可以将执行树理解为一个缓冲区的开始和结束,即缓冲区的整个生命周 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销
上次实现了用户注册,这次来实现用户登录,用到IAuthenticationManager的SignOut.SignIn方法和基于声明的标识.最后修改用户注册代码实现注册成功后直接登录. 目录: ASP ...
- Binary XML file line #2: Error inflating
06-27 14:29:27.600: E/AndroidRuntime(6936): FATAL EXCEPTION: main 06-27 14:29:27.600: E/AndroidRunti ...
- 清除页面广告?身为前端,自己做一款简易的chrome扩展吧
大家肯定有这样的经历,浏览网页的时候,左右两端广告,诸如“屠龙宝刀,点击就送”,以及最近火的不行的林子聪37传奇霸业什么“霸业面具,霸业吊坠”的魔性广告总是充斥我们的眼球. 当然有现成的扩展程序或者插 ...
- 窥探Swift之类的继承与类的访问权限
上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过 ...
- 修改USB固件库的Customer_HID例程
我用的是神州三号开发板子,板子的USB模块原理图为: 配置端口G的11号引脚为usb的使能引脚,按理来说应该是开漏输出的(看了很多的修改代码都是这个模式),不过就是不能使能usb,只能配置成推挽的才行 ...
- 设置SharePoint Server 2013 的匿名访问
默认情况下,SharePoint Server 2013 是关闭匿名访问的,但是某些环境下我们又需要将这个匿名访问对全员开放,怎么操作更加安全与便捷,对于一个崭新的环境我们可以这样操作. 首先在当前需 ...
- CSS3中惊艳的gradient
以前曾经记录过linear-gradient(线性渐变)和 radial-gradient(径向渐变)的语法. 可以参考<CSS3中border-radius.box-shadow与gradie ...
- C/C++:提升_指针的指针和指针的引用
C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.
- (四)WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行 ...