SQL数据库设计-单列表-选择效率?

SQL数据库设计-单列表-选择效率?,sql,database,foreign-keys,primary-key,Sql,Database,Foreign Keys,Primary Key,我正在建立一个数据库,我希望它对于SELECT查询非常有效,因为数据库中的所有数据都将创建一次,并且在该数据上运行多个只读查询 我有多个表(~20),每个表都有一个复合主键,该主键由Time(int)和组合而成,或者是ProductID(int)或者ServiceID(int)取决于表 我知道为了最大限度地提高读取/SELECT效率,我通常应该对数据进行非规范化,以防止昂贵的表联接 所以考虑到这一点,如果我想优化读取性能,我应该 有3个单列表,其中包含所有可能的时间、产品ID和服务ID值。然后在

我正在建立一个数据库,我希望它对于
SELECT
查询非常有效,因为数据库中的所有数据都将创建一次,并且在该数据上运行多个只读查询

我有多个表(~20),每个表都有一个复合主键,该主键由
Time
int
)和组合而成,或者是
ProductID
int
)或者
ServiceID
int
)取决于表

我知道为了最大限度地提高读取/
SELECT
效率,我通常应该对数据进行非规范化,以防止昂贵的表联接

所以考虑到这一点,如果我想优化读取性能,我应该

  • 有3个单列表,其中包含所有可能的
    时间
    产品ID
    服务ID
    值。然后在每个表中将这些作为外键

  • 保持所有20个表完全独立,以优化
    SELECT
    性能


  • 最快的SELECT语句是从单个表进行索引查找


    如果您只关心SELECT性能,而不必担心向表中写入新数据,那么请围绕预期查询设计表,以便在一个表中找到每个查询所需的所有数据,该表有一个关于预期搜索参数的索引。

    应根据所表示的数据和预期查询负载优化数据库。你的问题没有提供足够的信息。在某些情况下,拥有20个带有联接的表可能是最有效的。在某些情况下,将所有内容反规范化到一个表中可能是最有效的。基本规则:规范化,直到它损坏为止,然后反规范化,直到它起作用为止-因此,首先确保将所有内容放入规范化形式(至少3NF)。然后看看你的查询是否工作得足够快,优化你的查询,根据需要添加索引-并且只有在最后一种情况下,如果你不能获得必要的性能,才可以再次开始反规范化。@GordonLinoff-我应该提到,对于任何给定的查询,查询将只从20个表中的一个表中提取数据。这20个表中每个表有3-8列。有时按日期/时间分区(而不是在键中有时间)可以极大地提高读取速度,但正如前面所说,关于数据结构和要运行的查询类型,您实际上没有提供足够的信息。对于此应用程序,时间将是本地时间计数器(int),而不是日期/时间戳。“最快的SELECT语句是从单个表进行索引搜索”取决于您需要访问的数据量。有时表格扫描速度更快。经常引用的经验法则指出,只有在查询少于10%的记录时,索引才有意义。另一方面,您可以构建一个索引,该索引可以满足查询,而无需触及表。