数据库相关
- 表变量和临时表
1. 声明
表变量(@, @@)
- DECLARE @a TABLE (id INT, NAME NVARCHAR) INSERT INTO @a( id, [NAME])VALUES(1,'abc') SELECT * FROM @a
临时表(#,##)
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY) INSERT INTO #MyTempTable VALUES (1)
2. 表变量: 表变量存储在内存中,所以数据量超过阈值会将内存耗尽,耗尽后使用tempDB,占用硬盘空间,增加内存的调入调出,反而降低速度。
3. 临时表: 临时表存储在tempdb,会造成I/O读写,需要生成日志保持一致性,还有锁机制,可以创建索引,主键,外键,添加限制,约束。
4. 临时表 vs. 表变量
1).存储位置:临时表是利用了硬盘(tempdb数据库) ,表名变量是占用内存,因此小数据量当然是内存中的表变量更快。当大数据量时,就不能用表变量了,太耗内存了。大数据量时适合用临时表。
2).性能:不能一概而论,表变量存储数据有个性能临界点,在这个临界点之内,表变量比临时表快,表变量是存储在内存中的。
3).索引:表变量不支持索引和统计数据,但可以有主键;临时表则可以支持索引和统计数据。
总结: 我们对于较小的临时计算用数据集考虑使用表变量。如果数据集比较大,如果在代码中用于临时计算,同时这种临时使用永远都是简单的全数据集扫描而不需要考虑什么优化,比如说没有分组或分组很少的聚合(比如说COUNT、SUM、AVERAGE、MAX等),也可以考虑使用表变量。使用表变量另外一个考虑因素是应用环境的内存压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。一般对于大的数据集我们最好使用临时表,同时创建索引。
- 三范式
- 数据库优化
- 数据库结构设计(索引,存储过程,表变量 临时变量,视图)
- 应用程序设计结构(ORM, 三层架构等)
- 数据库SQL语句
- 服务器的内存分配(数据库的数据缓冲区,日志缓冲区,共享池的分配等)
- 数据库的I/O分配,做到良好的I/O的负载均衡
- 事务
- 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行。
- 一致性:事务结束的时候,所有的内部数据都是正确的。
- 隔离性:并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个事务处理之前或之后的数据。
- 持久性:事务提交之后,数据是永久性的,不可再回滚。
- 存储过程
- 存储过程允许标准组件式编程:可以不改变代码,只更改数据库存储过程,增强数据库的可移植性
- 存储过程能够实现较快的执行速度:存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。
- 存储过程减轻网络流量:只需要一个执行存储过程,而不需要大量的sql语句
- 存储过程可被作为一种安全机制来充分利用:系统管理员可以对执行的某一个存储过程进行权限限制。
- 安全性
- 聚簇索引和非聚簇索引
- 聚簇索引只有一个,与物理顺序一致;非聚簇索引可以有很多
- 聚簇索引 是和数据存在一起的,非聚簇索引 是单独保存的 也就是和数据是分开的。因此 要多一步维护索引数据的操作。多一步IO操作。
- 从理论上来说,聚集索引会耗时,因为要做物理排序,特别当你插入一个在排序顺序上最小的值时,整个表都要往下移动。非聚集索引只有一个定位符,所以影响不大
链接
临时表和表变量:http://www.cnblogs.com/freshman0216/archive/2010/11/14/1868672.html
聚簇索引和非聚簇索引:http://www.cnblogs.com/wuxiaoqian726/articles/2016095.html
事务,锁:http://www.cnblogs.com/knowledgesea/p/3714417.html
存储过程:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html

浙公网安备 33010602011771号