从统计数据表记录总数谈SQL_Server查询优化

来源:互联网
责任编辑:王嘉善
字体:

SQL提高查询效率 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where

   对于select count(*) , 倘若表中有多个索引,则SQL Server的处理与通常的查询语句不同.

SELECT count(id) FROM TBL_POS_SHOP s, TBL_POS_POS p, TBL_POS_CUSTOMER c, TBL_POS_ORDER o, TBL_POS_CARDINFO cd WHERE o.POS_CATI = p.POS_CATI and o.CUSTOMER_ID = c.ID and o.SHOP_ID = s.ID and o.CARDINFO_ID = cd.ID 首先,我觉得你防采集。

在统计刻录总数时,聚集索引向来得不到数据库引擎的宠幸,除非WHERE子句中包含聚集索引

呵呵,这个问题很有趣不是吗? 上面的同志们只是给出一些建议,以我的经验来看(oracle), 如果数据量较大,索引的重复量尽量避免,最好的方式是建立非业务id(最好使用自增或是序列),把这个id建立索引。 你的最大的问题就是,建立了索引后,防采集。

所在的字段. WHY? 我们知道,大量的磁盘I/O是非常耗时的. 扫描任何一个索引都可以计算

1、1、调整数据结构的设计。这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等。 2、2、调整应用程序结构设计。这一部分也是在开发信息系统之前完成,程序员在这一步需防采集。

出刻录的总数,计算方式也是大致相同的,但非聚集索引的叶子层仅包含索引而没有每条记录

1 使用SET NOCOUNT ON 选项: 缺省地,每次执行SQL语句时,一个消息会从服务端发给客户端以显示SQL语句影响的行数。这些信息对客户端来说很少有用。通过关闭这个缺省值,你能减少在服务端和客户端的网络流量,帮助全面提升服务器和应用程序的性防采集。

的具体数据,通常比聚集索引占用的页面要少的多,从而大大减少了磁盘I/O ,缩短了计算时间.

感谢头条的邀请,你们的信任就是对我们最大的鼓励!让边牧不在乱叫的十五种方法:1:多运动充足的运动量可以消耗狗狗的精力。在玩或跑了一整天之后,狗儿宁可好好的睡上一觉,也不愿意在浪费体力吠叫。2:咬骨头如果有东西可以堵住狗狗的嘴,它们就没有时间乱叫了。那些越难咬的东西越有挑战性。所以下回当你准备出门时,先仍给它最爱咬的玩具,好让它打发无聊的时间。3:多动脑如果狗狗有事做就没有空乱叫了。在出门前,先用手揉搓它们喜爱的玩具,好让自己的味道留在上面。当看不到主任的时,孤单的够儿便会花更多的时间,在玩具上寻找主人的味道,而忘记了吠叫。4:弄点声音对于那些神经质的狗狗来说,一听到什么风吹草动的便会叫个不停。防采集。

如果索引所在的字段包含在WHERE子句中,则仅需扫描部分叶子节点就能计算出总数,所需

都说儿子随妈,姑娘像爹。我们都是父母所生,每个孩子都是由爸爸的精子和妈妈的卵细胞结合之后,经过十个月的孕育而来到世界上的。爸爸的精子带着23条爸爸的染色体,妈妈的卵细胞则带着23条来自妈妈的染色体,它们组合在一起,就构成了宝宝的23对染色体。那么孩子会更多继承哪一方呢,难道就像电脑合成图一样,是“相加然后除以二”?遗传学可没这么坏,孩子更像谁,这主要是由等位基因决定的。每对染色体上相同位置的基因就叫等位基因,它们控制的是同一性状,一个来自父亲、一个来自母亲;蛴邢孕院鸵灾,如果一对染色体上两个等位基因都是显性或者一个显性一个隐性,表现出来的性状都是显性性状,只有当两个等位基因都是隐性时,防采集。

时间会更短.

这与你的驾驶习惯有关,行车发动机1800-2100转,换挡2000转以上基本发动机不会出现积碳,如果发动机经常低转速行驶或长时间怠速,发动机容易积碳,要不要清洗发动机还是看你自己车有没有积碳的表现,如果没有就不必清洗。防采集。

   由上而知若要优化select count(*) 或类似的语句,可考虑另外创建非聚集索引.如果select

演义就不说了,肯定会有人说。既然我是一方诸候,那肯定不能用有*野心的人。因此曹刘孙就不能用了。首先是自己要安全,所以护卫得给力,许褚典韦少不了。然后是内政,荀彧是不二人选。之所以是荀彧,除了治国才能之外,还有其颕川世家的背景,曹魏很多人都是冲着荀氏叔侄去的。郭奉孝就是荀彧推荐的,可见其识人之能。第三是守城,这需要文武兼备,陈登程昱当仁不让。程昱演义把他描绘成谋臣了,但实际上他是文武双全,胆略过人。尝以区区700人守城,抵御袁绍十万大军,并且拒绝曹操增援,曹操赞曰:“程昱之胆,过于贲、育”。其晚年得宠不惊,激流勇退,得以善终。陈登是个了不起的人,文武兼备!暗侵伊粮咚,沉深有大略,少有扶世济民防采集。

count(*) 语句包含WHERE 子句或 Group by 子句,则索引最好建立在子句所引用的字段上.

当然数据库维护索引是需要代价的,设计时应通盘考虑.

   当数据表中的记录非常多时,不论怎样建立索引,查询记录总数都还是需要一定时间. 如果

我们不希望查询影响数据表的更新操作,则可以考虑使用WITH(NOLOCK) 查询提示.

如 select * from table WITH(NOLOCK) ,允许数据库引擎在统计过程中更新数据,或在更新

中途执行统计查询,牺牲查询结果的准确性换取并发性能. 顺便说一句,这里的NOLOCK并不

是什么数据都不锁,而是READUNCOMMITTED, 即允许读取可能会最终回滚(即放弃)的中间

数据.在SQL Server2005 中,如果启用了基于行版本控制的隔离级别,则WITH(NOLOCK)就

不需要了.数据库默认为已提交读隔离级别,可通过将READ_COMMITTED_SNAPSHOT 数据

库选项设置为ON来使用行版本控制, 如下:

ALTER DATABASE AdvertureWorks SET READ_COMMITTED_SNAPSHOT ON;

    如果我们只是希望简单得到表中记录的总数而不指定过滤条件,则无需执行

Select count(*) 语句, 调用sp_spaceused 存储过程几乎可立即得到结果.

如: EXEC  sp_spaceused 'table_name'  该存储过程返回包含多个字段的统计结果,其中

rows 字段即为记录总数. 这是由于默认情况下,数据库引擎自动更新表及索引的统计信息.

不过数据库管理员可以修改这一默认设置,如果您是数据库管理员,则可放心使用这个存储

过程. 在SQL Server2005中,您会发现sys.partitions 视图比 sp_spaceused存储过程更好用.

   如果数据表中包含自动增长字段,且在该字段上建有索引,我们还可以通过 比较该字段的最

大值和最小值来估算记录的大致数量,因为在有索引的字段上调用MAX()和MIN()不需要逐一

扫描数据页. 该方式可以指定其他过滤条件.

如 select max(id) +1 -min(id) from 'table' where country='cn'

如果自增列增量不为1,则统计结果减倍.

   注意SQL Server中有多种原因会导致表中实际的自动增长字段不完全是连续增长的.

扩展阅读,根据您访问的内容系统为您准备了以下扩展内容,希望对您有帮助。

如何做SqlServer 数据查询优化!

影响查询效率的因素    

SQLServer处理查询计划的过程是这样的:在做完查询语句的词法、语法检查之后,将语句提交给SQLServer的查询优化器,查询优化器通过检查索引的存在性、有效性和基于列的统计数据来决定如何处理扫描、检索和连接,并生成若干执行计划,然后通过分析执行开销来评估每个执行计划,从中选出开销最小的执行计划,由预编译?槎杂锞浣写聿⑸刹檠婊,然后在合适的时间提交给系统处理执行,最后将执行结果返回给用户。所以,SQLServer中影响查询效率的因素主要有以下几种:

1.没有索引或者没有用到索引。索引是数据库中重要的数据结构,使用索引的目的是避免全表扫描,减少磁盘I/O,以加快查询速度。

2.没有创建计算列导致查询不优化。

3.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)。

4.返回了不必要的行和列。

5.查询语句不好,没有优化。其中包括:查询条件中操作符使用是否得当;查询条件中的数据类型是否兼容;对多个 表查询时,数据表的次序是否合理;多个选择条件查询时,选择条件的次序是否合理;是否合理安排联接选择运算等。

SQLServer数据查询优化方法

  3.1建立合适的索引  索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。当根据索引码的值搜索数据时,索引提供了对数据的快速访问。事实上,没有索引,数据库也能根据SELECT语句成功地检索到结果,但随着表变得越来越大,使用“适当”的索引的效果就越来越明显。索引的使用要恰到好处,其使用原则有:

(1)对于基本表,不宜建立过多的索引;

(2)对于那些查询频度高,实时性要求高的数据一定要建立索引,而对于其他的数据不考虑建立索引;

(3)在经常进行连接,但是没有指定为外键的列上建立索引;

(4)在频繁进行排序或分组(即进行groupby或 orderby操作)的列上建立索引;

(5)在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度;

(6)如果待排序的列有多个,可以在这些列上建立复合索引! ≡赟QLServer中,索引按索引表达式包含的列分为单列索引和复合索引。检查查询语句的where子句,因为这是优化器重要关注的地方。包含在where里面的每一列都是可能的侯选索引,为能达到最优的性能,例如:对于在where子句中给出了 column1这个列,下面的两个条件可以提高索引的优化查询性能!

第一:在表中的column1列上有一个单索引;

第二:在表中有多索引,但是 column1是第一个索引的列。避免定义多索引而column1是第二个或后面的索引,这样的索引不能优化服务器性能。例如:下面的例子用了pubs数据库! ELECTau_id,au_lname,au_fname  FROMauthorsWHEREau_lname=’White’  按下面几个列上建立的索引将会是对优化器有用的索引  au_lname  au_lname,au_fname  而在下面几个列上建立的索引将不会对优化器起到好的作用  au_address  au_fname,au_lname  在SQLServer中,索引按存储结构分为聚簇索引和非聚簇索引。聚簇索引是按照定义数据列值的顺序在物理上对记录排序,在一个表上只能有一个聚簇索引,聚簇索引查询速度较快,但缺点是对表进行修改操作时速度较慢,因为为了保证表中记录的物理顺序与索引的顺序一致,必须将记录插入到数据页的相应位置,从而数据页中的数据必须重排。在下面的几个情况下,可以考虑用聚簇索引:

(1)某列包括的不同值的个数是有限的(但是不是极少的)。如顾客表的州名列有50个左右的不同州名的缩写值,可以使用聚簇索引! 

(2)对返回一定范围内值的列可以使用聚簇索引,如用between,>,>=,   Select*fromsaleswhereord_datebetween’5/1/93’and’6/1/93’  

(3)对查询时返回大量结果的列可以使用聚簇索引! ELECT*FROMphonebookWHERElast_name=’Smith’  当有大量的行正在被插入表中时,要避免在本表一个自然增长(例如,identity列)的列上建立聚簇索引。如果你建立了聚簇的索引,那么insert的性能就会大大降低。因为每一个插入的行必须到表的最后,表的最后一个数据页。

非聚簇索引指定表中的逻辑顺序,一个表上可以建立多达249个非聚簇索引,它查询的速度比不建立索引快,但比聚簇索引慢,插入数据比聚簇索引快,因为纪录直接被追加到数据末尾?梢栽谝韵虑榭鱿驴悸鞘褂梅蔷鄞厮饕。

(1)在有很多不同值的列上可以考虑使用非聚簇索引,如employee表中的emp_id列可以建立非聚簇索引。

(2)查询结果集返回的是少量或单行的结果集。例如  

select*fromemployeewhereemp_id=’pcm9809f’  

(3)查询语句中orderby子句的列上可以考虑使用非聚簇索引。

  3.2常用的计算字段(如总计、最大值等)可以考虑存储到数据库实体中! ±绮挚夤芾硐低持杏胁牧先肟獗,其字段为:材料编号、材料名称、型号,单价,数量…,而金额是用户经常需要在查询和报表中用到的,在表的记录量很大时,有必要把金额作为一个独立的字段加入到表中。这里可以采用触发器以在客户端保持数据的一致性。

  3.3用where子句来*必须处理的行数! ≡谥葱幸桓霾檠,用一个where子句来*必须处理的行数,除非完全需要,否则应该避免在一个表中无*地读并处理所有的行。例如:  |||   select qty from sales where stor_id=’7131’是很有效的,比无*的查询selectqtyfromsales有效,避免给客户的最后数据选择返回大量的结果集。当然也可以用TOP*返回结果集的行数。

  3.4尽量使用数字型字段! ∫徊糠挚⑷嗽焙褪菘夤芾砣嗽毕不栋寻敌畔⒌淖侄紊杓莆址,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

  3.5查询语句的优化! 《杂谝惶醺丛拥牟檠锞淅此,对相同查询条件的实现一般总可以有多种不同的表达方法,而不同的表达会使数据库的响应速度大相径庭。据统计,约有80%以上的性能问题是由于使用了不恰当的查询语句造成的,因此SQL语句的质量对整个系统效率有重大关系。

下面介绍查询语句优化方面的一些技巧:

(1)避免使用不兼容的数据类型。例如float和int、char和varchar、 binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:   SELECTnameFROMemployeeWHEREsalary>60000  在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。这条语句可以改为:  SELECTnameFROMemployeeWHEREsalary>$60000

(2)尽量避免在Where条件里使用非聚合表达式,因为非聚合表达式很难利用到索引,通常SQLServer不得不进行大规模的扫描。像!=或<>、 ISNULL或ISNOTNULL、IN,NOTIN等这样的操作符构成的表达式都是非聚合表达式。非聚合表达式会导致查询效率大大降低。例如:   SELECTidFROMemployeeWHEREid!='B%'  优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

(3)尽量避免在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:  

SELECT*FROMemployeeWHEREsalary/2=100应改为: 

SELECT*FROMemployeeWHEREsalary=100*2   SELECT*FROMemployeeWHERESUBSTRING(emp_id,1,3)=’PCM’应改为:

SELECT*FROMemployeeWHEREemp_idLIKE‘5378%’   SELECTmember_number,first_name,last_nameFROMmembers   WHEREDATEDIFF(yy,datofbirth,GETDATE())>21应改为:

SELECT member_number,first_name,last_name FROM members WHERE dateofbirth  即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

(4)避免使用LEFTJOIN   SQL的一个有价值的常用功能是LEFTJOIN。它可以用于检索第一个表中的所有行、第二个表中所有匹配的行、以及第二个表中与第一个表中不匹配的所有行。例如,如果希望返回每个客户及其定单,使用LEFTJOIN则可以显示有定单和没有定单的客户。LEFTJOIN消耗的资源非常之多,因为它们包含与 NULL(不存在)数据匹配的数据。因此在构造查询语句时尽量避免使用LEFTJOIN。

(5)尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引! 〖缦吕樱骸 

SELECT*FROMmembersWHEREfirst_nameLIKE‘%MA%’   SELECT*FROMmembersWHERESUBSTING(first_name,3,1)=’MA’   SELECT*FROMmembersWHEREfirst_nameLIKE‘MA%’  即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。(6)避免相关子查询  一个列的标签同时在主查询和 WHERE子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询? 以采用子查询“展平”技术,将子查询转变为连接,半连接或反连接,从而达到优化查询的目的。例如查询找出有工资超过10000的职工所在的部门名称!  SELECT部门名FROM部门WHERE部门号IN  (SELECT部门号FROM职工WHERE工资>10000)  此查询将扫描部门表的 每一行查找所有满足子查询条件的职工记录?梢越棵疟碜魑拥哪诒,在这种情况下,查询作为通常的连接来执行,首先对职工表进行唯一的部门号筛选,以 消除冗余的部门号,转化后的语句为:  SELECTB.部门名FROM(SELECTDISTINCT部门号FROM职工WHERE工 资>10000,部门DWHEREB.部门号=D.部门号  对于SQL语句的优化方法还有很多,在这里就不一一例举了。

SQL数据库内表太多,查询一次要半个多小时,如何优化?

你说的是腾讯泄漏的那个QQ群数据库吧!

for GroupData = 1 to 11

conn.open "PROVIDER=SQLOLEDB;DATA SOURCE=****;UID=sa;PWD=sa;DATABASE=GroupData"&GroupData

for Group = (GroupData-1)*100+1 to (GroupData)*100

exec = "SELECT * FROM Group"&Group&" where QQNum = 375000016"

set rs=server.createobject("adodb.recordset")

rs.open exec,conn,1,1

if not rs.eof then

response.write(Rs("Nick")+"<br>")

else

response.write("表"&Group&"没有记录"+"<br>")

end if

rs.close

next

next

SQL Server 视图查询慢,如何优化?请不要复制粘贴谢谢

慢的原因在:【DELETE_FLAG IN ('R', 'X', 'U', 'D')】,查询中出现【in】的话数据库会解析成下面这个样子去执行。

【DELETE_FLAG='R' OR DELETE_FLAG='X' OR DELETE_FLAG='U' OR DELETE_FLAG='D'】

而数据库一旦使用了【OR】条件做查询的话,索引就不会用到了,因此就会造成查询过慢。

建议:

SELECT 。。。。。

WHERE DELETE_FLAG='R'

UNION

SELECT 。。。。。

WHERE DELETE_FLAG='X'

UNION

SELECT 。。。。。

WHERE DELETE_FLAG='U'

UNION

SELECT 。。。。。

WHERE DELETE_FLAG='D'

另外补充一点,视图本身就会造成效率低,因为视图存的是sql定义,当执行查询的时候 数据库会先上磁盘上查询视图定义 再利用视图定义查询数据,这样就产生了至少两次磁盘i/o,oracle中有物化视图的概念,SqlServer中应该也有,如果我的改善计划还不能达到你的要求的话,建议考虑一下。

---

以上,希望对你有所帮助。

www.vw-sh.com true http://www.vw-sh.com/exploit/160/1601380.html report 47964 从统计数据表记录总数谈SQL_Server查询优化,对于selectcount(*),倘若表中有多个索引,则SQLServer的处理与通常的查询语句不同.在统计刻录总数时,聚集索引向来得不到数据库引擎的宠幸,除非WHERE子句中包含聚集索引所在的字段.WHY?我们知道,大量的磁盘I/O是非常耗时的.扫...
娱乐时尚
历史文化
真视界
旅游美食
精彩图文
我爱我车
母婴健康
关于本站 | 广告服务 | 手机版 | 商务合作 | 免责申明 | 招聘信息 | 联系我们
Copyright © 2004-2018 book1234.com All Rights Reserved. 布客网 版权所有
京ICP备10044368号-1 京公网安备11010802011102号
教育考试: 学历财经建筑 医药公考资格外语电脑作文招聘中小学留学 文档 移民 文库专栏23问答中心z资讯z资讯1资讯涨资讯涨资讯1资讯问答图书馆知识IT编程数码信息解决方案信息中心IT科技问答新闻中心软件教室设计大全网络相关英语学习开发编程考试中心参考范文管理文库营销中心站长之家IT信息中心商学院数码大全硬件DIY企业服务网吧在线百科硬件知识手机平板汽车游戏家电精彩摄影现代家居IT女人经验健康养生猎奇创业攻略教育学习历史时尚潮流最近更新涨知识
北京快乐8 天天棋牌| 建筑安装| 斗牛棋牌| 天天棋牌| 棋牌游戏|