【问题标题】:SQL Query - Performance OptimizationSQL 查询 - 性能优化
【发布时间】:2013-07-02 21:08:21
【问题描述】:

我不太擅长 SQL,所以在编写查询时向你们寻求帮助。
SQL Query - Table Joining Problems
我得到了答案,它有效!它只是明显缓慢。我讨厌这样做,但我真的希望有人想推荐一些优化查询的方法。我什至没有自己尝试过,因为我对 SQL 的了解不够,甚至无法开始使用谷歌搜索。

【问题讨论】:

    标签: sql performance optimization sql-server-2008-r2


    【解决方案1】:

    在您要加入的列上创建索引可能会有所帮助。例如;

    CREATE INDEX name_for_index ON Main (StatusID);
    

    它为此列生成一个查找表,执行查询的算法将使用该查找表。

    编辑:如果不允许您更改数据库,您可能会不走运。我见过在 JOIN 语句上放宽提高性能的情况,就是这样;

    ...
    FROM
      Main m, Status st, Secondary s
    WHERE
      st.ID = m.StatusID
      AND s.MainID = m.ID
      AND 
      ( s.MainID IS NULL AND m.WhenDate = <YourDate>
        OR
        s.MainID IS NOT NULL AND s.WhenDate = <YourDate> )
      AND TypeId = <TypeFilter>
      AND ... other filters, if you need any ...
    

    然后处理您的其他情况,其中需要更详细的 INNER JOIN

    【讨论】:

    • 我应该提到它,但我需要对数据库进行任何修改。希望有一种方法可以更改查询并获得更快的结果...跨度>
    • 除了添加索引之外,您还可以做一些优化,但这不会产生太多结果,而且会使您的查询更加复杂。我强烈建议您让您的 DBA 查看并添加正确的索引。或者授予您这样做的权利。
    • 非常感谢你们俩。我想我将不得不推动上帝的作为。打算解决您的两个查询,但我认为正确的答案是“添加索引”。真的很感谢你们俩的时间!!
    【解决方案2】:

    有时,这样的技巧可能会奏效,但正如您所见,它主要会使您的查询复杂化。但就像我在 cmets 中所说:我真的强烈建议您让您的 DBA 添加适当的索引,甚至可能教您如何确定您需要哪些索引并授予您添加它们的权利。

    我见过WHERE 子句中的OR 是通过使用两个单独的、几乎相似的选择来解决的,这些选择由USING ALL 组合而成。但我相信这个技巧主要在 Oracle 上有用,并且主要在具有适当索引的表上有用。不过值得一试。

    SELECT
      x.*
    FROM
      (SELECT
        m.ID as MainID,
        m.WhenDate as MainWhenDate, 
        m.InfoText, 
        m.StatusID,
        st.StatusText,
        m.TypeID,
        NULL AS SecondaryWhenDate,
        m.WhenDate AS ActualWhenDate
      FROM
        Main m
        INNER JOIN Status st ON st.ID = m.StatusID
        LEFT JOIN Secondary s ON s.MainID = m.ID
      WHERE
        s.MainID IS NULL AND 
        m.WhenDate = <YourDate>
      UNION ALL
      SELECT
        m.ID as MainID,
        m.WhenDate as MainWhenDate, 
        m.InfoText, 
        m.StatusID,
        st.StatusText,
        m.TypeID,
        s.WhenDate AS SecondaryWhenDate,
        s.WhenDate AS ActualWhenDate
      FROM
        Main m
        INNER JOIN Status st ON st.ID = m.StatusID
        INNER JOIN Secondary s ON s.MainID = m.ID
      WHERE
        s.WhenDate = <YourDate>) x
    WHERE
      x.TypeId = <TypeFilter>
      AND ... other filters, if you need any ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多