飘飘悠悠 发表于 2015-1-16 22:28:54

MSSQL网页设计浅谈SQL SERVER 2000 T-SQL 的运转

优化的SQL查询算法,有效地提高查询速度server
浅谈SQLSERVER2000T-SQL的运转



T-SQL(Trantsact-SQL)是微软公司在SYBASE的基本上开展起来的一种布局化查询言语,是使用程序和存储历程与SQLSERVER通信和会见的工具.包容了ANSI89和ANSI92尺度.以是T-SQL不是一种尺度的编程言语,它必需经由过程SQLSERVER的数据引擎来剖析和运转,SQLSERVER是怎样编译和运转T-SQL语句呢?

SQLSERVER在处置任何T-SQL语句时都经由上面三个步骤:

1.剖析T-SQL语句

2.编译T-SQL语句

3.实行T-SQL语句



当一个T-SQL的批处置提交到SQLSERVER服务器,服务器回将这个T-SQL批处置作为一个全体举行剖析,在优化,编译,最初在分步实行.

一.剖析

所谓”剖析”是指SQLSERVER命令剖析模块起首反省T-SQL批处置语法的历程,假如没有找到毛病,命令剖析器将源代码细分为多个逻辑单位,好比:关头字,标识符和运算符.然后命令剖析器会构建一个外部布局,最初经由过程这个外部布局天生DDL操纵或DDM操纵所必要的具体的步骤.假如该T-SQL批处置包容一个查询,那末这个外部布局被成为查询树(QUERYTREE),假如该T-SQL批处置是一个历程,那末这个外部查询被成为按次树(SEQUENCETREE).



图一:SQLSERVER的干系引擎部分

人人能够看出在图一的右边,次要是T-SQL的剖析,编译和查询优化(QueryOptimizer).这是SQLSERVER运转T-SQL十分关头的部分.在图的右侧是实行组件,当T-SQL语句编译事后就会间接传给实行布局举行运转.在两头的部分是SQL办理器,把持全部T-SQL批处置的剖析,编译和实行.SQLMessage是从客户端承受的(TDS)数据.ExpressServicesLibary是举行数据转换,过虑数据和举行盘算和统计,同时也会格局化输入的数据.

二.编译

这一步次要是将按次树(SEQUENCETREE)天生为一个实行计划,查询优化器(QueryOptimizer)次要是对T-SQL语句所要检索的资本举行评价,天生I/O的工夫,过虑工夫和其他逻辑处置的工夫.然后查询优化器(QueryOptimizer)是试牟利用一个最小资本的计划.

这个计划中还包含实行是必要的义务列表(好比:平安反省,束缚反省,触发器反省等等).这个就被成为实行计划



三.实行

实行组件依据实行计划在高速缓存中运转并滞留,实行计划的分歧步骤将被发送到干系引擎的分歧组件举行处置:DML办理器,DDL办理器,存储历程办理器,事件处置办理器和有用工具办理器.处置了局将以了局集的体例被搜集兼并前往挪用者.

实行计划将在高速缓存中被保存一段工夫,假如统一用户或其他用户收回相似哀求的T-SQL批处置,干系数据引擎将会优先在高速缓存中寻觅婚配的实行计划.假如该实行计划存在就接纳运转,假如不存在,SQLSERVER就会剖析并编译这个T-SQL批处置.

假如SQLSERVER必要的内存不敷,它会从内存中删除一些实行计划.SQLSERVER有一个很好的”老化”算法,它能够统计某个实行计划的利用工夫和次数.假如内存充足的年夜,也能够无穷的增添实行计划到内存中.



四.复杂查询实行计划的重用

复杂T-SQL批处置只能够在2中情形下被重用:

1.第二次查询的文本必需和高速缓存中实行计划所形貌的文本完整不异,每项都要婚配,包含:空格,换行,缩排,在巨细写敏感的SQLSERVER中还包含字符的巨细写.

2.查询包容完整润色的数据库工具以便重用实行计划.

SELECT*FORMPUBS.DBO.SALES

以是在这类情形下:”*”的实行效力要高于SELECTCOLUMN_LISTFROMTABLENAME的语句.



五.存储历程实行计划的重用:

存储历程比复杂查询实行效力高的一个次要缘故原由是:存储历程的实行计划能够便利的被重用.比图:在实行一个复杂查询3次,那末SQLSERVER必要实行3次剖析―编译―实行的历程,而存储历程最有大概的是在第一次实行之前被剖析并被从头编译一次.

存储历程的实行计划分2部分:

1.可重进部分,能够被职员数目的存储历程同时利用;

2.包含数据高低文的部分,也就是实行时代存储历程的各个参数;

在SQLSERVER中有一个组件--惰性写进器(LAZYWRITER),来判别缓存中的实行计划是不是会重用和是不是必要请求更多的内存.假如有以下的操纵,SQLSERVER将当即重缓存中删除实行计划,开释内存:

l分明改动数据量;

l创立和删除INDEX;

l增加和变动束缚;

l变动INDEX的散布信息;

l显现的挪用sp_recompile以从头编译存储历程或触发器;

当SQLSERVER创建一个实行计划就会给该实行计划一个”编译本钱因子”.这个本钱因子的值取决于创立该实行计划所必要的资本开支.比方:付与一个年夜型的实行计划的编译本钱因子是8,而一个小的实行计划的编译本钱因子是2.每次某个CLIENT援用该实行计划,他的”岁数”就会递增一个编译本钱因子的值.

SQLSERVER的惰性写进器(LAZYWRITER)是怎样事情的呢?SQLSERVER的惰性写进器用来下降实行计划的”岁数”,惰性写进器历程会按期轮回遍历高速缓存中的一切实行计划,并将实行计划的”岁数”减1,当实行计划的编译本钱因子的值为0时,SQLSERVER就会发出分派给该实行计划的内存.

备注:

SQLSERVER的优化组件(QueryOptimizer)会在存储历程援用的表数据更新时主动从头编译该存储历程,更新实行计划.但在你增加一个INDEX时,SQLSERVER不会主动从头编译存储历程,必要手动革新高速缓存的实行计划(最复杂的办法,你能够从头启动MSSQLSERVER服务),这是该存储历程会被从头编译,大概你能够手动强迫从头编译:

Execsp_recompilesp_storedprocedurename

SQLSERVER还供应了别的一种高效的从头编译的办法:假如有大批的存储历程和触发器援用某一个表,而且还增加表INDEX以进步检索的效力.这是我们能够经由过程从头编译这个表来从头编译一切的存储历程和触发器:

EXECsp_compiletablename.

一切我们在从头创建索引或实行了更新索引的操纵子后,必定要从头编译存储历程,不外这是最好的举措是从头启动服务器.



参考:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsql7/html/sqlquerproc.asp




导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。

飘灵儿 发表于 2015-1-19 14:27:11

原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。

金色的骷髅 发表于 2015-1-26 22:58:44

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~

只想知道 发表于 2015-2-4 22:36:30

作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!

小女巫 发表于 2015-2-10 22:04:04

从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。

admin 发表于 2015-3-1 16:29:28

我们学到了什么?思考问题的时候从表的角度来思考问

若天明 发表于 2015-3-10 20:45:27

很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。

变相怪杰 发表于 2015-3-17 10:07:19

始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
页: [1]
查看完整版本: MSSQL网页设计浅谈SQL SERVER 2000 T-SQL 的运转