【发布时间】:2013-07-02 21:08:21
【问题描述】:
我不太擅长 SQL,所以在编写查询时向你们寻求帮助。
SQL Query - Table Joining Problems
我得到了答案,它有效!它只是明显缓慢。我讨厌这样做,但我真的希望有人想推荐一些优化查询的方法。我什至没有自己尝试过,因为我对 SQL 的了解不够,甚至无法开始使用谷歌搜索。
【问题讨论】:
标签: sql performance optimization sql-server-2008-r2
我不太擅长 SQL,所以在编写查询时向你们寻求帮助。
SQL Query - Table Joining Problems
我得到了答案,它有效!它只是明显缓慢。我讨厌这样做,但我真的希望有人想推荐一些优化查询的方法。我什至没有自己尝试过,因为我对 SQL 的了解不够,甚至无法开始使用谷歌搜索。
【问题讨论】:
标签: sql performance optimization sql-server-2008-r2
在您要加入的列上创建索引可能会有所帮助。例如;
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。
【讨论】:
有时,这样的技巧可能会奏效,但正如您所见,它主要会使您的查询复杂化。但就像我在 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 ...
【讨论】: