社区
MS-SQL Server
帖子详情
多对多表怎样设计才能高性能访问(上千万条的记录)?请高人指点
sheyu8
2005-07-04 10:23:39
多对多设计
tbl_User: UID类型 varchar
tbl_Group: GID类型 varchar
用户和群组是多对多的关系:
tbl_GroupAndUser:GID,UID
现在有5000万数据,在多对多表里查用户数据比较慢,
不知道有什么好的办法提高性能?
如果把用户UID改为bigint作为tbl_GroupAndUser:的次主键不知道行不行,请高人
指点,谢谢
...全文
717
9
打赏
收藏
多对多表怎样设计才能高性能访问(上千万条的记录)?请高人指点
多对多设计 tbl_User: UID类型 varchar tbl_Group: GID类型 varchar 用户和群组是多对多的关系: tbl_GroupAndUser:GID,UID 现在有5000万数据,在多对多表里查用户数据比较慢, 不知道有什么好的办法提高性能? 如果把用户UID改为bigint作为tbl_GroupAndUser:的次主键不知道行不行,请高人 指点,谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bugchen888
2005-07-12
打赏
举报
回复
楼主最好把SQL帖出来看看。
bugchen888
2005-07-12
打赏
举报
回复
怎么把Oracle的索引优化帖过来了。。。。
天地客人
2005-07-12
打赏
举报
回复
标题 索引在数据库中的应用分析 选择自 hellenlong 的 Blog
关键字 索引在数据库中的应用分析
出处
索引是提高数据查询最有效的方法,也是最难全面掌握的技术,因为正确的索引可能使效率提高10000倍,而无效的索
引可能是浪费了数据库空间,甚至大大降低查询性能。
索引的管理成本
1、 存储索引的磁盘空间
2、 执行数据修改操作(INSERT、UPDATE、DELETE)产生的索引维护
3、 在数据处理时回需额外的回退空间。
实际数据修改测试:
一个表有字段A、B、C,同时进行插入10000行记录测试
在没有建索引时平均完成时间是2.9秒
在对A字段建索引后平均完成时间是6.7秒
在对A字段和B字段建索引后平均完成时间是10.3秒
在对A字段、B字段和C字段都建索引后平均完成时间是11.7秒
从以上测试结果可以明显看出索引对数据修改产生的影响
索引按存储方法分类
B*树索引
B*树索引是最常用的索引,其存储结构类似书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于书的大目
录,叶块相当于索引到的具体的书页。一般索引及唯一约束索引都使用B*树索引。
位图索引
位图索引储存主要用来节省空间,减少ORACLE对数据块的访问,它采用位图偏移方式来与表的行ID号对应,采用位图索
引一般是重复值太多的表字段。位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量
的删除、修改、新建操作,ORACLE每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚
至死锁现象。在OLAP(数据分析处理)中应用位图有优势,因为OLAP中大部分是对数据库的查询操作,而且一般采用数
据仓库技术,所以大量数据采用位图索引节省空间比较明显。
索引按功能分类
唯一索引
唯一索引有两个作用,一个是数据约束,一个是数据索引,其中数据约束主要用来保证数据的完整性,唯一索引产生的
索引记录中每一条记录都对应一个唯一的ROWID。
主关键字索引
主关键字索引产生的索引同唯一索引,只不过它是在数据库建立主关键字时系统自动建立的。
一般索引
一般索引不产生数据约束作用,其功能主要是对字段建立索引表,以提高数据查询速度。
索引按索引对象分类
单列索引(表单个字段的索引)
多列索引(表多个字段的索引)
函数索引(对字段进行函数运算的索引)
建立函数索引的方法:
create index 收费日期索引 on GC_DFSS(trunc(sk_rq))
create index 完全客户编号索引 on yhzl(qc_bh||kh_bh)
在对函数进行了索引后,如果当前会话要引用应设置当前会话的query_rewrite_enabled为TRUE。
alter session set query_rewrite_enabled=true
注:如果对用户函数进行索引的话,那用户函数应加上 deterministic参数,意思是函数在输入值固定的情况下返回值
也固定。例:
create or replace function trunc_add(input_date date)return date deterministic
as
begin
return trunc(input_date+1);
end trunc_add;
应用索引的扫描分类
INDEX UNIQUE SCAN(按索引唯一值扫描)
select * from zl_yhjbqk where hbs_bh='5420016000'
INDEX RANGE SCAN(按索引值范围扫描)
select * from zl_yhjbqk where hbs_bh>'5420016000'
select * from zl_yhjbqk where qc_bh>'7001'
INDEX FAST FULL SCAN(按索引值快速全部扫描)
select hbs_bh from zl_yhjbqk order by hbs_bh
select count(*) from zl_yhjbqk
select qc_bh from zl_yhjbqk group by qc_bh
什么情况下应该建立索引
表的主关键字
自动建立唯一索引
如zl_yhjbqk(用户基本情况)中的hbs_bh(户标识编号)
表的字段唯一约束
ORACLE利用索引来保证数据的完整性
如lc_hj(流程环节)中的lc_bh+hj_sx(流程编号+环节顺序)
直接条件查询的字段
在SQL中用于条件约束的字段
如zl_yhjbqk(用户基本情况)中的qc_bh(区册编号)
select * from zl_yhjbqk where qc_bh=’7001’
查询中与其它表关联的字段
字段常常建立了外键关系
如zl_ydcf(用电成份)中的jldb_bh(计量点表编号)
select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh=’540100214511’
查询中排序的字段
排序的字段如果通过索引去访问那将大大提高排序速度
select * from zl_yhjbqk order by qc_bh(建立qc_bh索引)
select * from zl_yhjbqk where qc_bh='7001' order by cb_sx(建立qc_bh+cb_sx索引,注:只是一个索引,其中包
括qc_bh和cb_sx字段)
查询中统计或分组统计的字段
select max(hbs_bh) from zl_yhjbqk
select qc_bh,count(*) from zl_yhjbqk group by qc_bh
什么情况下应不建或少建索引
表记录太少
如果一个表只有5条记录,采用索引去访问记录的话,那首先需访问索引表,再通过索引表访问数据表,一般索引表与数
据表不在同一个数据块,这种情况下ORACLE至少要往返读取数据块两次。而不用索引的情况下ORACLE会将所有的数据一
次读出,处理速度显然会比用索引快。
如表zl_sybm(使用部门)一般只有几条记录,除了主关键字外对任何一个字段建索引都不会产生性能优化,实际上如果
对这个表进行了统计分析后ORACLE也不会用你建的索引,而是自动执行全表访问。如:
select * from zl_sybm where sydw_bh='5401'(对sydw_bh建立索引不会产生性能优化)
经常插入、删除、修改的表
对一些经常处理的业务表应在查询允许的情况下尽量减少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等业务表。
数据重复且分布平均的表字段
假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一
般不会提高数据库的查询速度。
经常和主字段一块查询但主字段索引值比较多的表字段
如gc_dfss(电费实收)表经常按收费序号、户标识编号、抄表日期、电费发生年月、操作标志来具体查询某一笔收款的
情况,如果将所有的字段都建在一个索引里那将会增加数据的修改、插入、删除时间,从实际上分析一笔收款如果按收
费序号索引就已经将记录减少到只有几条,如果再按后面的几个字段索引查询将对性能不产生太大的影响。
如何只通过索引返回结果
一个索引一般包括单个或多个字段,如果能不访问表直接应用索引就返回结果那将大大提高数据库查询的性能。对比以
下三个SQL,其中对表zl_yhjbqk的hbs_bh和qc_bh字段建立了索引:
1 select hbs_bh,qc_bh,xh_bz from zl_yhjbqk where qc_bh=’7001’
执行路径:
SELECT STATEMENT, GOAL = CHOOSE 11 265 5565
TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 5565
INDEX RANGE SCAN DLYX 区册索引 1 265
平均执行时间(0.078秒)
2 select hbs_bh,qc_bh from zl_yhjbqk where qc_bh=’7001’
执行路径:
SELECT STATEMENT, GOAL = CHOOSE 11 265 3710
TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 3710
INDEX RANGE SCAN DLYX 区册索引 1 265
平均执行时间(0.078秒)
3 select qc_bh from zl_yhjbqk where qc_bh=’7001’
执行路径:
SELECT STATEMENT, GOAL = CHOOSE 1 265 1060
INDEX RANGE SCAN DLYX 区册索引 1 265 1060
平均执行时间(0.062秒)
从执行结果可以看出第三条SQL的效率最高。执行路径可以看出第1、2条SQL都多执行了TABLE ACCESS BY INDEX ROWID(
通过ROWID访问表) 这个步骤,因为返回的结果列中包括当前使用索引(qc_bh)中未索引的列(hbs_bh,xh_bz),而第3
条SQL直接通过QC_BH返回了结果,这就是通过索引直接返回结果的方法。
如何重建索引
alter index 表电量结果表主键 rebuild
如何快速新建大数据量表的索引
如果一个表的记录达到100万以上的话,要对其中一个字段建索引可能要花很长的时间,甚至导致服务器数据库死机,因
为在建索引的时候ORACLE要将索引字段所有的内容取出并进行全面排序,数据量大的话可能导致服务器排序内存不足而
引用磁盘交换空间进行,这将严重影响服务器数据库的工作。解决方法是增大数据库启动初始化中的排序内存参数,如
果要进行大量的索引修改可以设置10M以上的排序内存(ORACLE缺省大小为64K),在索引建立完成后应将参数修改回来
,因为在实际OLTP数据库应用中一般不会用到这么大的排序内存。
昵称被占用了
2005-07-12
打赏
举报
回复
类型是个问题,应该根据情况改成快一些的,我想你说的5000万数据是指tbl_GroupAndUser,而对于tbl_User和tbl_Group,int也许就够,根据数据量选int或者bigint。
还要注意索引,tbl_User和tbl_Group表UID和GID都应该是主键,tbl_GroupAndUser表的主键根据查询情况选择(UID,GID)和(GID,UID)中的一个,另一个应该建立索引。
ghostzxp
2005-07-06
打赏
举报
回复
狂建带索引的视图!
chenlj188
2005-07-06
打赏
举报
回复
大哥,用varchar类型当然慢了,建议调整表结构,建立主键。
sheyu8
2005-07-05
打赏
举报
回复
怎么没人顶啊
giveusomecolor
2005-07-05
打赏
举报
回复
帮你顶~~~~
铁歌
2005-07-04
打赏
举报
回复
建议用bigint类型的,int连接就是快些
电子学习资料实验指导书电子线路课程
设计
题
电子学习资料实验指导书电子线路课程
设计
题
非标自动化滤清盒自动组装机3D数模+STP格式.rar
非标自动化滤清盒自动组装机3D数模+STP格式.rar
游戏开发基于Python的贪吃蛇小游戏
设计
与实现:核心逻辑、状态管理与Pygame渲染技术详解
内容概要:本文档是一份关于开发经典小游戏“贪吃蛇”的保姆级毕业
设计
指导文档,涵盖从游戏规则、功能
设计
、技术选型到核心代码实现的完整流程。文档以Python + Pygame为技术栈,详细讲解了游戏初始化、蛇的移动逻辑、食物生成、碰撞检测、计分与等级系统、键盘控制及主循环渲染等核心模块,并提供了完整的项目结构和源码示例。采用状态机管理游戏状态,使用列
表
模拟链
表
结构存储蛇身,结合方向缓冲机制优化操作体验,同时引入难度递增机制提升可玩性。文末还列举了飞机大战、扫雷、五子棋等同类课题作为拓展参考。; 适合人群:具备一定编程基础、正在进行毕业
设计
或课程
设计
的学生,尤其是对游戏开发感兴趣的初级开发者。; 使用场景及目标:①帮助学生独立完成一个功能完整、结构清晰的小游戏项目,用于毕业答辩或课程展示;②深入理解事件驱动编程、状态管理、碰撞检测、定时刷新等基础编程概念;③掌握Python + Pygame开发2D小游戏的核心技能,并具备二次开发与功能拓展能力。; 阅读建议:建议读者按照“规则→
设计
→代码→运行”的顺序逐步学习,动手实践每个模块并调试代码,重点关注方向缓冲、状态机、食物生成算法等
设计
细节,同时可尝试实现文末提出的拓展功能以增强项目亮点。
自动化测试实战项目开发全套模板(pytest+requests+Allure 接口自动化)
内容概要:接口自动化测试从 0 到 1 的完整工具包,含 7 个文件:①自动化测试项目结构模板(config/common/data/testcases 分层目录
设计
说明);②可直接运行的 pytest 接口用例模板(登录/下单/支付链路 + 参数化 + allure 标注);③测试报告与 Allure 集成指南(安装、命令、指标解读、GitLab CI 示例);④测试用例
设计
模板 Excel(正常/边界/异常/权限场景,关联需求与风险,内置 10 条示例);⑤接口测试数据驱动模板 Excel(
请
求构造 + 期望结果分离,数据与代码解耦);⑥自动化测试计划模板 Excel(范围/排期/风险/资源四
表
);⑦AI 提示词模板合集(生成用例、数据驱动改造、封装工具类、测试计划共 6 个模板 + 3 种进阶用法)。 适用人群:测试工程师、后端开发、全栈开发、测试负责人。 使用场景及目标:新项目搭建接口自动化测试框架直接套用;已有项目对照结构自查补齐数据驱动与报告能力;配合 AI 辅助约 10 分钟产出用例初稿,快速提升测试覆盖与回归效率。
前端开发基于history.js的HTML5与HTML4浏览器兼容方案:单页应用无刷新历史状态管理技术实现-50eEO1788270362
内容概要:本文系统介绍了如何利用history.js实现单页应用(SPA)在HTML5c与HTML4浏览器间s草错发的无缝历史状态管理。通过封装原生History API并在不支持的浏览器中自动降级为哈希路由,history.js解决了因浏览器兼容性导致的后退按钮失效、URL混乱等问题。文章详细讲解了其核心机制,包括状态对象管理、自动模式切换(HTML5 pushState vs HTML4 哈希)、状态数据持久化以及针,对Safari、IE等浏\览器的兼容性修复方案,并提供了从入门到实战的完整示例,涵盖初始化、事,件监听、页面加载及性能优化技巧。;50eEO1788270362 https://www.ahdmhbkj.cn/zuqiuliansai/fajia/ https://www.ahdmhbkj.cn/zuqiuliansai/dejia/ https://www.ahdmhbkj.cn/zuqiuliansai/yijia/ https://www.ahdmhbkj.cn/live/zuqiu/2908.html https://www.ahdmhbkj.cn/news/zuqiu/44355.html
MS-SQL Server
34,876
社区成员
254,638
社区内容
发帖
与我相关
我的任务
MS-SQL Server
MS-SQL Server相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章