手机号码中国代码代款是骗人的吗?

中国领先的IT技术网站
51CTO旗下网站
如何通过格式良好的SQL提高效率和准确性
在本文中,作者将分享如何通过格式良好的SQL语句提升生产率。
作者:翻译:冯昀辉来源:TechTarget中国| 10:31
格式良好的SQL并不会比乱七八糟的SQL运行效果更好。数据库其实不怎么关心SQL语句中你把逗号放到了字段名的前面还是后面。为了你自己思路清楚,应该做一个有效率的SQL编写者,我建议你遵守以下这些格式规则。在本文中我将分享如何通过格式良好的SQL语句提升生产率。我定义的效率指的是能从SQL 输出准确的结果,并且代码清晰易于理解、修改和调试。我只列出了&SELECT&语句,因为我写的SQL语句99%都是查询语句。格式化SQL代码是非常个性化的事,我也很清楚因人而异,开发者都认为自己的格式化规则是最合理的。
下面是一个典型的SQL应用场景,业务报表的数据来自三张表,客户表、销售表和地域表。基于2015年一月份的数据,该报表需要展示在每个行政区内的客户总数和销量总数。该需求通过一个简单的SQL语句就可以实现,需要关联查询三张表。
数据可能出现的问题
虽然SQL很简单,但保证你的结果正确仍然是真正的关键,因为有下面一些原因可能导致错误:
数据可能来自不同的数据源。也就是说你不能保证这几个表之间的完整性。具体举例来说,你不能假定客户表中所有的邮政编码都是有效的邮政编码,并且一定在地域表中存在。
录入客户表数据的应用可能捕获到未经验证的地点数据,可能会包括错误的邮政编码。
邮政编码表可能不是完整的。新发布的邮政编码可能没有在发布后及时导入到表中。
对我来说,相比于编写清晰易读的SQL,从SQL得到正确的结果才是第一要务。我要做的第一件事就是编写下面的SQL语句来获取客户总数。在我写完整个语句之后我会再调整它。
我写的第一个语句是这样的:
SELECTCOUNT(DISTINCT&cust_id)&as&count_customersFROMcustomers&&Result:&&count_customers&&&10&&
这个查询很重要,因为它紧紧围绕第一原则。因为没有SQL管理查询,也就没有依赖,我知道这就是客户数量的正确结果。我把这个结果记下来,因为我总需要拿这个数字来衡量后面的SQL(是否正确),在本文后面也会多次提到。
下一步要做的事就是添加必要的字段和表完成查询。我特意把&添加&这个词高亮标注出来,因为根据我的规则,我会在应用第一原则时把能获取相同结果的查询注释掉。下面就是我最终格式化的查询语句。
下面就是根据我的格式化思路推荐的格式化SQL。
SELECT&&0&&,c.cust_post_code&&,p.location&&,COUNT(DISTINCT&c.cust_id)&number_customers&&,SUM(s.total_amount)&as&total_sales&&FROM&&customers&c&&JOIN&post_codes&p&ON&c.cust_post_code&=&p.post_code&&JOIN&sales&s&ON&c.cust_id&=&s.cust_id&&WHERE&&1=1&&AND&s.sales_date&BETWEEN&&&&AND&&&&&&AND&s.order_id&=&5&&GROUP&BY&&c.cust_post_code&&,p.location&
总是使用表别名
时间会证明这么做是有必要的。如果你没有对SQL语句中用到的每个字段使用别名,在将来某个时候可能会给这个查询语句添加进来别的同名字段。到那时候你的查询乃至报表就会产生错误(出现了重名字段名)。
逗号放到字段之前
在调试或者测试我的查询语句时,这么做可以方便地注释掉某个字段,而不需要修改其它行,所有的逗号都没有缺少或多余。不这么做的话你可能总要调整逗号才能保证语句正确。如果你经常要调试语句,这么做会带来极大方便,效率会更高。这个做法对&SELECT&部分和&GROUP BY&子句部分同样适用。
在开发时我使用&SELECT 0&作为语句的开始,迁移到正式环境时它很容易删除掉。这样我们就可以在后面所有字段前面都写都好了。没有这个&0&的话,如果我想注释掉第一个字段(本例中是&c.cust_post_code&),我就必须处理后面的逗号问题。我必须临时注释掉它,将来还要加回来。在&GROUP BY&语句中也是一样的。这个&0&是额外加的。
把&JOIN&放到独立行
把&JOIN&语句放到独立行有以下好处:
这么做很容易看到本查询语句涉及的所有表,只需要看滚动&JOIN&语句就可以了。
使用&JOIN&相比于在&WHERE&子句中列出所有表和表达式关系,可以把所有逻辑关系都放到一个地方。我们不可能总是吧&JOIN&语句放到一行中,但是至少应该放到一起。
这么做的话要注释掉&JOIN&语句也是相对容易的。这在调试时非常有用,你可能需要知道是否是&JOIN&引起了数据问题。
列模式编辑
在处理大量字段的情况时,列模式编辑非常方便。下面是我曾经做过的第一个动态GIF展示,你可以注释掉所有非聚集字段。我使用了列模式编辑,而不仅仅是注释掉字段:
创建全部索引
在使用字段较多的UNION语句时:
注释掉&GROUP BY&子句的字段清单
测试查询结果
我必须使用外连接&OUTER&列出所有客户,因为不是所有客户的邮政编码都在地域表里有相应的邮政编码。我可以通过包含和排除不同字段和表反复操作来确保我查询的结果与最开始那个查询(单独查询客户的那个语句)结果相同,这其实是对第一原则的遵守。
SELECT0,c.cust_post_code&,p.location,COUNT(DISTINCT&c.cust_id)&number_customers,SUM(s.total_amount)&as&total_salesFROMcustomers&c&LEFT&OUTER&JOIN&post_codes&p&ON&c.cust_post_code&=&p.post_codeJOIN&sales&s&ON&c.cust_id&=&s.cust_idWHERE1=1AND&s.sales_date&BETWEEN&&&&AND&&&&AND&c.cust_post_code&=&2000&AND&p.post_code&=&200GROUP&BYc.cust_post_code&,p.location&
像这样的SQL对我来说意味着我必须写独立的测试来检查数据。通过注释掉的那几行语句我可以使用第一原则验证我查询数据的准确性。这么做提高了我的效率和报表的准确性。
原文链接:【编辑推荐】【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点头条热点头条头条
24H热文一周话题本月最赞
讲师:22人学习过
讲师:7人学习过
讲师:12人学习过
精选博文论坛热帖下载排行
本书全面深入地介绍网络安全的配置与实现技术,包括系统管理、用户账户、病毒防御、灾难恢复、文件备份、安全策略、注册表等服务器安全,用...
订阅51CTO邮刊如何编写高效的SQL查询语句
如何编写性能比较高的SQL查询语句呢?两个方法:创建合理的索引;书写高效的SQL语句
索引的基本原理
索引分为聚集索引和非聚集索引。一个表只能创建一个聚集索引和N个非聚集索引,这句话的由来主要是由于索引的原理决定的。
中的一张表不论你创建不创建索引,或者,不论你创建那种类型的索引,其在硬盘上的存储是一样的,那么,创建索引和不创建索引,或者,创建聚集索引和非聚集索引的区别在什么地方呢?
其区别是表内数据在内存的存在形式。对于没有创建索引的表,其加载到内存里时,就只有数据块;对于有聚集索引的表,其加载到内存时,会形成一棵树,且叶子节点上就是具体的数据;对于非聚集索引的表(没有聚集索引时),其加载内存时,真实数据为一个独立的块,其索引会形成一个索引树,索引数据的叶子节点对应的是真实数据块的rowid;对于既有非聚集索引,又有聚集索引的表,其加载到内存时,会形成两棵树,具体的数据和聚集索引树在一起,非聚集索引独自有一棵树,此时需要注意,其叶子节点中存放的时聚集索引的index,然后,通过聚集索引的index再去,聚集索引树中找到具体的数据。这个就是为什么一个表只能有一个聚集索引,可以有多个非聚集索引的原理。
vcq9vs3Kx8q508NTUUwgU2VydmVyIFByb2ZpbGVyuaS+3yi5pL7foapTUUwKIFNlcnZlciBQcm9maWxlcimjrLDv1vrO0sPHvODM/da00NC1xFNRTNPvvuS1xNa00NDH6b/2o6zV4tbWt73Kvbj8ysrTw9PaztLDx9Tas8zQ8tbQzt63qMzhyKFTUUzT777ktcTH6b/2oaM8L3A+Cgo8aDE+1PXR+bS0vai6z8DttcTL99L9o788L2gxPgo8cD4gICAgICAgzai5/cnPw+a1xLe9t6ijrM7Sw8e/ydLU1qq1wM7Sw8e1xFNRTNPvvuS1xLrDu7WjrLbU09q7tbXEU1FMo6zO0sPH0qrP67eoyei3qLXEvfjQ0M/g06a1xLjEseSjrLWrysejrLbU09q7tbXEU1FM0+++5KOsztLDx9Ta08W7r7XEyrG68qOs19y1w9Kq1qq1wMbkzsrM4rP21NrBy8TEwO+wyaOssrvE3Mu1ztK+zcTHw7S1xLjEwcujrMv50tSjrLTLyrGjrM7Sw8fQ6NKqwcvB7dK7uPa5pL7fo6yw79b6ztLDx7fWzvajrLy0o7rWtNDQvMa7rsrTzbyjqLLp0a+hqs/Uyr7WtNDQtcSy6dGvvMa7rqOpo6zNqLn91rTQ0LzGu66jrL/J1qq1wM7Sw8dTUUzT777k1NrWtNDQsunRr7XEyrG68qOsyrnTw8HLu7nKx8O709DKudPDy/fS/aGj1NrV4sDvvenJ3DPW0LLp0a+1xLe9yr2junRhYmxlCiBzY2Fuo6xpbmRleCBzY2Fuo6xpbmRleCBzZWVroaM8L3A+CjxwPiAgICAgICAgdGFibGUgc2Nhbr7NysfIq7HtyajD6KOs1rG909Ta1ebKtbXEyv2+3b/p1tC9+NDQyKuyv8mow+iju2luZGV4IHNjYW6+zcrH1NrL99L9yvfJz7340NDIq8mow+ijrLTLyrHI57n7yse+27yvy/fS/aOsvs274daxvdO1w7W9z+DTprXEyv2+3SjSttfTyc++zcrHvt/M5bXEyv2+3SmjrMjnufvKx7fHvtu8r8v30v2jrNTy0OjSqrvxtcPSttfTyc/P4NOmtcS+27yvy/fS/bz8o6zIu7rzo6zU2bj5vt2+27yvy/fS/bz81Nq+27yvy/fS/cr31tDV0rW9z+DTprXE1ebKtcr9vt2ju2luZGV4IHNjYW6+zcrHy/fS/cr3yc+1xMvRy/ejrNXi1ta3vcq9tcTKtc/WuPrG5MTasr+1xNStwO3T0LnYo6zS8s6q1eK49srHyvejrMv50tSjrLj5vt3Su9Cpy+O3qCi2/rLmtci1yCm/ydLUv+zL2bXEtqjOu7W9vt/M5bXEyv2+3aOs1eK49tKyt9bOqr7bvK+6zbfHvtu8r6Os1NrV4sDvsrvU2de4yvahozwvcD4KPHA+ICAgICAgIM2ouf3WtNDQvMa7rqOsztLDx7/J0tTWqrXAo6zO0sPHtcRTUUzT777k1NrEx7/pw7vT0Mq508PL99L9o6zIu7rzo6zO0sPHv8nS1LjEU1FM0+++5KOs0rK/ydLUtLS9qM/g06a1xMv30v2jrNXiwO/Q6NKq1qq1wKOssqKyu8rHyrnTw8HLy/fS/b7N0ru2qL/po6zI57n7xOO1xMr9vt23x7OjtcTQoaOsyOe5+8TjtLS9qLXEy/fS/bfHs6O1xLbgo6zEx8O0o6y/ycTcu+G05tTa1eLW1sfpv/ajurK7yOfIq7Hty/fS/bXEv+mho8v50tSjrNTa08W7r87Sw8e1xFNRTMqxo6zO0sPHvqHBv8350tHT0LXEy/fS/cnPv7/Co6OsyrXP1rK70NDBy6OsxMfDtKOsuPm+3cr9vt3Bv7XEtuDJ2aOsztLDx7+0v7SjrMrHt/HQ6NKq1Nm0tL2oz+DTprXEy/fS/aGjPC9wPgoKPGgxPtT1w7TR+bLFxNzK6dC0uN/Qp7XEU1FMsunRr9PvvuSjvzwvaDE+CjxwPjwvcD4KPHA+ICAgICAgIMnPw+bSu7/pxNrI3c7Sw8fWqrXAwcujrM7Sw8e1xFNRTNPvvuTTprjDvqG/ycTctcTP8tLR09C1xMv30v2/v8Kjo6zEx8O0o6zI57n7ssXE3Mq508O1vdLR09C1xMv30v3E2KO/xOO/ycTcu+HLtaOsztLDx7bgtLS9qNK70KnL99L9sru+zdDQwcvC76OsyrXU2rK70NDDv7j2wdC2vMrH0ru49sv30v2jrNXi0fmyu77Nv8nS1Mq508O1vcHLy/fS/cHLwu+jrLC01dXE48u1tcTV4tbWx+m/9qOsztLDx7nDx9Kyu7+8wsfG5Mv8o6y+zcjPzqpTUUzT777k1rTQ0LXEyrG68qOsyrnTw8HLy/fS/b7Nyse/7KOstavKx6OsztLP68u1tcTKx6OsvLDKscTjw7+49sHQyc+2vLS0vajJz8v30v2jrNKysru8+7XDxOPQtLXEU1FM0+++5NTa1rTQ0LXEyrG68r7NysfKudPDtb3By2luZGV4IHNlZWujrM6qyrLDtMTYo7/S8s6qz7XNs9Tat9bO9sTjtcRTUUzT777kyrGjrM7et6jV0rW90ru49rrPwO21xGluZGV4CiBzZWVrtcTWtNDQvMa7rqOsxMfDtKOs1PXDtNH50LTO0sPHtcRTUUzT777ko6yyxb/J0tTKuc+1zbO+rbn9t9bO9rrzo6y1w7W9tcTWtNDQvMa7rsDvyrnTw7W9wctpbmRleCBzZWVrxNijv9T1w7TR+dC0ztLDx7XEU1FM0+++5LLFv8nS1LXDtb3X7tPFtcTWtNDQvMa7rsTYo788L3A+CjxwPiAgICAgICAgMaGisunRr8HQtcTTxbuvPC9wPgo8cD4gICAgICAgICAgICAgINPDtb2x7dbQtcTEx7j2wdC+zXNlbGVjdMuto6yyu9Kqc2VsZWN0ICogo6yz/bfHxOPDv7j2wdC2vMq508OjrNLyzqpzZWxlY3QgKiC6zXNlbGVjdCDL+dPQwdDKx9K70fm1xDwvcD4KPHA+ICAgICAgICAyoaJ3aGVyZbLp0a/M9bz+tcTTxbuvPC9wPgo8cD4gICAgICAgICAgICAgILK70qq21Mz1vP7B0L340NDP4NOmtcSy2df3o6zI56O61NrB0MnPyrnTw7qvyv2jrMHQvfjQ0Mr9vt3A4NDNtcTXqru7o6zB0MnPyrnTw7LOyv3Uy8vjt/soZmlsZWQgJiM0Mzsg"aaa'),在列上使用不可参数化的条件(like '%a',not……,or……等),这些都会使索引的实现大大折扣,或者直接就丧失
不要使用游标,可以使用集合条件查询代码游标;使用exists代替count(*)进行数据存在与否的验证
索引多了不见得好,没有索引不见得不好;索引的有无,是根据具体的数据量来说的;该列是否要建立索引,是根据这个列在查询时作为条件查询的比重;好的SQL语句,不仅要向索引靠拢,也要屏蔽不必要的数据和执行次数。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'I$$&年第I期计算机系统应;&&&B?&;BM’-;.,30+0N012+’3&.;摘要!在B’’d2’0&?0&中如何;3!问题提出;(是数基于二维关系表的数据库管理系统’R)B’据;应用系统现场运行%个月后#开始出现复杂条件查询取;到数据引起的$继续检查’d2语句为单表查询#但是;问题是
I$$&年第I期计算机系统应
&&&B?&’-/’-中大数据量表的查询优化
BM’-;.,30+0N012+’3&.9&03&5$-2’9$3M+/.5M+’%.&&&B?&’-/’-尹永顺!!中国科学院研究生院软件学院3$$$#c&
摘要!在B’’d2’0&?0&中如何处理记录条数I$$$万以上且每日增加I$万条的数据表&相信是很多开发人员面临的难题#本文以实际案例描述了此问题的解决方法及其存在的问题#在’d2’0&?0&I$$$中&可以通过分区视图的定义来支持大数据量表的水平拆分和查询时的数据合并&且查询引擎提供的优化机制&使得’d2’0&?0&在大数据量条件下的查询性能得到了明显改进#最后&指出了本解决方法所带来的问题及其适用范围#
3!问题提出
(是数基于二维关系表的数据库管理系统’R)B’据处理的核心#承担着是信息系统中业务数据的存储&管理的功能$目前#比较典型的数据库产品包括4.C.0==#B’’d2’0&?0&#+&-.80#R)I等$本人最近参与开发的网管系统#就采用了微软的B’’d2’0&?0&I$$$数据库系统$
应用系统现场运行%个月后#开始出现复杂条件查询取不回来结果的情况$经过检查发现#故障是由d2语句查询超时#导致应用程序得不于复杂条件的’
到数据引起的$继续检查’d2语句为单表查询#但是$$$万#且每天增加I$万$很明显#该表记录数将近I
问题是由于查询数据表中记录过多引起的$
这是一个很典型的数据库问题#即采用何种方法$$$万以上(表的查询优化0才能实现大数据量’I
’I(定义分区视图合并小表中的数据#应用程序通过视图访问所需的数据&
(在小表中定义查询引擎所需的主键和.’#/0.^约束&
’%(调整应用程序中对数据的访问方式&接下来#将详细介绍具体的优化处理内容$IH3原数据表结构
原数据表DGo/9W&o=0.@9&o/;=@9&F#用来存放所有小区的性能指标的历史数据#共保存有a个月的数据#每天新增加I$万条#半年数据量约#a$$万$表结构定义如下%
.Q/H.D,\L41L14)2L79Go/9W&o=0.@9&o/;=@9&F/’0.@9&o;Q/.?-&./-&/’I$]22.=(O#0.9&QoQ-@0/.?-&./-&/’&$+1O]22.&(O#.=@-&@o9Zo;E@0&?-8/.?-&./-&/’&$(O+1O]22#EQo9Zo;E@0&?-8/.?-&./-&/’&$+1O]22.0(O#(O#..;@FoE-G0/.?-&./-&/’&$]22..(O#;@Fo;Q/../-&/’3$]22G.oE-G0/../-&/’3$]22.9(O#.7(O#@=oE-G0/.?-&./-&/’&$]22G.o;Q/.=G-88;E@+1O]22.9/O#Q/.=G-88;E@+1O]22.GGo;/O#.=/O#W7Jo;Qo3/.=G-88;E@+1O]22W7Jo;QoI/.=G-88;E@+1O]22.=/O#/O#.Z$$3/.Z89-@]22.Z/O#$$I/.Z89-@]22$$#/.Z89-@]22#--#.Z/O3cc/.Z89-@]22.Z/O#I$$/.Z89-@]22.Z/O
-!&#$%&$#’()*+&&+,$+实践经验
I!解决方法
大数据量表的查询属于数据库优化的一个方面#可以按照尽量减少N*+数量的原则进行$具体来说#就是采用水平分区的方法#将一个表分割成结构相同的多个表#每个表都只包括大表中的一部分数据行$这样#查询时就可以只查找包含查询结果数据行的一*+数量大两个小表#而不用查找整个大表#从而使得N幅降低#查询时响应速度得到很大提升$
在B’’d2’0&?0&I$$$中#可以通过分区视图来实现表的水平分区#进而解决大数据量表的查询超时问题$下文将以本系统的数据表(Bo5+]\o’L,1+\o5N’1+\m为例进行介绍$主要的实现方法包括%
(以月份为单位将数据表拆分为多张小表&’3
计算机系统应用I$$&年第I
(+O.(\NB4\m/
由于篇幅原因#中间省略了部分字段$
该数据表主键定义如下%.&0.9&QoQ-@0/#.=@-&@o9Zo;E@0&?-8/#.0EQo9Zo;E@0&?-8/#.9G.o;Q/#.GGo;Q/#W7Jo;Qo3/#.=W7Jo;QoI/$.=
IHI数据表拆分
对表进行水平分区#首先要确定数据拆分的原则$一般来说#可以采用按时间&区域&或其他业务分类标示来进行#应当使数据尽可能均匀分布到多张小表中#且查询引用的表尽可能少$否则#用于在查询时按逻ON+O操作就会过多#从而会影响性能$辑合并表的]
本文中数据按时间增加#可以采用按照时间进行分拆的方法$因此#考虑按月将(Bo5+]\o’L,1+\o5N’1+\m分拆成小表#每月一张#每个小表的数据结构和原表相同$拆分后的小表如下所示%
DGo/9W&o=0.@9&oI$$%$3DGo/9W&o=0.@9&oI$$%$IDGo/9W&o=0.@9&oI$$%$#--IH#查询数据合并
*+的数量#但是增加了查表分区减少了查询时N
询时的表选择的负担$’d2’0&?0&通过使用分区视图将数据合并#通过单一视图面对应用程序#这样在查询数据时可以不必手动引用相应的基础表$分区视图的定义如下%
,\L41L?;06DGo/9W&o=0.@9&o/;=@9&Fo?;06-==080.@&9GDGo/9W&o=0.@9&oI$$%$3!ZWE;9E-88
=080.@&9GDGo/9W&o=0.@9&oI$$%$I!ZWE;9E-88
=080.@&9GDGo/9W&o=0.@9&oI$$%$#!ZWE;9E-88
&9GDGo/9W&o=0.@9&oI$$%$%=080.@!Z--IH%查询优化的条件
分区视图使得开发人员不需要直接引用分拆后的基础表#但是最为关键的是’d2’0&?0&查询引擎针对分区视图做的优化$即针对该视图执行的任何查询都被优化成只搜索查询结果所涉及的基础表#其余表自动忽略$这才是分区视图中最为核心的内容$
分区视图创建后#分区视图的优化能否发挥作用还有着一些限制条件’具体内容请参考B’’d2’0&?0&
-实践经验!&#$%&$#’()*+&&+,$+
联机帮助(#主要限制是通过每张表必须建立,/0.^约束#限制该表所能存放的数据范围#且彼此的范围不能重叠$这样#’d2’0&?0&才能知道数据的分布状况#从而做出相应的优化选择$
具体本数据表#需要作如下调整%
;G0o;Q字段#EWG0&;.类型#存(每张小表增加@’3
放时间信息#格式FFFFGGQQ//GG
’I(每张小表建立主键#包括如下字段%@#;G0o;Q9G.o;QQW7Jo;Qo3W7Jo;QoI$’@;G0o;Q需要#GGo;#=#=设置为第一个字段(
’#(每张小表建立约束’./0.^(#在@;G0o;Q字段建立约束#限制表中数据的范围#如DGo/9W&o=0.@9&oI$$%$3表上建立如下约束%@;G0o;Q70@600E#限制表中的只能是I$$%$3$3$$$$-EQI$$%$3#3I#&cI$$%年3月份的数据$其他小表照此处理$
’%(每张小表建立非聚簇索引’;EQ0T(#包括如;G0o;Q;@Fo;QG.o;QQW7Jo;Qo3下字段%@#.#9#GGo;#=##=$=W7Jo;QoI0.@9&o;Q
在上面调整中%
;G0o;Q字段不是分区视图优化所必需!增加@
0.9&QoQ-@0的#而是由于原数据表中时间分别存放在&
’GG*’/%GG格QQ*FFFF格式(和=@-&@o9Zo;E@0&?-8/式(字段中#使用不方便#且字段为?-&./-&类型#作为主键效率也不高#所以做的优化调整$
&增加非聚簇索引不是分区视图优化所必需的#而是针对该表的常用查询语句所作的优化$
至此#分区视图已经创建完毕#接下来需要对应用程序进行必要的调整$IH&分区视图的使用
分区视图创建时#如果能够保持视图名称&结构和原来数据表的完全一致#应用程序就可以直接使用#不用做任何修改$满足某些特定条件#分区视图还可以更新数据$
由于本次优化时没有使用原来数据表的名称#且表主键进行了调整#因此应用程序中查询语句的需要按如下方法进行修改%
’3(原来查询语句的数据表更换为新创建的分区视图&
’I(原来的时间范围条件务必使用为新创建的@;G0o;Q$
下面以一条实际使用的查询语句的修改为例进行说明%
I$$&年第I期计算机系统应
i8语句’请注意黑体为需要修改的部!原来的=
分(%=080.@&0D8-.00.9&QoQ-@0‘kk‘=@-&@o9Zo;E@0&?-8’&#k#k(-Mk*k=开始时间#0EQo9Zo;E@0&?-8-=结束时间##+,;@FoNR-=城市#+B,oNQ-=+B,oNRB,oO-G0-=+B,名称#GGo;Q-=,)’,oNRW7Jo;Qo3-=)1’oNR##=Z$&$-=k业务信道负载率k$#a-=k业务信道拥塞率k#ZZ&9GDGo/9W&o=0.@9&o/;=@9&F
(-6/0&03X3-EQ.;@Fo;Q;E’kE-EJ;E:kEQ9G.o;Q;E’k#$3kEQGGo;Q;E’k#$33k#$3Ik#$3#kEQ3X3-EQ(-#k#k(-#k#k#k#k.;@Fo;Q;E’kE-EJ;E:k6WT;k./-E:f/9Wkf/0EJ;-E:k#k(=Wf/9WkE-E@9E:k
’&-EQ.-=@0.9&QoQ-@0‘kk‘=@-&@o9Zo;E@0&?-8-=Q-@0C@;G00@600E.-=@I$$%M$3M3Ik‘kk‘k$3$$k-=(7’k%$%$(-’k%$%$Q-@0@;G0EQ.-=@I$$%M3M3%k‘kk‘k3I$$k-=(Q-@0@;G0
#k#k#k#k#k#k#k#k#k-EQ=W7Jo;Qo3;E’k3k3$k3$bk33k33&k3I3k3#k3bk3ckI$I$3kk#k(
#k#k-EQ=0.@9&o;Q;E’k#$33M3$M3k#$33M3$MIk#$33M3$M#k#$33M3$bM3k#$33M3$bMIk#$33M3$bM#k#k#k#k(#=#9#GGo9&Q0&7F&0.9&QoQ-@0@-&@o9Zo;E@0&?-8G.o;QW7Jo;Qo3;Q#=
i8语句’请注意黑体为修改后的部&修改后的=分(%
’&#k#k=080.@&0D8-.00.9&QoQ-@0‘kk‘=@-&@o9Zo;E@0&?-8Mk*=开始时间#0EQo9Zo;E@0&?-8-=结束时间#,;@FoNRk(-#+-=城市#+B,oNQ-=+B,oNRB,oO-G0-=+B,名Q-=,)’,oNRW7Jo;Qo3-=)1’oNR#Z$&$-=k称#GGo;#=业务信道负载率k$#a-=k业务信道拥塞率k#ZZ&9GDGo/9W&o=0.@9&o/;=@9&Fo?;06
(-6/0&03X3-EQ.;@Fo;Q;E’kE-EJ;E:kEQ9G.o;Q;E’k#$3kEQGGo;Q;E’k#$33k#$3Ik#$3#kEQ3X3-EQ(-#k#k(-.;@Fo;Q;E’kE-EJ;E:k6WT;k./-E:f/9Wkf/0EJ;-E:k#k#k#k#k#k(=Wf/9WkE-E@9E:k
-EQ@;G0o;Q70@600EI$$%$33I$3$$-EQI$$%$33%3I$$-EQ=W7Jo;Qo3;E’k3k3$k3$bk33k33&k3I3k3#k3bk3ckI$#k#k#k#k#k#k#k#k#kI$3kk#k(
#k#k-EQ=0.@9&o;Q;E’k#$33M3$M3k#$33M3$MIk#$33M3$#k#k#k(#$33M3$bM3k#$33M3$bMIk#$33M3$bM#kM#k9&Q0&7F&0.9&QoQ-@0@-&@o9Zo;E@0&?-8G.o;Q#=#9#GGo;QW7Jo;Qo3#=
IHa查询语句执行分析
在’d2’0&?0&的查询分析器中分别执行以上两条
查询语句#同时显示其查询计划$两者的查询计划有明显的差异%
前者对整个大数据表进行主键扫描#而后者只对查询结果所在的DGo/9W&o=0.@9&oI$$%$3表进行了非聚簇索引扫描$
大数据表中存放有%个月的数据#而在DGo/9W&o=0.@9&oI$$%$3表仅存放有一个月的数据#且索引项目已经覆盖了查询条件中所有条件#因此可以预计其执行速度会有明显提升$从实际的执行结果来看#前者$秒#而后者仅为I秒$执行时间约I
上述情况表明在B’’d2’0&?0&I$$$中的分区视图#不仅实现了数据表的水平分区#而且通过视图合并拆分后的小表#这样’d2查询尤为简单$系统内嵌的优化机制#使得系统大数据量条件下的查询性能得到了明显改进$
#存在问题和适用范围
分区视图虽然有着很强的功能#但是它的使用并不是没有代价的$有如下问题需要开发人员仔细考虑%
’3(按照时间存储数据的小表谁来创建#手工提前建好还是程序自动创建0
’I(小数据表增加以后#分布视图谁来负责更新0’#(小数据表和分区视图变动后#应用程序中用户的访问权限是否受到影响0
’%(数据以何种方式存储到数据小表中#是使用可更新的分区视图还是单独编写程序进行数据的存储0
由于分区视图使用的复杂性#在决定哪些数据表需要进行水平拆分时#需要慎重考虑$一般而言#如果数据表中的数据大于I$$$万#建议考虑使用本解决方法$如果不想采用本方法#可以参考本方法中’3(&’%(建立非聚簇索引的方式进行优化$
微软的’d2’0&?0&数据库在很多开发人员眼里#只是二流的产品#开发小型系统还可以#处理海量数据则根本不行$其实#’d2’0&?0&从bH$版本开始#性能已经大幅提$$$版本后#更是增强了许多功能#如4E8F=;=升#有其到I
’0&?;.0服务&数据复制&[B2集成&索引视图&分布式分区视图等等$据我所知#在实际业务系统中也有使用’d2’0&?0&管理&$$e以上数据的案例$
%页&%下转第a
-!&#$%&$#’()*+&&+,$+实践经验
#页%$上接第$
!!使用JE=J*+R*+来管理海量数据!一方面受硬件环境的限制!另一方面和数据库系统的配置&应用程序对数据库的使用方式有着很大的关系’稍不注意!就会使数据库成为系统的瓶颈’而数据库性能的优化!往往可以收到意想不到的效果!将系统的处理能力提高几倍’在本文中介绍了大数据量表的查询优化内容!只是数据库优化的一个方面’完整的数据库优化&创建和管理索引&数据涉及到内存使用&提高磁盘’?I分区&查询优化等诸多方面!内容繁杂而重要!希望能
-实用案例!&&#$%&’$()*&+,
与各位专家&同行探讨!也希望本文能起到抛砖引玉之功效’
#;8G+040Y)70+50+3)80(著&郭东青等译&数据库创建&#数据仓库与优化&清华大学出版社&%,,#.$&;JJ%;8G+040Y)70+50+3)80(E=J*+R*+%,,,联机丛书#
包含各类专业文献、文学作品欣赏、外语学习资料、生活休闲娱乐、专业论文、行业资料、MS+SQL+Server中大数据量表的查询优化56等内容。 
 数据库的查询优化_IT/计算机_专业资料。数据库查询优化...SELECT 语句在 SQL 语 句中又是代价最大的语句。...它支持 Oracle、Sybase、MS SQL Server 和 IBM DB2...  MS_SQL_Server中大数据量表... 4页 2财富值 SQL_Server的查询优化方法... 3页 2财富值喜欢此文档的还喜欢 SQLServer性能优化篇 8页 免费 Sql_server2005_优...  【摘要】 本文主要是对 ms sql server 数据库查询优化技巧进行了说明和分析, 对索引使用、 查询条件以及数据表的设计等进行了阐述。 【关键词】数据库;查询;优化...  ON 描述 SQL Server 查询优化器选择的数据检索方法...///en-us/library/ms190397....启动及运行时,指定 SQL Server 可以分配的最大内存...  就可以让多个硬盘同时进行查询,以 充分利用 CPU 和内存的性能,提高查询速度。 ...1.2:设置文件自动增长(大数据量,小数据量无需设置) 在 SQL Server 2005 中...  当SqlServer数据量很大时,如何优化表格能加快处理速度_IT/计算机_专业资料。当Sql...zipcode &“98000”,在执 行查询时就会利用索引来查询,显然会大大提高速度。 ...  SQL_Server大数据量统计系统的经验总结_IT/计算机_专业资料。SQL_Server大数据量...所以运算在生成中间表的过程中已经计算 根据查询,优化索引设计 根据数据查询特性,...  浅谈如何优化 SQL 语句提高数据库系统效率陈庆 1 (...-3- 数据库用时 356ms 1420ms 数据库用时 2580...子句后面的条件顺序对大数据量表的查询会产生直接的...  期中测验题_大型数据库(SQL SERVER)期中测验题_大型...... 数据文件和日志文件的最大尺寸为 20MB, .. ...【8 分】 若要查询‘刘才’职工的奖励次数,如何...

我要回帖

更多关于 手机号码代表的意思 的文章

 

随机推荐