[英]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.