如何避免大表的表扫描和索引扫描

时间:2013-05-31 12:24:16

标签: sql-server sql-server-2008

我正在使用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

3 个答案:

答案 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索引,就是这样 - 你会看到性能提升。

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

  1. 在NAME列上创建聚簇索引,在ID列上创建非聚簇索引。
  2. 在ID列和INCLUDE NAME列上创建非聚簇索引(您将以此方式创建覆盖索引)

答案 2 :(得分:1)

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

您的架构非常模糊,因此我甚至不确定您是否需要连接,但如果您这样做,则应尝试使用“on”条件直接执行连接。