【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗

时间:2022-09-18 14:53:48
看到一个游戏服务器 Oracle DBA 创建的所有表没有一个表有设置主键、索引、唯一,NOT NULL的。
Oracle数据库字段都不需要设置主键 、 索引 、 唯一
还是Oracle 设置了这些性能上也没有多大区别

19 个解决方案

#1


主键,索引,唯一是否设定由设计者决定,默认都是没有的。

设置和不设置的性能当然会有区别,这方面大部分数据库都是相通的。

#2


引用 楼主 default7 的回复:
看到一个游戏服务器 Oracle DBA 创建的所有表没有一个表有设置主键、索引、唯一,NOT NULL的。
Oracle数据库字段都不需要设置主键 、 索引 、 唯一
还是Oracle 设置了这些性能上也没有多大区别

好比在一本书查找东西,如果书的页码很少,有没有目录其实没什么影响。如果书的页码很多,目录就显得至关重要

#3


引用 1 楼 shiyiwan 的回复:
主键,索引,唯一是否设定由设计者决定,默认都是没有的。

设置和不设置的性能当然会有区别,这方面大部分数据库都是相通的。


用来做游戏服的数据库,数据很多。但是那名DBA确实没有设置主键,而且ID的值还可以相同。

#4


引用 3 楼 default7 的回复:
Quote: 引用 1 楼 shiyiwan 的回复:

主键,索引,唯一是否设定由设计者决定,默认都是没有的。

设置和不设置的性能当然会有区别,这方面大部分数据库都是相通的。


用来做游戏服的数据库,数据很多。但是那名DBA确实没有设置主键,而且ID的值还可以相同。

ID值相同就不能只基于ID设置主键了,主键值必须唯一。至于他们为什么没有设置主键,这个就搞不懂了,不知道是不是跟他们业务有关系。

#5


现在一般的游戏服务器,人数应该不是很多,少于一万个用户应该。。。又不是啥比较大型的游戏
人数少的,可以不用

#6


索引主要是提高查询性能,数据量大且关键字没有重复的话最好创建主键,数据量大关键字有重复的话可以创建索引。

#7


引用 6 楼 riveryh 的回复:
索引主要是提高查询性能,数据量大且关键字没有重复的话最好创建主键,数据量大关键字有重复的话可以创建索引。


我也觉得是啊,数据库为什么所有的表没有一个有主键,连索引都没有。不解,国内一很大型的游戏运营平台

#8


引用 4 楼 zlloct 的回复:
Quote: 引用 3 楼 default7 的回复:

Quote: 引用 1 楼 shiyiwan 的回复:

主键,索引,唯一是否设定由设计者决定,默认都是没有的。

设置和不设置的性能当然会有区别,这方面大部分数据库都是相通的。


用来做游戏服的数据库,数据很多。但是那名DBA确实没有设置主键,而且ID的值还可以相同。

ID值相同就不能只基于ID设置主键了,主键值必须唯一。至于他们为什么没有设置主键,这个就搞不懂了,不知道是不是跟他们业务有关系。


我觉得奇怪的几点:
1)Oracle数据表总共100个左右,但是没有一个表有设置主键或者索引。
2)PHP连接Oracle数据库,很长时间没有连接,如果再连接,那么第一次会非常非常卡,非常卡,5~10秒的等待。
3)Toad 连接Oracle又需要重新连接。



#9


也许人家是高手

#10


兼职dba呗。。

#11


引用 10 楼 huangdh12 的回复:
兼职dba呗。。


全职。

引用 9 楼 jvbss 的回复:
也许人家是高手

可能吧。

#12


【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗围观长姿势

#13


不知道是你们业务特殊需求,不设置主键、索引、唯一键。
建议在设计表时候要设计主键、索引、唯一键,这对性能有很大影响的,如果数据量不大的情况下不觉
如果数据量大的话,性能明显感觉低。

#14


表原则上是有主键的,这得依据业务上的。

#15


引用 13 楼 lzd_83 的回复:
不知道是你们业务特殊需求,不设置主键、索引、唯一键。
建议在设计表时候要设计主键、索引、唯一键,这对性能有很大影响的,如果数据量不大的情况下不觉
如果数据量大的话,性能明显感觉低。


没有主键Primary Key,现在弄得很麻烦,经常出现两条ID一样的记录。而且插入记录有的时候会ID为空。
DBA说如果设置主键会影响性能,因为占用存储空间。

#16


引用 14 楼 zhaoxiangchong 的回复:
表原则上是有主键的,这得依据业务上的。


用来当成主键的字段没有设置为主键,也没有加索引,更没有加唯一。
而且ID的值是拼出来的,而不是自动递增序列产生的。
比如一个无限极层级分类。
表字段:ID,UPID,NAME,
ID字段的记录是根据UPID ||  ( SELECT MAX(ID)+1 FROM TB WHERE UPID=$UPID)生成的 【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗

#17


引用 16 楼 default7 的回复:
用来当成主键的字段没有设置为主键,也没有加索引,更没有加唯一。
而且ID的值是拼出来的,而不是自动递增序列产生的。
比如一个无限极层级分类。
表字段:ID,UPID,NAME,
ID字段的记录是根据UPID ||  ( SELECT MAX(ID)+1 FROM TB WHERE UPID=$UPID)生成的 【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗


TB是现在讨论的表吗? 这个ID有没有其他表引用,如果没有现在还可以规范一下,解决数据冲突后设置成主键。

#18


引用 2 楼 zlloct 的回复:
Quote: 引用 楼主 default7 的回复:

看到一个游戏服务器 Oracle DBA 创建的所有表没有一个表有设置主键、索引、唯一,NOT NULL的。
Oracle数据库字段都不需要设置主键 、 索引 、 唯一
还是Oracle 设置了这些性能上也没有多大区别

好比在一本书查找东西,如果书的页码很少,有没有目录其实没什么影响。如果书的页码很多,目录就显得至关重要

比喻很恰当

#19


引用 17 楼 shiyiwan 的回复:
Quote: 引用 16 楼 default7 的回复:


用来当成主键的字段没有设置为主键,也没有加索引,更没有加唯一。
而且ID的值是拼出来的,而不是自动递增序列产生的。
比如一个无限极层级分类。
表字段:ID,UPID,NAME,
ID字段的记录是根据UPID ||  ( SELECT MAX(ID)+1 FROM TB WHERE UPID=$UPID)生成的 【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗


TB是现在讨论的表吗? 这个ID有没有其他表引用,如果没有现在还可以规范一下,解决数据冲突后设置成主键。


今天问了决策者,确实主键、索引是必须要有的。不过现在还没有加,他说是等所有做完了之后,再加上主键、索引。

#1


主键,索引,唯一是否设定由设计者决定,默认都是没有的。

设置和不设置的性能当然会有区别,这方面大部分数据库都是相通的。

#2


引用 楼主 default7 的回复:
看到一个游戏服务器 Oracle DBA 创建的所有表没有一个表有设置主键、索引、唯一,NOT NULL的。
Oracle数据库字段都不需要设置主键 、 索引 、 唯一
还是Oracle 设置了这些性能上也没有多大区别

好比在一本书查找东西,如果书的页码很少,有没有目录其实没什么影响。如果书的页码很多,目录就显得至关重要

#3


引用 1 楼 shiyiwan 的回复:
主键,索引,唯一是否设定由设计者决定,默认都是没有的。

设置和不设置的性能当然会有区别,这方面大部分数据库都是相通的。


用来做游戏服的数据库,数据很多。但是那名DBA确实没有设置主键,而且ID的值还可以相同。

#4


引用 3 楼 default7 的回复:
Quote: 引用 1 楼 shiyiwan 的回复:

主键,索引,唯一是否设定由设计者决定,默认都是没有的。

设置和不设置的性能当然会有区别,这方面大部分数据库都是相通的。


用来做游戏服的数据库,数据很多。但是那名DBA确实没有设置主键,而且ID的值还可以相同。

ID值相同就不能只基于ID设置主键了,主键值必须唯一。至于他们为什么没有设置主键,这个就搞不懂了,不知道是不是跟他们业务有关系。

#5


现在一般的游戏服务器,人数应该不是很多,少于一万个用户应该。。。又不是啥比较大型的游戏
人数少的,可以不用

#6


索引主要是提高查询性能,数据量大且关键字没有重复的话最好创建主键,数据量大关键字有重复的话可以创建索引。

#7


引用 6 楼 riveryh 的回复:
索引主要是提高查询性能,数据量大且关键字没有重复的话最好创建主键,数据量大关键字有重复的话可以创建索引。


我也觉得是啊,数据库为什么所有的表没有一个有主键,连索引都没有。不解,国内一很大型的游戏运营平台

#8


引用 4 楼 zlloct 的回复:
Quote: 引用 3 楼 default7 的回复:

Quote: 引用 1 楼 shiyiwan 的回复:

主键,索引,唯一是否设定由设计者决定,默认都是没有的。

设置和不设置的性能当然会有区别,这方面大部分数据库都是相通的。


用来做游戏服的数据库,数据很多。但是那名DBA确实没有设置主键,而且ID的值还可以相同。

ID值相同就不能只基于ID设置主键了,主键值必须唯一。至于他们为什么没有设置主键,这个就搞不懂了,不知道是不是跟他们业务有关系。


我觉得奇怪的几点:
1)Oracle数据表总共100个左右,但是没有一个表有设置主键或者索引。
2)PHP连接Oracle数据库,很长时间没有连接,如果再连接,那么第一次会非常非常卡,非常卡,5~10秒的等待。
3)Toad 连接Oracle又需要重新连接。



#9


也许人家是高手

#10


兼职dba呗。。

#11


引用 10 楼 huangdh12 的回复:
兼职dba呗。。


全职。

引用 9 楼 jvbss 的回复:
也许人家是高手

可能吧。

#12


【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗围观长姿势

#13


不知道是你们业务特殊需求,不设置主键、索引、唯一键。
建议在设计表时候要设计主键、索引、唯一键,这对性能有很大影响的,如果数据量不大的情况下不觉
如果数据量大的话,性能明显感觉低。

#14


表原则上是有主键的,这得依据业务上的。

#15


引用 13 楼 lzd_83 的回复:
不知道是你们业务特殊需求,不设置主键、索引、唯一键。
建议在设计表时候要设计主键、索引、唯一键,这对性能有很大影响的,如果数据量不大的情况下不觉
如果数据量大的话,性能明显感觉低。


没有主键Primary Key,现在弄得很麻烦,经常出现两条ID一样的记录。而且插入记录有的时候会ID为空。
DBA说如果设置主键会影响性能,因为占用存储空间。

#16


引用 14 楼 zhaoxiangchong 的回复:
表原则上是有主键的,这得依据业务上的。


用来当成主键的字段没有设置为主键,也没有加索引,更没有加唯一。
而且ID的值是拼出来的,而不是自动递增序列产生的。
比如一个无限极层级分类。
表字段:ID,UPID,NAME,
ID字段的记录是根据UPID ||  ( SELECT MAX(ID)+1 FROM TB WHERE UPID=$UPID)生成的 【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗

#17


引用 16 楼 default7 的回复:
用来当成主键的字段没有设置为主键,也没有加索引,更没有加唯一。
而且ID的值是拼出来的,而不是自动递增序列产生的。
比如一个无限极层级分类。
表字段:ID,UPID,NAME,
ID字段的记录是根据UPID ||  ( SELECT MAX(ID)+1 FROM TB WHERE UPID=$UPID)生成的 【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗


TB是现在讨论的表吗? 这个ID有没有其他表引用,如果没有现在还可以规范一下,解决数据冲突后设置成主键。

#18


引用 2 楼 zlloct 的回复:
Quote: 引用 楼主 default7 的回复:

看到一个游戏服务器 Oracle DBA 创建的所有表没有一个表有设置主键、索引、唯一,NOT NULL的。
Oracle数据库字段都不需要设置主键 、 索引 、 唯一
还是Oracle 设置了这些性能上也没有多大区别

好比在一本书查找东西,如果书的页码很少,有没有目录其实没什么影响。如果书的页码很多,目录就显得至关重要

比喻很恰当

#19


引用 17 楼 shiyiwan 的回复:
Quote: 引用 16 楼 default7 的回复:


用来当成主键的字段没有设置为主键,也没有加索引,更没有加唯一。
而且ID的值是拼出来的,而不是自动递增序列产生的。
比如一个无限极层级分类。
表字段:ID,UPID,NAME,
ID字段的记录是根据UPID ||  ( SELECT MAX(ID)+1 FROM TB WHERE UPID=$UPID)生成的 【DBA】Oracle 创建表不需要设置主键 Primary、索引 Index、唯一 UNIQUE吗


TB是现在讨论的表吗? 这个ID有没有其他表引用,如果没有现在还可以规范一下,解决数据冲突后设置成主键。


今天问了决策者,确实主键、索引是必须要有的。不过现在还没有加,他说是等所有做完了之后,再加上主键、索引。

#20