作者okdla (跟着乡民进来看热闹)
看板PHP
标题Re: [请益] mssql_query的问题
时间Mon Mar 17 23:33:37 2008
※ 引述《okdla (跟着乡民进来看热闹)》之铭言:
: 不知道有人遇过这个问题吗???
: 我用mssql_query撷取3万笔资料结果当掉了
: 出现allowed memory size of xxx bytes...
: 我上google去找解决的方法...发现可以用ini_set("memory_lmit",xx)
: 来解决,於是我把我的memory_limit一直加大到500M,终於解决了
: 可是因为资料笔数会一直增加,所以以後查询的时候一定又会爆记忆体
: 那我就必须一直增加memory_limit,可是主机的记忆体大小只有1G,电脑上的
: 分页记忆大小也才500M,这样会对主机有什麽不好的影响吗???
: 再来就是,mssql并不像mysql有limit 的功能,虽然有top 但是却不是很好用
: 所以在撷取资料的时候没有办法分页的撷取....只能一次把全部的资料取出来
: 然後再用mssql_data_seek去做分页..可是一但资料笔数很多再加上查询的栏位很多..
: 就会如同上述一样出现当掉的讯息...不知道有没有什麽方法能够解决呢???
我找到解决的方法了...
我发现当mssql_query这个程式在每次查询200笔(是依我的资料表来说)之内memory都不会
增加(我是用memory_get_usage来实验的)
所以如果要查上万笔的资料只要做回圈利用top n 和 order by 来抓取资料进阵列
就不会有记忆体冲爆的问题了...
3万笔资料(以我的资料表来说)的memory用阵列储存不会超过250M(不过栏位一定不能有text)
所以这个方法在资料笔数小於10万笔(可能memory_limit要设大到900M)都蛮好用的...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.230.168.159
1F:→ okdla:我发现php里有内建可以做分页的 mssql_fetch_batch函式... 03/18 20:37
2F:→ lslong:你这样的做法当系统在比较多人情使用的情况下..系统会死 03/19 12:02
3F:→ lslong:资料库..并不是单纯只用来存放资料用的..加油吧 03/19 12:03
4F:→ w3c:我是没用过MSSQL~不过就我的经验 在讨论效能问题时遇到资料库 03/19 13:13
5F:→ w3c:都会抓SQL指令出来一起检讨,没式子讨论再多也没用 03/19 13:14
6F:→ w3c:连你资料库如何规画也不清楚 ~ 03/19 13:15
7F:→ w3c:更何况,你这种例子最根本的解决方法就是在crontab写一支程式 03/19 13:18
8F:→ w3c:固定一段时间统计资料到另一个table去,并给与一个FLAG 03/19 13:19
9F:→ w3c:下次统计时再从FLAG开始计算,之後只要直接读取该table内的 03/19 13:20
10F:→ w3c:资料即可 03/19 13:20
11F:→ w3c:效能问题不就解决了? 03/19 13:21
12F:→ w3c:如果 你的统计用的SQL指令连JOIN IF 这些东西都没用到 03/19 13:21
13F:→ w3c:超过十万笔就会慢,真的很怀疑你规划的资料库有问题 ~ 03/19 13:21
14F:→ okdla:2F有更好的方法吗??? 03/20 00:30
15F:→ lslong:上次就跟你说过了..请设index.. 03/20 11:03
16F:→ lslong:你现在面对的只是3~5万笔..就会挂掉.一定是什麽index都没设 03/20 11:04
17F:→ lslong:index的确会稍微影响新增/修改时的时间..但你在设定没有太 03/20 11:06
18F:→ lslong:大的问题下..对新增/修改的慢你根本感觉不出来 03/20 11:06