Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 一个表上有很多外键-性能问题_Sql_Database_Postgresql_Indexing_Foreign Keys - Fatal编程技术网

Sql 一个表上有很多外键-性能问题

Sql 一个表上有很多外键-性能问题,sql,database,postgresql,indexing,foreign-keys,Sql,Database,Postgresql,Indexing,Foreign Keys,我有一个很大的表,它主要由枚举值组成(40个不同的枚举) 每个枚举值都是单独表的外键,因为我需要允许用户自定义名称并添加/删除新值。 这些枚举表非常小,每个表中最多有20个值 每个外键都被索引,因此总共大约有50个索引键。 这使得插入和更新非常缓慢 主表中大约有200万行,并且一直在增长 表示这些枚举值/提高性能的最佳做法是什么 我应该删除一些在搜索过程中不使用的索引键,只保留外键,还是通过对共享某些“类别”的枚举进行分组,将主表拆分为多个表。这是设计一组表的常用方法 你的fk关系有什么目的?它

我有一个很大的表,它主要由枚举值组成(40个不同的枚举)

每个枚举值都是单独表的外键,因为我需要允许用户自定义名称并添加/删除新值。 这些枚举表非常小,每个表中最多有20个值

每个外键都被索引,因此总共大约有50个索引键。 这使得插入和更新非常缓慢

主表中大约有200万行,并且一直在增长

表示这些枚举值/提高性能的最佳做法是什么


我应该删除一些在搜索过程中不使用的索引键,只保留外键,还是通过对共享某些“类别”的枚举进行分组,将主表拆分为多个表。这是设计一组表的常用方法

你的fk关系有什么目的?它们迫使数据库保持一致性,这是很有用的。例如,如果主表中有一列名为
food\u id
,它指向名为
food
的六行表中的一行,则fk关系将阻止插入指向第八行的值

但要保证一致性,需要对值进行大量检查。这会使插入和更新变慢。你知道的

我建议您只需将所有外键关系从主表删除到引用表,并删除主表中这些列的索引。可能发生的最坏情况是什么?在指向引用表中不存在的行的其中一列中偶尔会出现一个值。您可以通过以下方式缓解此问题:

 SELECT main.item, main.item2, COALESCE (food.name, '--missing--') name
   FROM main
   LEFT JOIN food on main.food_id = food.food_id
左连接将为缺少的
food\u id
值生成空值,
COALESCE()
将显示默认值

插入操作将变得很快。

请回答您的问题并添加执行计划(使用
explain(analyze,buffers)insert…
生成的缓慢插入和更新语句)-而不仅仅是“简单”的解释