我正在使用MSSQL 2008 R2。我有一个包含大量行的表(测试表)
我有以下SQL代码,请建议我可以使用索引提示,强制搜索或任何其他方法来提高性能。
索引
1.非群集 - idx_id
(id)
2.非群集 - idx_name
(姓名)
SELECT DISTINCT
p.id,
p.name,
FROM
test p
LEFT OUTER JOIN
(
SELECT
e.id
FROM
test e
INNER JOIN
(
SELECT
c.id
FROM
test c
GROUP BY
c.id
HAVING
COUNT(1) > 1
) f
ON e.id = f.id
WHERE
e.name = 'test_name'
) m
ON p.id = m.id
WHERE
m.id is null
答案 0 :(得分:1)
Prerequise:拥有主键
select distinct
p.id
, p.name
from test p
where not exists (
SELECT TOP(1)
1
FROM test e
WHERE e.PrimaryKey <> p.PrimaryKey
AND e.id = p.id
AND 'test_name' IN (e.name, p.name)
)
答案 1 :(得分:1)
您的表包含多少列?如果只有这两列,添加非聚集索引是没有意义的。你应该在ID列上创建CLUSTERED索引,就是这样 - 你会看到性能提升。
如果您有很多列,请考虑两个选项:
答案 2 :(得分:1)
一般来说,关系数据库(是关系数据库)是以优化连接语句的方式编写的。当使用具有“ON”条件的“JOIN”子句时,数据库引擎可以创建优化的执行计划,该计划将表结构,索引等考虑在内。当加入子选择时,有时相同的优化因子不可用,或者不以相同的方式考虑。这取决于您的架构,但是假设 带有“on”子句的标准连接比子选择上的连接更有效是一个很好的经验法则。 强>
您的架构非常模糊,因此我甚至不确定您是否需要连接,但如果您这样做,则应尝试使用“on”条件直接执行连接。