随笔分类 -  SQL SERVER 执行计划与索引

摘要:如果一张表上没有聚集索引,数据将会随机的顺序存放在表里。以dbo.SalesOrderDetail_TEST为例子。它的上面没有聚集索引,只有一个在SalesOrderID上的非聚集索引。所以表格的每一行记录,不会按照任何顺序,而是随意地存放在Hash里。这个时候如果用户想要找所有单价大于200的销售详细记录,要运行的语句会是:SET STATISTICS PROFILE ON SELECT SalesOrderDetailID , UnitpriceFROM SalesOrderDetail_testWHERE UnitPrice > 200由于表在UnitPrice上没有索引,所以S 阅读全文
posted @ 2013-09-06 17:25 _cc 阅读(2673) 评论(3) 推荐(1) 编辑
摘要:当确定了应用性能问题可以归结到某一个,或者几个耗时资源的语句后,对这些语句进行调优,就是数据库管理员或者数据库应用程序开发者当仁不让的职责了。语句调优是和数据库打交道的必备基本功之一。当你面对一个“有问题”的语句时,应该怎么分析它的问题所在,最后达到优化语句的目的呢?首先要想一想,“有问题”的语句“问题”究竟在那里?也就是说,你要优化的目标是什么。常见的需求有:1) 语句需要访问大量的数据页面,造成内在压力、磁盘繁忙等。对于这类问题,所关心的是为什么语句要执行要访问这么多数据页面?是语句的结果集本身就比较大;还是SQL SERVER没有办法有效地seek,而是像大炮打苍蝇一样从大量的原始数据里 阅读全文
posted @ 2013-09-05 21:57 _cc 阅读(6957) 评论(6) 推荐(1) 编辑
摘要:方法1. 使用系统表-- 查询一个表中的索引及索引列USE AdventureWorks2008GOSELECT indexname = a.name , tablename = c. name , indexcolumns = d .name , a .indidFROM sysindexes a JOIN sysindexkeys b ON a .id = b .id AND a .indid = b.indid JOIN sysobjects c ON b .id = c .id JOIN syscolumns d ON b .id = d .id ... 阅读全文
posted @ 2013-08-23 17:57 _cc 阅读(35362) 评论(6) 推荐(3) 编辑
摘要:与大多数语言一样,SQL语言也有一个执行顺序,只是在大多数编程语言中,代码是按照编写顺序来处理的,而在SQL中则不是,下图为SQL 执行顺序。(5) SELECT ( 5-2 ) [ ALL | DISTINCT ] (5- 3) [TOP ( expression ) [PERCENT] [ WITH TIES ] (5- 1) --[ INTO new_table ](1) FROM ( 1-J ) join on |(1- A) apply as |(1- P) PIVOT () as ... 阅读全文
posted @ 2013-08-12 16:10 _cc 阅读(1633) 评论(4) 推荐(2) 编辑
摘要:--- 平均I/O时间长的语句USE tempdbSELECT TOP 10 (total_logical_reads/execution_count) AS avg_logical_reads, (total_logical_writes/execution_count) AS avg_logical_writes, (total_physical_reads/execution_count) AS avg_phys_reads, execution_count, statement_start_offset as stmt_start_offset, SUBSTRING(... 阅读全文
posted @ 2012-11-30 18:08 _cc 阅读(1258) 评论(0) 推荐(0) 编辑
摘要:摘自:http://blogs.msdn.com/b/apgcdsd/archive/2011/02/11/sql-server-tempdb.aspx系统数据库是一个全局资源,供连接到 SQL Server 实例的所有用户使用。在现在的SQL Server里,其使用频率可能会超过用户的想象。如果Tempdb空间耗尽,许多操作将不能完成。作为一个支持工程师,会被经常问到象“我的Tempdb为什么这么大?”“是谁把我的Tempdb空间用完的?”在SQL 2000的时候,这个问题很难回答。好在SQL 2005以后,引入了一张新的管理视图:sys.dm_db_file_space_usage。通过查 阅读全文
posted @ 2012-11-26 09:59 _cc 阅读(3578) 评论(1) 推荐(1) 编辑
摘要:--PARSENAME可以用截取字符串用,但是只能是四个以内,也就是三个分隔符DECLARE @T TABLE( COL VARCHAR(80))INSERT INTO @TSELECT '123_12_124' UNION ALL SELECT '1234_125_1243'SELECT COL, COL1 = PARSENAME(REPLACE(COL,'_','.'),3), ----替换一下 '.' 因为 parsename 只认 '.' COL2 = PARSENAME(REPLACE(C 阅读全文
posted @ 2012-05-15 16:06 _cc 阅读(584) 评论(0) 推荐(0) 编辑
摘要:/*‘可靠性和性能监视器’ 是sql08用于监视服务器的标准工具,它已经为sql server 更新报计数器。利用这些计数器可以跟踪很多不同的服务器资源和活动。sql server Profiler(事件探查器)是一个分析和优化工具,可以用来追踪服务器事件*/sp_who--报告当前的用户和进程.在执行sp_who时,可将登录名作为参数传递。如果没有指定登录名,在此参数中传递空值,会返回所有的结果--如果用关键词active作为登录名,将会仅看到活动进程,所有正在等待用户下一命令的进行将排除在外。--也可以不使用诸如sa的特定登录名,而是使用一个系统进程的ID数值。禁止用户登陆use mast 阅读全文
posted @ 2012-04-01 17:30 _cc 阅读(1114) 评论(0) 推荐(1) 编辑
摘要:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。 Transact-SQL 语法约定语法ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )参数<partition_by_clause>将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。若要了解 PARTITION BY 语法,请参阅 OVER 子句 (Transact-SQL)。<order_by_clause>确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息 阅读全文
posted @ 2011-12-29 15:28 _cc 阅读(1149) 评论(0) 推荐(0) 编辑
摘要:use mydatabaseselect * from table1 where username like'%c%"下面是完成上面功能的另一种写法:use mydatabaseselect * from table1 where charindex('c',username)>0这种方法理论上比上一种方法多了一个判断语句,即>0, 但这个判断过程是最快的, 我想信80%以上的运算都是花在查找字符串及其它的运算上, 所以运用charindex函数也没什么大不了. 用这种方法也有好处, 那就是对%,|等在不能直接用like查找到的字符中可以直接在这c 阅读全文
posted @ 2011-12-28 16:58 _cc 阅读(220) 评论(0) 推荐(0) 编辑
摘要:概念: 临时表:以“#”号开头, 全局临时表:以“##”号开头。 表变量:即变量,用declare定义的变量。 如:Declare @Rec table (ID Int Identity(1,1), Name varchar(40)) 详细概念如下: 表变量 变量都以@或@@为前缀,表变量是变量的一种,另外一种变量被称为标量(可以理解为标准变量,就是标准数据类型的变量,例如整型int或者日期型DateTime)。以@前缀的表变量是本地的,因此只有在当前用户会话中才可以访问,而@@前缀的表变量是全局的,通常都是系统变量,比如说@@error代表最近的一个T-SQ... 阅读全文
posted @ 2011-12-08 11:16 _cc 阅读(334) 评论(0) 推荐(0) 编辑
摘要:--逻辑查询处理的步骤序号(8) SELECT (9) DISTINCT (11) <TOP_SPECIFICATION> <SELECT_LIST>(1) FROM <LEFT_TABLE>(3) <JOIN_TYPE> JOIN<RIGHT_TABLE>(2) ON <JOIN_CONDITION>(4) WHERE <WHERE_CONDITION>(5) GROUP BY <GROUP_BY_LIST>(6) WITH {CUBE | ROLLUP}(7) HAVING <HAVING 阅读全文
posted @ 2011-11-14 23:19 _cc 阅读(237) 评论(0) 推荐(0) 编辑
摘要:1、应用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;在查询时,不要过多地使用通配符如SELECT * FROM T1语句,要用到几列就选择几列如:SELECT COL1,COL2 FROMT1;在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的。不要在应用中使用数据库游标,游标是非常有 阅读全文
posted @ 2011-11-09 10:09 _cc 阅读(270) 评论(0) 推荐(0) 编辑