繁体   English   中英

SQL查询 - 性能优化

[英]SQL Query - Performance Optimization

我不太擅长SQL,所以我请求大家帮忙写一个查询。
SQL查询 - 表连接问题
我得到了答案,它的确有效! 它显然很慢。 我讨厌这样做,但我真的希望有人想推荐一些优化查询的方法。 我甚至没有尝试过这个,因为我甚至不知道SQL甚至开始谷歌搜索。

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

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添加适当的索引,甚至可能教你如何确定你需要哪些索引并授予你添加它们的权利。

我已经看到过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 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM