【发布时间】:2017-06-28 13:43:22
【问题描述】:
所以,我有一个 MSSQL 的 SQL 查询,看起来像这样(为便于阅读而简化):
SELECT ...
FROM (
SELECT ..., ROUND(SUM(TOTAL_TIME)/86400.0,2) ...
FROM MY_DATA
WHERE STATUS NOT IN (107)
GROUP BY ...
) q
WHERE q.Tdays > 0
GROUP BY ...
它工作正常,但我需要与内部查询中的另一个表进行比较,所以我添加了一个左连接并表示比较:
SELECT ...
FROM (
SELECT ..., ROUND(SUM(TOTAL_TIME)/86400.0,2) ...
FROM MY_DATA
LEFT JOIN OTHER_TABLE ON MY_DATA.ID=OTHER_TABLE.ID //new JOIN
WHERE STATUS NOT IN (107) AND (DEPARTMENT_ID='SP' OR DEPARTMENT_ID='BL') //new AND branch
GROUP BY ...
) q
WHERE q.Tdays > 0
GROUP BY ...
此查询有效,但比前一个查询慢很多。奇怪的是,注释掉 WHERE 子句的新 AND 分支,同时保留 JOIN 原样使其再次更快。好像它没有加入另一个正在减慢查询速度的表,但是实际的字符串比较......我不知道为什么这么慢,或者我如何加快速度......任何建议都将不胜感激!
【问题讨论】:
-
SQL 在比较字符串方面是出了名的慢——尤其是在它们没有被索引的情况下。不幸的是,我认为没有办法解决这个问题。在您的示例中,也许您可以创建一个带有数值(1 - 'SP'...2 - 'BL'...等)的部门表,加入该表,并根据数字进行比较。这可能会快很多,这就是为什么我总是在 PK 中使用整数字段,即使文本是唯一的(比如您的部门 ID)。
-
在 DEPARTMENT_ID 上创建索引会对您有所帮助。
-
ID是OTHER_TABLE的主键吗? -
是的,两者都有。
-
您应该查看/显示解释计划。 stackoverflow.com/questions/7359702/…
标签: sql sql-server