【问题标题】:SQL optimization issueSQL优化问题
【发布时间】:2012-02-25 07:25:23
【问题描述】:

我有两张桌子。一个表包含有关资产的信息,另一个表包含有关它们的关系的信息。我如何优化当前查询并获得类似的结果。

SELECT a1.ID FROM Asset a1
WHERE a1.AssetId =
(SELECT r.DestinationAssetId
FROM Relation r
INNER JOIN Asset a2 ON a2.AssetId = r.SourceAssetId
WHERE a2.ID = '1112174' and r.RelationshipType = 'Video File')

结果:1​​3412331(与 a2.ID = '1125574' 相关的资产 ID)

我个人不喜欢这个愚蠢的子查询,有什么办法可以避免它并优化这个查询。

谢谢!

【问题讨论】:

  • 您使用的是什么数据库?为什么不能加入与资产的关系?
  • MSQL,我可以加入 Relation to Asset,我在子查询中这样做。但是如何在一个查询中获得相同的结果。
  • 优化还包括确保 JOINed 列具有匹配的数据类型并且有合适的索引。您应该查看 SQL Server 生成的查询计划,看看它在哪里花费时间。

标签: sql sql-server optimization join


【解决方案1】:

您可能会丢失子查询:

SELECT dest.ID 
FROM 
Asset src
JOIN Relation r ON src.AssetId = r.SourceAssetId
JOIN Asset dest ON dest.AssetID = r.DestinationAssetID
WHERE src.ID = '1112174' and r.RelationshipType = 'Video File'

在性能方面并没有太大的优化,但它更整洁一些。

【讨论】:

  • @af: Taa - 在我打字的时候有一半是这样!以为我都发现了。
  • @DarkTygur,我同意 Jon 的观点。第一个 FROM 表是他正在寻找的特定 ID 的基础,然后加入其他表以获取其他符合条件的信息元素。
  • 我比其他答案更喜欢这个答案中的表别名。帮自己一个忙,像 Jon 一样使用有意义的别名。
【解决方案2】:

乍一看,这似乎会做同样的事情:

SELECT a1.ID
FROM Relation r
INNER JOIN Asset a2 ON a2.AssetId = r.SourceAssetId
INNER JOIN Asset a1 ON a1.AssetId = r.DestinationAssetId
WHERE a2.ID = '1112174' and r.RelationshipType = 'Video File'

【讨论】:

    【解决方案3】:

    试试这个:

    SELECT a1.ID
    FROM Asset a1
    INNER JOIN Relation r ON a1.AssetId = r.DestinationAssetId
    INNER JOIN Asset a2 ON a2.AssetId = r.SourceAssetId
    WHERE a2.ID = '1112174' and r.RelationshipType = 'Video File'
    

    【讨论】:

      猜你喜欢
      • 2016-12-07
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2023-03-31
      相关资源
      最近更新 更多