加快SQLServer操作的技术

来源:互联网 发布:mac破解软件 哪个网站 编辑:程序博客网 时间:2024/06/03 22:51

对SQLServer的插入和查询操作,由于数据量大,加速是一重要任务,主要从插入和查询两方面进行了优化:

1、查询

聚类索引

索引按照存储结构分为聚类索引和非聚类索引(采用聚类索引,因为order by, group by 等较为频繁)

索引:数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书。在数据库中,数据库程序使用

索引可以映射到表中的数据,而不必扫描整个表。书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位

置的列表。
索引的利弊:查询执行的大部分开销是I/O,使用索引提高性能的一个主要目标是避免全表扫描,带索引的表需要在数据库中占用更多的存储空间,

同样用来增删数据的命令运行时间以及维护索引所需的处理时间会更长。

带索引的表需要在数据库中占用更多的存储空间,同样用来增删数据的命令运行时间以及维护索引所需的处理时间会更长。
聚集索引是一种对磁盘上实际数据重新组织以按指定的一列或多列值排序。由于聚集索引是给数据排序,不可能有多种排法,所以一个表只能建立

一个聚集索引。
由于在聚集索引下,数据在物理上是按序排列在数据页上的,重复值也排在一起,因而包含范围检查(bentween,<,><=,>=)或使用group by 或

order by的查询时,一旦找到第一个键值的行,后面都将是连在一起,不必在进一步的搜索,避免了大范围的扫描,可以大大提高查询速度。
sqlserver默认情况下建立的索引是非聚集索引,他不重新组织表中的数据,而是对每一行存储索引列值并用一个指针指向数据所在的页面。他像汉

语字典中的根据‘偏旁部首’查找要找的字,即便对数据不排序,然而他拥有的目录更像是目录,对查取数据的效率也是具有的提升空间,而不需要全

表扫描。
创建索引:
CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ]INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )[with[PAD_INDEX][[,]FILLFACTOR=fillfactor][[,]IGNORE_DUP_KEY][[,]DROP_EXISTING][[,]STATISTICS_NORECOMPUTE][[,]SORT_IN_TEMPDB]][ ON filegroup ]

利用内存,以空间换时间

将所需批次的数据全部取出放入内存中进行操作,使用
DataTable.select(“
查询条件”).copytodatatable<dataRow>(datatable,LoadOption.PreserveChanges).


2、插入

临时表

因为查询时加入了聚集索引,如果逐条插入的话速度很慢,所以将数据插入到一个没有索引的临时表中,然后insert into XX select .. from .. 这样批量

插入数据库会自动优化

存储过程

数据库引擎在执行动态语句前都要进行编译,确定执行计划,数量过大的话,很耗时,存储过程的好处是查询计划重用,也就是预先编译。

解释:每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码

被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不

是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编

译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如: 

insert into tb_name (col1,col2) values ('11','22'); 
insert into tb_name (col1,col2) values ('11','23'); 

       即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样

每执行一次都要对传入的语句编译一次.

多线程

优点:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。
缺点:线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
    多线程需要协调和管理,所以需要CPU时间跟踪线程;
    线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
    线程太多会导致控制太复杂,最终可能造成很多Bug;

sqlBulkCopy

SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法。SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到

数据的目的地。 WriteToServer方法可以处理的数据类型有DataRow[]数组,DataTable 和 DataReader。 你可以根据不同的情形使用不同的数据类型。

SqlBulkCopy其原理是采用了SQL Server的BCP协议进行数据的批量复制.

0 0
原创粉丝点击