【问题标题】:Nesting queries: best practices嵌套查询:最佳实践
【发布时间】:2013-10-02 09:23:46
【问题描述】:

我正在尝试加快查询速度。其中很多都相当复杂,目前我主要通过创建多个查询并通过连接链接它们来实现这一点。

这是最佳做法,还是我应该在SELECTs 中使用SELECTs 并尝试在一个查询中实现相同的目标?

任何一个选项都会影响速度,还是复杂只是复杂?

编辑:下面的示例查询

SELECT HoldingCoNos.ID
FROM (
  SELECT [SearchByName - No Filter].ID
  FROM [SearchByName - No Filter]
  INNER JOIN [SearchByName - Level 1 Subsidiaries]
  ON [SearchByName - No Filter].ID = [SearchByName - Level 1 Subsidiaries].[Holding Company]
) AS HoldingCoNos
GROUP BY HoldingCoNos.ID;

这一切都在一个查询中 - 另一种选择是将查询的 FROM 部分的内容创建为两个单独的查询,保存它们并使用内部连接。

【问题讨论】:

  • 你能举个例子吗?
  • “最佳实践”是一个见仁见智的问题。虽然它们通常代表明智的建议,但我发现有时,“最坏的做法”更适合手头的情况。关于您关于哪种方法性能更好的问题,当您测试每种方法时发生了什么?
  • 请注意,您问这个问题是针对一个不提供分析或分析机制的数据库,这意味着任何答案都有点像在黑暗中拍摄。我经常使用 MS Access(尽管我确实使用 SQL Server),而且我基本上从不使用链接查询对象或子查询。我怀疑我的应用程序与您的应用程序有不同的,也许更简单的要求。
  • “多个查询并通过连接链接它们”与“选择中的选择”,有什么区别?通常,一个查询中只有一个 SELECT 语句。
  • @DanBracuk 变化很大,很难说,但这是一个非常明智的建议。

标签: sql ms-access join ms-access-2010


【解决方案1】:

一般来说: 例如,对父查询中的每一行执行子查询

Select * from employees where name IN (select Manager_name from Team_project where project_id=1)

它将为employees表中的每一行执行select manager_name,以比较授予查询被缓存的名称,这将使其更快,但它仍然需要更多工作。

但是,这一切都取决于查看此讨论以获取更多详细信息: Subquery v/s inner join in sql server

【讨论】:

    【解决方案2】:

    查看您的示例查询,我可以指出几点:

    • 您实际上并不需要子查询。您正在从子查询中选择单个字段并按该字段分组。相反,您可以摆脱外部查询,只需 select distinct [SearchByName - No Filter].ID
    • 感知是现实的十分之九。您的查询看起来很复杂,部分原因是您在任何地方都使用完整的表名而不是短表别名。注意别名的区别(以及一些小心的格式)。当您的查询变大时,这将被放大数倍:

    SQL:

    select distinct sbnnf.ID as HoldingCoID
    from [SearchByName - No Filter] as sbnnf
    inner join [SearchByName - Level 1 Subsidiaries] as sbnl1s
    on sbnnf.ID = sbnl1s.[Holding Company];
    

    【讨论】:

      猜你喜欢
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2023-03-23
      • 2017-12-12
      • 2021-03-26
      相关资源
      最近更新 更多