楼主: linwehao

[优化] RMB2000求数据库优化

[复制链接]
论坛徽章:
5
优秀写手
日期:2014-03-26 05:59:56马上有钱
日期:2014-10-30 16:45:50白羊座
日期:2015-11-10 11:35:01秀才
日期:2015-12-25 15:31:10秀才
日期:2016-01-25 15:02:04
11#
发表于 2015-7-21 22:13 | 只看该作者
就是在A表中每读一条记录就在B表中插入一条读取记录,读取A表记录时先要查询B表中是否存在读取过的记录
读取记录如果不存在就插入,如果存在就更新B表中记录的A表的读取记录的次数是吧?
根据你的描述,服务器硬件足够用了,我觉得锁是造成你这个性能问题的主要原因
首先A表和B表的查询在索引上做好优化,这是最基本的,除了优化索引,可以考虑从方案上做出改变

1,可以考虑对B表的插入或者更新采用异步的方式,保证客户端查询时优先返回查询结果,异步记录对A表的查询信息,需要在应用程序段做修改
2,如果不想在应用程序段做修改,可以考虑对B表分表,因为在往B表中Insert数据或者Update B表的记录时,是一个排他锁,将对并发有较大的影响,可以按照A表数据的类别,将读取记录记录到不同的表中,相当于把B表拆分成多个表,如果想统计这些表的信息,就简单了,合并成一个视图就行了

目前就想到这两点,不过我估计早就有高人搞定你这个需求了,哈哈

使用道具 举报

回复
论坛徽章:
5
优秀写手
日期:2014-03-26 05:59:56马上有钱
日期:2014-10-30 16:45:50白羊座
日期:2015-11-10 11:35:01秀才
日期:2015-12-25 15:31:10秀才
日期:2016-01-25 15:02:04
12#
发表于 2015-7-21 22:29 | 只看该作者
  1. drop table A
  2. create table A
  3. (
  4.         col1 varchar(50),
  5.         col2 varchar(50),
  6.         col3 varchar(50)
  7. )
  8. insert into A values (NEWID(),NEWID(),NEWID())
  9. go 50000
  10. create clustered index index_1 on A (col1)
  11. create table B
  12. (
  13.         col1 varchar(50),
  14.         readcount int
  15. )
  16. create clustered index index_1 on B (col1)
  17. select * from A
  18. select * from B
  19. select * from A where  A.col1='7C4C852D-9065-47A0-8939-85013BBD3873'
  20. MERGE B  
  21. USING (select col1 from A where A.col1='7C4C852D-9065-47A0-8939-85013BBD3873') AS T
  22. ON B.col1=T.col1   
  23. WHEN MATCHED THEN UPDATE SET B.readcount=B.readcount+1 --如果记录匹配,就更新目标表的匹配行
  24. WHEN NOT MATCHED THEN INSERT(col1,readcount) VALUES(T.col1,1); --如果记录不匹配,就插入一条数据
复制代码


模仿100个线程,每个线程读取100次,好像也没那么慢

使用道具 举报

回复
论坛徽章:
5
优秀写手
日期:2014-03-26 05:59:56马上有钱
日期:2014-10-30 16:45:50白羊座
日期:2015-11-10 11:35:01秀才
日期:2015-12-25 15:31:10秀才
日期:2016-01-25 15:02:04
13#
发表于 2015-7-21 22:43 | 只看该作者
本帖最后由 WY24420 于 2015-7-21 22:45 编辑

突然想到,如果是高并发的环境,要防止热点页的问题,如果A表的主键列是自增的,对A表的访问又集中在某个特定的范围,
如果B表中存储的是A表的主键列上件聚集索引
就想办法尽可能把A的主键列在B表中分散存储,加一个GUID做聚集索引,
避免多个会话去修改的数据在一个页面上,造成另外的阀锁等待
我这个测试是想当然的,很多东西体现不出来,都是要根据具体情况做优化的

如果有人帮楼主搞定了,方便的话分享一下经验,多跟大神们学习学习

使用道具 举报

回复
论坛徽章:
54
秀才
日期:2017-02-22 15:18:002015年新春福章
日期:2015-03-06 11:57:31懒羊羊
日期:2015-03-04 14:48:16马上有对象
日期:2014-10-24 17:37:552014年世界杯参赛球队: 比利时
日期:2014-08-05 11:35:382014年世界杯参赛球队: 阿根廷
日期:2014-07-15 10:49:33马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11路虎
日期:2014-01-02 12:55:56ITPUB社区12周年站庆徽章
日期:2013-10-08 15:00:34
14#
发表于 2015-7-22 12:15 | 只看该作者
简单的N个测试套路,不能涵盖现实中各种各样不同情况的场景
如果读下孙子兵法就是军事专家,太多玩军事的都该退出江湖
万物归宗:实事求是

使用道具 举报

回复
论坛徽章:
0
15#
发表于 2015-7-22 12:27 | 只看该作者
各位都把问题复杂化了,问题出在NewId()函数,这个要全表扫描,并发情况下效率较低

使用道具 举报

回复
论坛徽章:
5
优秀写手
日期:2014-03-26 05:59:56马上有钱
日期:2014-10-30 16:45:50白羊座
日期:2015-11-10 11:35:01秀才
日期:2015-12-25 15:31:10秀才
日期:2016-01-25 15:02:04
16#
发表于 2015-7-22 13:40 | 只看该作者
本帖最后由 WY24420 于 2015-7-22 13:41 编辑
luckyrandom 发表于 2015-7-22 12:15
简单的N个测试套路,不能涵盖现实中各种各样不同情况的场景
如果读下孙子兵法就是军事专家,太多玩军事的都 ...
其实也没那么玄乎,测试的话要想到各种各样的情况,我反倒是觉得比现实情况更加复杂才有说服力
现实情况下,造成性能问题极有可能是常见原因之一或者之二或者之三,绝对不可能是十个八个原因一起造成的,这样把具体的问题抛出来就更容易下手

说个经历吧
以前面试的时候,经常由面试官问,有没有千万级表的处理经验,他们觉得千万级的表就是大表,
如果一个人认为千万级的表就是大表的话,他就根本没怎么接触过稍微大一点点的数据库,
也许N多年来也就是玩几万几十万数据的微型数据库
因为真正接触了才发现,N个千万级表的数据库,sql只要写的不是太烂,有基本的优化常识,
根本不会发生什么性能问题,不像传说中的那么玄乎


使用道具 举报

回复
论坛徽章:
54
秀才
日期:2017-02-22 15:18:002015年新春福章
日期:2015-03-06 11:57:31懒羊羊
日期:2015-03-04 14:48:16马上有对象
日期:2014-10-24 17:37:552014年世界杯参赛球队: 比利时
日期:2014-08-05 11:35:382014年世界杯参赛球队: 阿根廷
日期:2014-07-15 10:49:33马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11路虎
日期:2014-01-02 12:55:56ITPUB社区12周年站庆徽章
日期:2013-10-08 15:00:34
17#
发表于 2015-7-22 15:12 | 只看该作者
技术是死的,一就是一,二就是二,恰恰不是玄乎
倒是太多场景下很多人忽略了问题细节、DB特点而已
或者说没用正确的招式解决特定的问题
对于多数情况,满足用户需求就是好方案,不一定需要达到最优、最好、最强

使用道具 举报

回复
论坛徽章:
9
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47技术图书徽章
日期:2017-02-09 17:05:19秀才
日期:2017-02-22 15:16:26秀才
日期:2017-02-22 15:18:00现任管理团队成员
日期:2017-06-03 02:10:11版主1段
日期:2017-06-05 09:06:08秀才
日期:2017-08-18 11:04:35秀才
日期:2017-09-18 17:02:49
18#
发表于 2015-7-22 16:02 | 只看该作者
eddyabc 发表于 2015-7-22 12:27
各位都把问题复杂化了,问题出在NewId()函数,这个要全表扫描,并发情况下效率较低

你说到了问题的关键之处,但是怎么解决呢

使用道具 举报

回复
论坛徽章:
0
19#
发表于 2015-7-22 16:10 | 只看该作者
呵呵,付款贴代码

使用道具 举报

回复
论坛徽章:
5
优秀写手
日期:2014-03-26 05:59:56马上有钱
日期:2014-10-30 16:45:50白羊座
日期:2015-11-10 11:35:01秀才
日期:2015-12-25 15:31:10秀才
日期:2016-01-25 15:02:04
20#
发表于 2015-7-22 20:44 | 只看该作者
luckyrandom 发表于 2015-7-22 15:12
技术是死的,一就是一,二就是二,恰恰不是玄乎
倒是太多场景下很多人忽略了问题细节、DB特点而已
或者说 ...

估计楼主的问题被你搞定了,可否分享一下经验

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表