现在我的项目需要设计我的数据库(Oracle)。通常,对于状态和国家表,我不使用数字主键,例如
STATUS (max 6)
AC --> Active
DE --> Deleted
COUNTRIES (total 30)
UK --> United Kingdom
IT --> Italy
GR --> Greece这些表是静态的,没有通过应用程序进行更新,也没有预见到将来会发生变化,因此在使用这些值作为外键的表中不可能出现更新问题。
应用程序的主表将使用状态和国家(不止一次,例如来源国、目的地国),预计每年将增加600000行。
所以我的问题是,这些VARCHAR(2)键在查询那里的3个表的联接时会对性能产生影响吗?第一个会比第二个慢得多吗?
SELECT m.*,
s.status_name,
c.country_name
FROM main m, status s, countries c
WHERE m.status_cd = s.status_cd
AND m.country_cd = c.country_cd
AND m.status_cd = 'AC'
AND m.country_cd = 'UK'
SELECT m.*,
s.status_name,
c.country_name
FROM main m, status s, countries c
WHERE m.status_cd = s.status_cd
AND m.country_cd = c.country_cd
AND m.status_cd = 1
AND m.country_cd = 2澄清:
状态不是二进制(表名旁边的“最大值6”)。这些值可能是:
* active
* deleted
* draft
* send
* replaced我们需要向用户显示解码后的值,所以我们需要名称。
发布于 2008-11-27 17:20:17
状态表和国别表都很小,无论是否正式说明,它们实际上都将成为内存。事实上,除了外键通常需要引用的主键字段上的索引之外,您可能会不去理会表上的任何索引。
具有不同类型的联接之间的性能差异将是可以忽略不计的,如果有的话,数值代码会慢一些,因为需要存储更多的数据(但是这些数据都太小了,同样可以忽略不计)。
所以,按照自然规律。除此之外,第一个示例中的SQL更清晰;“UK”和“AC”比1和2更有意义。
在非Oracle DBMS中,您可能会将CHAR(2)用于状态值和国家代码值。Oracle倾向于在所有方面都使用VARCHAR2;我不确定使用CHAR(2)列是否会有损失,特别是因为列值是固定长度的。(例如,在Informix下,一个VARCHAR(2)字段--一个最多两个字符的字段--将存储为3个字节、一个长度(在您的例子中总是为2)和2个数据字节。相反,CHAR(2)字段只占2个字节。
发布于 2008-11-27 17:08:16
看看这个链接。底线是,varchar和num之间的性能差别不大。因此,您应该选择对专栏有意义的内容。在这里,静脉曲张似乎更有意义。
发布于 2008-11-27 16:36:43
如果“状态”是(并且将一直是?)二进制活动/删除字段--为什么要使用表呢?似乎正常化到了一个不切实际的极端。
简单地使用tinyint(1)字段并将活动/删除状态记录为1或0肯定会更快,更不用说更容易了。
这完全消除了你的一个连接,这肯定是件好事。
https://stackoverflow.com/questions/324181
复制相似问题