-4

我正在使用 MSSQL 2008 R2。我有一个包含大量行的表(测试表)

我有以下 SQL 代码,请建议我可以在哪里使用索引提示、强制搜索或任何其他方式来提高性能。

索引
1. non-clustered - idx_id(id)
2. non-clustered - idx_name(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
4

3 回答 3

1

一般来说,关系数据库(即关系型)是以优化连接语句的方式编写的。当使用带有“ON”条件的“JOIN”子句时,数据库引擎可以创建一个将表结构、索引等考虑在内的优化执行计划。加入子选择时,有时相同的优化因素不可用,或者没有以相同的方式考虑。这取决于您的架构,但一个很好的经验法则是假设带有“on”子句的标准连接将比在 sub-select 上的连接更有效

您的架构非常模糊,所以我什至不确定您是否需要连接,但如果需要,您应该尝试使用“on”标准直接执行连接。

于 2013-05-31T13:04:16.143 回答
1

先决条件:有一个主键

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)
)
于 2013-05-31T12:52:45.410 回答
1

您的表包含多少列?如果只有这两列,添加非聚集索引是没有意义的。您应该在 ID 列上创建 CLUSTERED 索引,仅此而已 - 您将看到性能提升。

如果您有很多列,请考虑两个选项:

  1. 在 NAME 列上创建聚集索引,在 ID 列上创建非聚集索引。
  2. 在 ID 列和 INCLUDE NAME 列上创建非聚集索引(您将通过这种方式创建覆盖索引)
于 2013-05-31T12:53:09.950 回答