文章标签 ‘SQLServer’
[转载]SQL调优日记之发挥SQL性能与你的写法有关--对比三种方式实现相同功能 – 谢堂文(Darren Xie) – 博客园. 今天再次改老系统,看着前边的师兄留下的SQL,就想起了MS SQL 7.5和SQL2000。可能很多人都还没有习惯新版本(05版之后)的SQL语法,还是用以前开发MS SQL2000的方式实现功能,但是多少人会明白,换一种写法后,性能却相差十倍百倍呢! 我用来做例子的是我们MES系统用到的一段简单功能T-SQL,都是使用同一个库、相同的表、相同的逻辑: 开始前先记录时间,计算完成后看用了多少时间。 我先用推荐的语法来写的方式,代码1是好的写法,由于是在我们系统的情景下描述的,看管不可照抄,只说明性能的差别。 代码1: 用WITH,把各个逻辑分开处理,再终合出最后结果,推荐! 1: declare @P INT,@T DATETIME; 2: SELECT @P=1,@T=GETDATE(); 3: ;WITH R0 — 4: AS ( 5: SELECT TOP 1 M.WPCODE,t.RID,MACNO,LEFT(WFCNO,CHARINDEX(‘-’,WFCNO)-1) WO FROM MES_WFCIO M,MES_WFCIODTL t 6: WHERE M.RID=t.RID AND WFCNO=’JSAC00334D-033-001′ 7: ORDER BY t.RID DESC 8: ) 9: ,R1 [...]
[转载]浅谈SQL Server中统计对于查询的影响 – CareySon – 博客园. 简介 SQL Server查询分析器是基于开销的。通常来讲,查询分析器会根据谓词来确定该如何选择高效的查询路线,比如该选择哪个索引。而每次查询分析器寻找路径 时,并不会每一次都去统计索引中包含的行数,值的范围等,而是根据一定条件创建和更新这些信息后保存到数据库中,这也就是所谓的统计信息。 如何查看统计信息 查看SQL Server的统计信息非常简单,使用如下指令: DBCC SHOW_STATISTICS(‘表名’,’索引名’) 所得到的结果如图1所示。 图1.统计信息 统计信息如何影响查询 下面我们通过一个简单的例子来看统计信息是如何影响查询分析器。我建立一个测试表,有两个INT值的列,其中id为自增,ref上建立非聚集索引,插入100条数据,从1到100,再插入9900条等于100的数据。图1中的统计信息就是示例数据的统计信息。 此时,我where后使用ref值作为查询条件,但是给定不同的值,我们可以看出根据统计信息,查询分析器做出了不同的选择,如图2所示。 图2.根据不同的谓词,查询优化器做了不同的选择 其实,对于查询分析器来说,柱状图对于直接可以确定的谓词非常管用,这些谓词比如: where date = getdate() where id= 12345 where monthly_sales < 10000 / 12 where name like “Careyson” + “%” 但是对于比如 where price = @vari where total_sales > (select sum(qty) from sales) where a.id [...]
[转载]Sql Server参数化查询之where in和like实现详解(续) – 懒惰的肥兔 – 博客园. 在上一篇Sql Server参数化查询之where in和like实现详解中介绍了在SQL Server使用参数化查询where in的几种实现方案,遗漏了xml和表值参数,这里做一个补充 文章导读 方案5使用xml参数 方案6 使用表值参数TVP 6种实现方案总结 方案5 使用xml参数 对SQL server xml类型参数不熟悉的童鞋需要先了解下XQuery概念,这里简单提下XQuery 是用来从 XML 文档查找和提取元素及属性的语言,简单说就是用于查询xml的语言说到这就会牵着到XPath,其实XPath是XQuery的一个子集,XQuery 1.0 和 XPath 2.0 共享相同的数据模型,并支持相同的函数和运算符,XPath的方法均适用于XQuery,假如您已经学习了 XPath,那么学习 XQuery 也不会有问题。详见http://www.w3school.com.cn/xquery/xquery_intro.asp XQuery概念了解后需要进一步了解下Sql Server对xml的支持函数,主要为query()、nodes()、exist()、value()、modify() ,详见http://msdn.microsoft.com/zh-cn/library/ms190798.aspx 使用xml方式实现where in时有两种实现方式,使用value和exist,在这里推荐使用exist方法,msdn是这样描述的: D.使用 exist() 方法而不使用 value() 方法 由于性能原因,不在谓词中使用 value() 方法与关系值进行比较,而改用具有 sql:column() 的 exist()。 http://msdn.microsoft.com/zh-cn/library/ms178030.aspx 使用xml的value方法实现(不推荐) DataTable dt = new DataTable(); using (SqlConnection conn = new [...]
[转载]SQLServerDBA十大必备工具—让生活轻松点 – 飞洋过海 – 博客园. 曾经和一些DBA和数据库开发人员交流时,问他们都用过一些什么样的DB方面的工具,大部分人除了SSMS和Profile之外,基本就没有使用过其他工具了; 诚然,SSMS和Profile足够强大,工作的大部分内容都能通过它们搞定,但是MS、第三方公司甚至是个人开发者为SQLServer提供了很多其他的工具,如果你 能充分的掌握这些工具,无疑会给我们数据库的管理、优化、测试和排错节省大量的时间和精力,下面就来介绍除SSMS和Profile之外的其他有用的工具。 NO1: PD(PowerDesigner) 功能:SysBase公司提供的数据库设计工具,功能很强大,是做数据库设计时必备的工具; 下载:http://www.3ddown.com/soft/14524.htm NO2: Log Explorer 功能:数据库日志读取工具,主要用来恢复误操作的数据(目前只支持到2005版本),详见: http://blog.csdn.net/jinjazz/archive/2008/05/19/2459692.aspx ; 下载地址:http://www.pc6.com/softview/SoftView_57657.html NO3:Tuning Advisor 功能:优化顾问,会根据数据库的运行情况,提示您做相关的优化(可靠性不是太高,需要自行判断); 下载:SQLServer自带 NO4:SSMSTools 功能:SSMS工具的一个插件,能提供格式化代码、追溯历史等功能(通过它,也许你可以开发自己的插件); 下载: http://www.ssmstoolspack.com/ NO5: DBDiff 功能:比较两个数据库的差异; 下载:http://opendbiff.codeplex.com/ NO6:PAL Tool 功能:Performance Analysis of Logs,Perfmon日志分析工具; 下载:http://pal.codeplex.com/ NO7:RML 功能:这个工具非常强大,下图展示了完成安装后它的四个主要功能组件;ReadTrace工具能读取数据库的Profile跟踪文件,并生成报告;Ostress能将ReadTrace 生成的文件重播,而且还可以对数据库做压力测试;ORCA能保证重报时,按照事件发生的顺序播放;Reporter能将ReadTrace后的内容通过报表的形式展现,相当 的有用。 下载:http://support.microsoft.com/kb/944837 NO8:SQLNexus 功能:先通过SQLServer自带的SQLdiag.exe工具收集信息,然后再用SQLNexus分析这些信息,它是前面一些工具的整合,为数据库管理人员寻找SQLServer服务器 的性能瓶颈和排查故障提供了相当强大的支持(MS工程师很多都用这个哦,买技术支持的朋友们有木有经历过MS要求你开启SQLDiag,然后将收集的数据回传给他们 的;现场支持时,是不是也开启SQLDiag收集数据,然后就出来了服务器性能报告,有木有;所以掌握它,1k/时的定期服务器检查技术支持费用可以省了); [...]
[转载](原创)ROW_NUMBER()函数的使用 – InSky – 博客园. ROW_NUMBER()函数是SQL 2005中新添的一个函数。通常它被用在分页的SQL语句中。 微软官方的对此函数的描述是:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。 我对此的理解:利用此函数可以为表中的某个字段建立序列,从1开始。就是说,根据已存在的某列,利用此函数可建立一新列,新列是数字,按照已存在列的顺序从1开始。 上边可能说的不是很清楚,请结合下边这个例子来看吧! 1USE Northwind 2GO 3 4– 5SELECT OrderID, 6 CustomerID, 7 OrderDate 8FROM dbo.Orders WITH(NOLOCK) 9 10SELECT OrderID, 11 CustomerID, 12 OrderDate, 13 ROW_NUMBER() OVER(ORDER BY orderID DESC) AS 字段编号 14FROM dbo.Orders WITH(NOLOCK) 第一个查询只是一个普通的查询,查询出Orders表中的3个字段的记录。其结果为: 第二个查询相比第一个查询仅仅是多了“ ROW_NUMBER() OVER(ORDER BY orderID DESC) AS 字段编号 ”这段语句。我们来分析一下这段语句。 这段语句的作用就是利用ROW_NUMBER()函数根据OrderID这列来生成一个新的数据列,这列的名称为字段编号。然后我们根据ORDER BY orderID DESC来指定字段编号这列按照OrderID的逆序来生成,结果如下: 比较两个结果集,会发现第二个结果集是按照OrderID字段逆序的记录,其实也可看成是字段编号这个字段的正序排序,ROW_NUMBER()函数相当于为SELECT语句末尾加了ORDER BY子句,第二个SELECT语句其实等价于: 1SELECT OrderID, 2 CustomerID, 3 OrderDate, [...]


