文章标签 ‘SQL’

[转载]【译】一些优化你的SQL语句的TIPs – CareySon – 博客园. 简介 对于写出实现功能的SQL语句和既能实现功能又能保证性能的SQL语句的差别是巨大的。很多时候开发人员仅仅是把精力放在实现所需的功能上,而忽略了其所 写代码的性能和对SQL Server实例所产生的影响(也就是IO,CPU,内存方面的消耗).这甚至有可能使整个SQL Server实例跪了。本文旨在提供一些简单的步骤来帮助你优化SQL语句。 市面上已经有很多关于如何优化SQL Server性能的书籍和白皮书。所以本文并不打算达到那种深度和广度,而仅仅是为开发人员提供一个快速检测的列表来找到SQL语句中导致瓶颈产生的部分。 在开始解决性能问题之前,合适的诊断工具是必须的。除去众所周知的SSMS和SQL Profiler,SQL Server 2008还带有众多DMV来提供关键信息。本篇文章中,我将使用SSMS和一些DMV来找到SQL的瓶颈   那么,我们从哪开始 我的第一步是查看执行计划。这一步既可以通过SMSS也可以通过SQL Profiler实现,为了简便起见,我将在SMSS中获取执行计划。 1) 检查你是否忽略掉了某些表的连接的条件,从而导致了笛卡尔积(Cross)连接(Join)。比如,在生产系统中有两个表,每个表中有1000行数据。这 其中绝大多数数据并不需要返回,如果你在这两个表上应用了Cross Join,返回的结果将会是100万行的结果集!返回如此数量的数据包括将所有数据从物理存储介质中读取出来,因而占用了IO。然后这些数据将会被导入内 存,也就是SQL Server的缓冲区。这会将缓冲区内的其它页Flush出去。   2)查看你是否忽略了某些Where子句,缺少Where子句会导致返回额外不需要的行。这产生的影响和步骤一所产生的影响是一样的。   3)查看统计信息是否是自动创建和自动更新的,你可以在数据库的属性里看到这些选项 在默认条件下创建一个新数据库,Auto Create Statistics和Auto Update Statistics选项是开启的,统计信息是用于帮助查询优化器生成最佳执行计划的。这份白皮书对于解释统计信息的重要性以及对于执行计划的作用解释的非常到位。上面那些设置可以通过右键数据库,选择属性,在“选项”中找到。   4)检查统计信息是否已经过期,虽然统计信息是自动创建的,但是更新统计信息从而反映出数据的变化也同样重要。在一个大表中,有时候虽然Auto Update Statistics 选项已经开始,但统计信息依然无法反映出数据的分布情况。默认情况下,统计信息的更新是基于抽取表中的随机信息作为样本产生的。如果数据是按顺序存储的, 那么很有可能数据样本并没有反映出表中的数据情况。因此,推荐在频繁更新的表中,统计信息使用Full Scan选项来定期更新。这种更新可以放到数据库闲时来做。 DBCC SHOW_STATISTICS命令可以用于查看上次统计信息的更新时间,行数以及样本行数.在这个例子中,我们可以看到Person.Address表上的AK_Address_rowguid索引的有关信息: USE AdventureWorks; GO DBCC SHOW_STATISTICS (“Person.Address”, AK_Address_rowguid); GO 下面是输出结果,请注意Updated,Rows,Rows Sampled这三个列   [...]

2012年2月15日13:48 评论关闭

[转载]利用Attribute简化SQL删除操作 – ahl5esoft – 博客园. 昨天跟朋友聊天,发现他们的项目数据层使用的是最基础的纯SQL语句+SQLParameter进行数据交互的,大家知道SELECT、UPDATE、CREATE对于表的依赖性比较大,然后删除语句却不一样,它的语法比较简单,大致有以下几种: 1、DELETE FROM TableName 2、DELETE FROM TableName WHERE ID = idValue 3、DELETE FROM TableName WHERE ID IN (id1, id2, id3, id4….) 于是我们要实现这个简单的功能来简化比较常用的删除就比较容易了,主要保留2个数据,1个是TableName,另外1个就是ID了,如果实体 类有基类的情况下,我们可以扩展基类,提供2个接口,让其他的实体类去实现来保存对应的TableName和ID。但是如果没有基类的话,我们也可以利用 Attribute来实现这个功能。 Attribute代码如下: 1 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 2 public class DbAttribute : Attribute 3 { 4 #region 变量 5 6 private string m_TableName = [...]

2012年2月8日08:18 评论关闭

[转载]CURD – 使用 Transact-SQL 的 select 语句查询数据 (二):在查询中使用普通函数和聚集函数 – MicroStone – 博客园. – 常用字符串函数: – CharIndex:用来寻找一个指定字符串在另一个字符串中的起始位置 select CHARINDEX(‘朱磊’,’我的名字叫朱磊’,1) – Len:返回传递给它的字符串长度 select LEN(‘我的名字叫朱磊’) – Upper:把传递给它的字符串转换为大写 select UPPER(‘my name is zhulei’) – Ltrim:清楚字符串左边的空格 select LTRIM(‘   hello’) – Rtrim:清楚字符串右边的空格 select RTRIM(‘   hello   ‘) – Right:从字符串右边返回指定数目的字符 select RIGHT(‘MicroStone’,5) – Replace:替换一个字符串中的字符 select REPLACE(‘中华人民万岁’,’万’,’亿’) – Stuff:在一个字符串中,删除指定长度的字符,并在该位置插入一个新的字符 select STUFF(‘ABCDEFG’,3,2,’朱磊’) – 常用日起函数: – [...]

2012年1月7日14:35 评论关闭

[转载]SQL截取字符串(substring与patindex的使用) – 爱与决择 – 博客园. 首先学习两个函数 1.substring 返回字符、binary、text 或 image 表达式的一部分。 基本语法:SUBSTRING ( expression , start , length ) expression:字符串、二进制字符串、text、image、列或包含列的表达式 start:整数,指定子串的开始位置      注:SQL中”1″表示字符串中的第一个字符,而.NET中”0″表示第一个字符 length:整数,指定子串的长度(要返回的字符数或字节数) 2.patindex 返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。 基本语法:PATINDEX ( ‘%pattern%‘ , expression ) pattern:字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除外)。pattern 是短字符数据类型类别的表达式 expression:表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别 下面结合上面的两个函数,截取字符串中指定的字符 declare @a varchar(50) set @a=‘2009年7月15日星期五‘ select substring(@a,1,4) –获取年份2009 declare @b int set @b=patindex(‘%日%‘,@a) –获取’日’这个字符在字符串中的位置,即10 select substring(@a,6,@b-5) [...]

2012年1月5日09:26 评论关闭

[转载]T-SQL查询进阶–理解SQL SERVER中的分区表 – CareySon – 博客园. 简介 分区表是在SQL SERVER2005之后的版本引入的特性。这个特性允许把逻辑上的一个表在物理上分为很多部分。而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个表做union操作. 分区表在逻辑上是一个表,而物理上是多个表.这意味着从用户的角度来看,分区表和普通表是一样的。这个概念可以简单如下图所示: 而对于SQL SERVER2005之前的版本,是没有分区这个概念的,所谓的分区仅仅是分布式视图: 本篇文章所讲述的分区表指的是SQL SERVER2005之后引入的分区表特性. 为什么要对表进行分区 在回答标题的问题之前,需要说明的是,表分区这个特性只有在企业版或者开发版中才有,还有理解表分区的概念还需要理解SQL SERVER中文件和文件组的概念. 对表进行分区在多种场景下都需要被用到.通常来说,使用表分区最主要是用于: 存档,比如将销售记录中1年前的数据分到一个专门存档的服务器中 便于管理,比如把一个大表分成若干个小表,则备份和恢复的时候不再需要备份整个表,可以单独备份分区 提高可用性,当一个分区跪了以后,只有一个分区不可用,其它分区不受影响 提高性能,这个往往是大多数人分区的目的,把一个表分布到不同的硬盘或其他存储介质中,会大大提升查询的速度. 分区表的步骤 分区表的定义大体上分为三个步骤: 定义分区函数 定义分区构架 定义分区表 分区函数,分区构架和分区表的关系如下: 分区表依赖分区构架,而分区构架又依赖分区函数.值得注意的是,分区函数并不属于具体的分区构架和分区表,他们之间的关系仅仅是使用关系. 下面我们通过一个例子来看如何定义一个分区表: 假设我们需要定义的分区表结构如下: 第一列为自增列,orderid为订单id列,SalesDate为订单日期列,也就是我们需要分区的依据. 下面我们按照上面所说的三个步骤来实现分区表. 定义分区函数 分区函数是用于判定数据行该属于哪个分区,通过分区函数中设置边界值来使得根据行中特定列的值来确定其分区,上面例子中,我们可以通过SalesDate 的值来判定其不同的分区.假设我们想定义两个边界值(boundaryValue)进行分区,则会生成三个分区,这里我设置边界值分别为 2004-01-01和2007-01-01,则前面例子中的表会根据这两个边界值分成三个区: 在MSDN中,定义分区函数的原型如下: CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type ) AS RANGE [ LEFT | RIGHT ] FOR VALUES [...]

2011年12月31日08:56 评论关闭
备案信息:冀ICP备10007948号