| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2826 人关注过本帖, 1 人收藏
标题:新人求助:如何实现按某一字段的值排名,且相同的值排名相同?
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
SQL的Join处理,是十字交叉相乘,把两个表的记录十字相乘得到一个庞大的记录集,然后再筛选出要求的结果,很明显只有在物理内存足以容纳两个表十字相乘结果的时候,它免去硬盘交换,才显得快,当数据表记录大的时候,那个结果相当恐怖(消耗不光看记录数,还看每条记录的总字节数),这就是SQL Server要求内存大、硬盘速度也快的根本原因,一旦涉及虚拟内存页面交换,它的效率立马下降,靠硬盘响应速度来补救。所以,在什么程度上SQL查询的效率高到哪里去,是可以推想得到的。平时在小数据量时,物理内存够大,你们没意识到这种问题而已,就总以为SQL查询的效率比vfp自己还快,殊不知FoxPro的快名不是吹的,在桌面数据库中,它认第二,无人敢认第一。如果不是要跑网络,受线路瓶颈限制,在单机上用SQL指令,一定是没见过什么是快的人。


[ 本帖最后由 TonyDeng 于 2015-1-23 20:18 编辑 ]

授人以渔,不授人以鱼。
2015-01-23 20:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在网络环境,哪怕是局域网那样比广域网带宽大得多的环境,SQL查询的记录集一旦到两三百条记录,就会感觉到卡顿,若是一万几千,几乎是死机的体验。这就是web页面上设计的数据浏览一定不会有许多记录的原因,还要反复开导用户,千万不要做一次得到很多结果的查询,尽量把查询条件写准确,以期得到最少的记录集,无非是为了网路传输快。

在数据库服务器中,如果被大量用户同时发起查询,它也会“死机”,其性质相当于“拒绝服务攻击”,所以它指望用户错峰查询。大公司的服务器阵列,投资那么恐怖,道理就在这里。后来又兴起分布式查询,也是为了解决这类问题,把负担分散在每台计算机上,甚至让客户的终端机也承担查询任务。


[ 本帖最后由 TonyDeng 于 2015-1-23 20:37 编辑 ]

授人以渔,不授人以鱼。
2015-01-23 20:30
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 39楼 TonyDeng
此路不通,没想出好办法。

坚守VFP最后的阵地
2015-01-25 20:36
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:989
专家分:4966
注 册:2013-2-16
收藏
得分:0 
虽然这帖子已经结了,还是进来顶一下,因为kiff的帖子让我学到东西了,谢谢。
2015-01-28 17:03
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用TonyDeng在2015-1-23 20:07:19的发言:

建立索引的操作,基本上是把表遍历一趟,同时生成磁盘文件,那个时间可作为衡量最高处理速度的指标,只要是对全表操作,一定不会比这个时间短(免写盘的例外会快一点)。在那个110万记录的表中(实际上对两个表建索引,另一个是1.8万条记录),创建索引用时7s左右,还顺带把每条记录的一个字段刷写了一遍。而在后期的数据统计中,两趟扫描是17s多,正是一趟的大约2倍。


苦思冥想一周,问题终于解决了。

1、初始化过程:用TOTAL命令分组合并DQKC表中的MENGE字段的值,再与KCZS表中的TOTAL字段的值相减的差保存在TEMP字段中,这一过程耗时 7 秒。
2、数据处理过程:用KCZS表做为主表,对DQKC表数据进行替换处理(一趟数据处理),耗时在 4 秒之内。

两个过程总耗时控制在 11 秒内(硬件配置不同,可能有差别)

[ 本帖最后由 sdta 于 2015-1-29 13:05 编辑 ]

坚守VFP最后的阵地
2015-01-29 12:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
4s?很好啊!

授人以渔,不授人以鱼。
2015-01-30 23:00
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 46楼 TonyDeng
以前对索引的功能没能引起重视,使用VFP中的SQL命令较多。通过这个示例,在数据表中记录超过百万的情况下,合理的使用索引,可以大大减少程序的运行时间。

坚守VFP最后的阵地
2015-01-30 23:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
要使SQL查询高效,必须使用索引,这是在张洪举的书中讲过的。事实上,SQL查询是一段智能算法程序,当数据库有索引时,它主动使用合适的索引;当数据库没有合适的索引或甚至没有索引时,它会自动创建索引。如果SQL程序发现查询请求无法创建合适的索引,它的效率跟普通的算法一样。使用传统的指令,达到高效的目的,其实也是要善用索引,这个时候,不过是自己写一段替代SQL的程序而已,就如我们可以用SCAN...ENDSCAN循环替代REPLACE ALL一样,后者的内部代码实际上就是前者。不懂用传统的算法解决问题,动辄求助于SQL,让对方替你做,即是全求人,一旦到下属(发令SQL查询就是让对方当你的下属)无法满足某种精细要求时,自己却不会动手了,那样是学不到编程的。还是老话,在我看来,初学者一开始浸入SQL指令,是绝对学不到什么的,他们能编一些程序,也是花架子。

授人以渔,不授人以鱼。
2015-01-31 00:05
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
select sum(menge) from dqkc order by matnr,werks,lgort group by matnr,werks,lgort
查询出结果,10秒左右

Total to tsum on matnr + werks + lgort fields menge

查询出结果,3秒以内

用的是一个表

坚守VFP最后的阵地
2015-01-31 00:13
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 46楼 TonyDeng
用两表关联的方法,数据处理部分,运行时间还有减少的空间,3秒多一点。总体时间在10秒
Set Relation to 表达式 into 别名
数据处理所用时间,最多只有初始化过程时间的一半。

[ 本帖最后由 sdta 于 2015-2-1 18:42 编辑 ]

坚守VFP最后的阵地
2015-02-01 18:35
快速回复:新人求助:如何实现按某一字段的值排名,且相同的值排名相同?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044502 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved