tsql加入最佳实践建议

时间:2012-05-11 15:24:49

标签: tsql

首先,英语不是我的第一语言,随时可以编辑我的问题,我很抱歉任何可能冒犯你的错误,或者没有那么明确地揭露问题。

我有一些带有大量连接的SQL查询,这些连接基于聚簇索引(不用担心)。一些连接仅用于遵循规范化,并且因为维护直观,但有时可以跳过其中一些。在最佳实践方面,我不清楚如何处理这些连接。

编辑:

一个简单的例子:

select *
from things
join things_categories on
    things_categories.id_thing = things.id_thing
join categories on
    categories.id_category = things_categories.id_category
join categories_properties on
    categories_properties.id_category = categories.id_category
where
    categories_properties.bo_default = 1

但是可以这样做:

select *
from things
join things_categories on
    things_categories.id_thing = things.id_thing
join categories_properties on
    categories_properties.id_category = things_categories.id_category
where
    categories_properties.bo_default = 1

第二次加入并不是必需的(我确实在数据库级别具有完整性),只是因为使代码更直观并且尊重数据库规范化。我不确定我是否应该遵循尽可能最小和最有效的路径,或者留下不必要的连接以尊重规范化并使代码更直观。

任何提示?

一切顺利。

3 个答案:

答案 0 :(得分:1)

它已经延迟,无论你有没有诚信。

一方面,如果categories_properties table foreign key中有id_category column,那么就存在完整性,您无需使用join { {1}}。

另一方面,如果完整性可能不存在(即:categories tableid_categories中有categories_properties table未在categories table中定义),那么您应该{{1} }}

答案 1 :(得分:1)

加入:

join categories on
    categories.id_category = things_categories.id_category

是非常必要的,因为categories表用于下一个连接:

join categories_properties on
    categories_properties.id_category = categories.id_category

所以它肯定是必需的,如果它尚未定义,因为SQL要求你建立它需要索引的链接并将其连接到下一个。

select *是多么令人痛苦的事。 您不需要所有这些信息,因为*将带来所有表中的所有数据。

也许你可以从每个表中指定你需要的东西,或者最坏的情况是使用。*来指定特定表的所有列。

答案 2 :(得分:1)

如果您不需要加入,请不要使用它。您正在完全不受欢迎的性能影响。不要强制数据库执行它不需要执行的工作,因为您认为它看起来更加清晰,您应该在查询中提高可读性之前考虑性能。毕竟,一旦你开始编写高性能的SQl代码,它就会变得更具可读性。但是,通过确保查询的两个版本返回相同的结果集,确保在删除之前确实不需要它。