博文

主题:SQL 字符串和时间的转换(2013-05-21 15:48:00)

摘要: 1、字符串转时间 select cast('1982-12-31' as datetime) 结果 :1982-12-31 00:00:00.000
2 、时间转字符串 select convert(varchar,getdate(),108) 结果: 10:23:27 select convert(varchar,getdate(),112) 结果:20080512 ......

阅读全文(1560) | 评论:3

char、varchar、nchar、nvarchar的区别(2013-02-10 09:57:00)

摘要: 对于程序中的string型字段,SQLServer中有char、varchar、nchar、nvarchar四种类型来对应(暂时不考虑text和ntext),开建立数据库中,对这四种类型往往比较模糊,这里做一下对比。 定长或变长
所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;有var前缀的,表示是实际存储空间是变长的,比如varchar,nvarchar变长字符数据则不会以空格填充,比较例外的是,text存储的也是可变长。 Unicode或非Unicode
数据库中,英文字符只需要一个字节存储就足够了,但汉字和其他众多非英文字符,则需要两个字节存储。如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。而前缀n就表示Unicode字符,比如nchar,nvarchar,这两种类型使用了Unicode字符集。 基于以上两点来看看字段容量
char,varchar 最多8000个英文,4000个汉字 nchar,nvarchar 可存储4000个字符,无论英文还是汉字 使用(个人偏好)
如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么char
能确定长度又不一定是ansi字符或者,那么用nchar;
对于超大数据,如文章内容,使用nText
其他的通用nvarchar char、varchar、nchar、nvarchar特点比较 CHAR
CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据......

阅读全文(1870) | 评论:0

[SQL SERVER][Performance]bcp vs BulkInse(2013-01-26 14:13:00)

摘要:在工作上如遇到大量匯入資料的需求,我常會建議客戶使用SSIS來處理, 但有些客戶偏偏就不喜歡使用SSIS(應該是懶的去熟悉新東西...XD), anyway~SQL Server中,有bcp、BulkInsert 和OPENROWSET(BULK...) Statement這三種方法都支援平行匯入資料, 但人多時,往往就會有不同的聲音出現,一票人認為bcp比BulkInsert還快, 另一票人則認為BulkInsert比bcp快,我為了在command line和 tsql兩者之間取一, 便做了兩者匯入效能測試比較,結果!出乎我意料……
我先使用bcp匯出15萬筆資料,等等使用該資料來測試匯入效能(檔案編碼建議使用UTF-8)
bcp "select top 150000 ';'+case_chop from table"
queryout d:\srcdata.txt -c -U<loginid> -P<password> -S<server\instance>
建立目地資料表

create table mydata
(
serial int identity(1,1),
name varchar(50)
)












開始匯入資料(tsql)
declare @starttime time(7),
@endtime time(7),
@elaspedtime numeric(20,7);
set @starttime=getdate();
BULK INSERT mydata ......

阅读全文(2474) | 评论:2

SQL Server 优化性能的几个方面(2013-01-26 14:13:00)

摘要: (一).数据库的设计    可以参看最近论坛上出现一个精华帖http://topic.csdn.net/u/20100415/10/a377d835-acbd-4815-8bcb-b367f88ac8b5.html?92227
   数据库设计包含物理设计和逻辑设计:
   物理设计上可以通过使用RAID硬件架构。
   简单说下使用策略:
a.RAID0可以用在只读的数据库数据表,或者是经过复制过来的数据库上,如果你对数据丢失不敏感的话也可以使用,总之这个level下是高性能无冗余;
b.RAID 5 与RAID1 不同之处就是多了奇偶校验,所有的奇偶校验的信息会遍布各个磁盘,性能上要比RAID1高些,但是一旦发生磁盘I/O失败,就会造成性能急剧下降,同时这种方法也在RAID0 与RAID1间折了中,是比较通用的做法。
c.RAID 10 就是RAID0 与 RAID1的组合,它提供了高性能,高可用性,性能上要比RAID5好,特别适合大量写入的应用程序,但是就是成本比较高无论是多少块磁盘你都是将损失一半的磁盘存储   逻辑设计上可以通过使用数据库的一些组件比如表、约束等,在这里首先提下文件组的使用。当你经费不足,无法购买一个完整的RAID系统的时候,你可以考虑文件组。
  文件和文件组体系结构一些小节:http://blog.csdn.net/feixianxxx/archive/2010/01/28/5267290.aspx
  它的原理就是多硬盘同时读取,减少磁盘空间争夺,提高读取效率。
我在这再稍微说几点: a.范式和数据表的分割和合并
  我们在设计数据库的时候一般会追求规范,一般会至少达到3NF.在这之后,也许会因为表中某些经常用于存储查询的字段而把它们从表中分割,否则大量用户同时大量访问一个热门表,效率会变差。   当然有时候也会进行合并表的设计,这样可以用少量的冗余换来减少过多连接的运算。......

阅读全文(1484) | 评论:0

触发器1_概念(2013-01-26 11:12:00)

摘要: 触发器的特征:
1、触发器是在对表进行增、删、改时,自动执行的存储过程。触发器常用于强制业务规则,它是一种高级约束,通过事件进行触发而被执行。

2、触发器是一个特殊的事务单元,可以引用其他表中的列执行特殊的业务规则或数据逻辑关系。当出现错误时,可以执行rollback transaction操作将整个触发器以及触发它的T-SQL语句一并回滚(不需显示声明begin transaction)。
3、每个触发器将用到的两个临时表:    deleted 临时表:用于临时存放被删除的记录行副本(包括delete和update语句所影响的数据行);
                  注意:被删除的记录行,首先从原始表中删除,并保存到触发器表。然后从触发器表中删除,再保存到deleted表。

   inserted临时表:用于临时存放插入的记录行副本(包括insert和update语句所影响的数据行);

   deleted表和inserted表的特征:
   > 这两个表的表结构与该触发器作用的表相同;
   > 这两个表是逻辑表,并且由系统管理;
   > 这两个表是动态驻留在内存中的(不是存储在数据库中),当触发器工作完成后,它们也被删除;
   > 这两个表是只读的,即只能运用select语句查看(用户不能直接更改);

4、所创建的触发器(insert、delete、update)是在原表数据行已经修改完成后再触发。所以,触发器是在约束检查之后才执行。


什么时候使用触发器?

a、实现主外键关系所不能保证的复杂参......

阅读全文(1459) | 评论:0

Sql Server数据库触发器实例讲解(2013-01-26 10:56:00)

摘要:     定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
     常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)

     我为什么要使用触发器?比如,这么两个表:

     Create Table Student(             --学生表
       StudentID int primary key,      --学号
       ....
      )

     Create Table BorrowRecord(              --学生借书记录表
       BorrowRecord  int identity(1,1),      --流水号 
       StudentID     int ,      &nbs......

阅读全文(1459) | 评论:0

关于数据库事务、隔离级别、锁的理解与整理(2013-01-23 21:39:00)

摘要: 事务(Transaction) 数据库的事务是数据库并发控制的基本单位,一组操作的集合、序列。要么都执行,要么都不执行,是一个不可分割的整体。比如银行的转账,钱从一个账户转移到另一个账户,账户A扣钱账户B加钱,要么都执行,要么都不执行。不可能A扣了钱B没有加钱,也不可能A没扣钱B却加了钱。 数据库的事务应当具有以下四种特性: Atomic(原子性) 事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。 Consistency(一致性) 只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。 Isolation(隔离性) 事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。 同时,并行事务的修改必须与其他并行事务的修改相互独立。 事务的隔离性一般由事务的锁来进行控制。 Durability(持久性) 事务结束后,事务处理的结果必须能够得到固化。 数据库的事务和程序的线程有相似的地方: 1.线程之间共享同一片资源,而事务共享的则是数据库内的数据。 2.多线程的意义在于并发执行,提高效率;事务并发执行也能提高程序与数据库交互的效率。 因此如何使用事务与事务相互之间的隔离级别,直接影响了数据库的并发性和数据的准确性。我们在设计事务和选择隔离级别时这些是应该要考虑的。 选择完隔离级别与设计完事务之后,在使用过程中常常会遇到以下几种情况: 1.更新丢失(Lost update):两个事务同时更新,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。 2.脏读(Dirty Reads):一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。 3.不可重复读取(Non-repeatable Reads):一个事务两次读取,但在第二次读取前另一事务已经更新了。 4.虚读(Phantom Reads):一个事务两次读取,第二次读取到了另一事务插入的数据。 5.两次更新问题(Seco......

阅读全文(2911) | 评论:0

[转载] 微软SQL Server事务隔离级别实例简介(2013-01-23 21:37:00)

摘要: 数据库的事务隔离级别(TRANSACTION ISOLATION LEVEL)是一个数据库上很基本的一个概念。为什么会有事务隔离级别,SQL Server上实现了哪些事务隔离级别?事务隔离级别的前提是一个多用户、多进程、多线程的并发系统,在这个系统中为了保证数据的一致性和完整性,我们引入了事务隔离级别这个概念,对一个单用户、单线程的应用来说则不存在这个问题。 首先,我们来看一下高并发的系统中会存在哪些问题,为了便于理解我们以张三在招商银行的账号和存款为例。 一、准备工作: 1. 创建一个银行账号Table(只是为了说明问题,不考虑表的设计范式)
CREATE TABLE dbo.BankAccount
(
   BankAccountId CHAR(16)       NOT NULL, -- 银行账号
   UserName      NVARCHAR(32)   NOT NULL, -- 用户
   Balance       DECIMAL(19, 2) NOT NULL, -- 余额
   LastUpdate    SMALLDATETIME  NOT NULL
)
GO 2. 准备数据
INSERT INTO dbo.BankAccount
     VALUES ('9555500100071120', N'张三', 10000.00, GETDATE()) -- 北京分行账号
INSERT INTO dbo.BankAccount
     VALUES ('9555507551227787', N'张三', 20000.00, GETDATE())......

阅读全文(1584) | 评论:0

数据库索引技术--聚集索引和非聚集的区别和建立原则(三)(2012-08-02 22:56:00)

摘要: 4.       聚集索引和非聚集的区别
聚集索引和非聚集索引的根本区别是数据记录的排列顺序和索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后,从而缩小了搜索范围,对于返回某一范围的数据效果最好。
聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。
非聚集索引指定了表中记录的逻辑顺序,数据记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B树的结构,但非聚集索引的叶子层顺序并不与实际的数据页相同,而采用指向表中的记录在数据页中位置的方式。非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组。在有大量不同数据的列上建立非聚集索引,可以提高数据的查询和修改速度。
在对聚集索引列查询时,聚集索引的速度要比非聚集索引速度快。
在对聚集索引列排序时,聚集索引的速度要比非聚集索引速度快。但是如果数据量比较大时,如10万以上,则二者的速度差别不明显。

5.       聚集索引和非聚集的建立原则
在创建索引时要做到三个适当,即在适当的表上、适当的列上创建适当数量的索引。虽然这可以通过一句话来概括优化的索引的基本准则,但是要做到这一点的话,需要做出很大的努力。具体的来说,要做到这个三个适当有如下几个要求。
5.1          
根据表的大小来创建索引。
虽然给表创建索引,可以提高查询的效率。但是需要注意的是,索引也需要一定的开销的。为此并不是说给所有的表都创建索引,那么就可以提高数据库的性能。这个认识是错误的。给所有的......

阅读全文(5618) | 评论:6

聚集索引和非聚集索引[转](2012-08-02 22:53:00)

摘要: 聚集索引的区别 聚集索引:物理存储按照索引排序 非聚集索引:物理存储不按照索引排序 优势与缺点 聚集索引:插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快 聚集索引的区别 聚集索引:物理存储按照索引排序 非聚集索引:物理存储不按照索引排序 优势与缺点 聚集索引:插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快 索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。如下图: 非聚集索引 聚集索引

一、索引块与数据块的区别

大家都知道,索引可以提高检索效率,因为它的二叉树结构以及占用空间小,所以访问速度块。让我们来算一道数学题:如果表中的一条记录在磁盘上占用1000字节的话,我们对其中10字节的一个字段建立索引,那么该记录对应的索引块的大小只有10字节。我们知道,SQL Server的最小空间分配单元是“页(Page)”,一个页在磁盘上占用8K空间,那么这一个页可以存储上述记录8条,但可以存储索引800条。现在我们要从一个有8000条记录的表中检索符合某个条件的记录,如果没有索引的话,我们可能需要遍历8000条×1000字节/8K字节=1000个页面才能够找到结果。如果在检索字段上有上述索引的话,那么我们可以在8000条×10字节/8K字节=10个页面中就检索到满足条件的索引块,然后根据索引块上的指针逐一找到结果数据块,这样IO访问量要少的多。

二、索引优化技术

是不是有索引就一定检索的快呢?答案是否。有些时候用索引还不如不用索引快。比如说我们要检索上述表中的所有记录,如果不用索引,需要访问8000条×1000 字节/8K字节=1000个页面,如果使用索引的话,首先检索索引,访问8000条×10字节/8K字节=10个页面得到索引检索结果,......

阅读全文(5412) | 评论:8