加快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时间跟踪线程;
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
线程太多会导致控制太复杂,最终可能造成很多Bug;
sqlBulkCopy
SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法。SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到
数据的目的地。 WriteToServer方法可以处理的数据类型有DataRow[]数组,DataTable 和 DataReader。 你可以根据不同的情形使用不同的数据类型。
SqlBulkCopy其原理是采用了SQL Server的BCP协议进行数据的批量复制.
- 加快SQLServer操作的技术
- 加快软盘操作速度的汇编程序源代码
- 加快ALTER TABLE操作的速度
- MySQL加快ALTER TABLE操作的速度
- sqlserver的技术规格
- sqlserver操作的类
- JAVA使用JDBC技术操作SqlServer数据库
- sqlserver数据库的分页技术
- mysql(一)加快ALTER TABLE操作的速度
- 高性能MYsql读书笔记-加快alter table操作的速度
- 有关sqlserver操作的语句
- 一些sqlserver时间的操作
- sqlserver的statistics操作语句
- sqlserver中常见的操作
- 优化SQLServer数据库加快查询速度
- c#操作sqlserver数据库的事务操作
- JAVA使用JDBC技术操作SqlServer数据库执行存储过程
- 加快alter table 操作速度
- Ubuntu版本更新一路走来:朕就是这样的汉子
- linux 命令记录 -- 个人
- 用R语言的RCurl和正则表达式爬团购网的旅游团购数据
- linux 基础知识
- 欢迎使用CSDN-markdown编辑器
- 加快SQLServer操作的技术
- 算法设计与分析入门篇----分治作业 1
- 动态获取Bing每日壁纸
- java并发编程 -volatile关键字
- Java观察者模式(Observer模式)
- (转)GetResponse()获取错误时处理方式
- DP Minimum Path Sum
- Java组成部分、JDK和SDK的区别、JDK的安装
- UITextView使用自定义表情键盘