SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析

9/1/2015来源:SQL技巧人气:2253

SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析 2015-08-02 18:31 by 潇湘隐者, ... 阅读, ... 评论, 收藏, 编辑

在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan)、聚集索引表走聚集索引扫描(Clustered Index Seek))呢?是否所有情况都是如此?又该如何优化呢? 下面我们通过一些简单的例子来分析理解这些现象。下面的实验环境为SQL SERVER 2008,如果在不同版本有所区别,欢迎指正。

堆表单索引

首先我们构建我们测试需要实验环境,具体情况如下所示:

DROPTABLE TEST
 
CREATETABLE TEST (OBJECT_ID INT, NAME VARCHAR(32));
CREATEINDEX PK_TEST ON TEST(OBJECT_ID)
 
DECLARE @IndexINT =0;
WHILE @Index < 500000
BEGIN
 INSERT INTO TEST
 SELECT @Index, 'kerry'+CAST(@IndexASVARCHAR(6));
 
 SET @Index = @Index +1;
END
UPDATESTATISTICS TEST WITH FULLSCAN

场景1:如下所示,并不是所有的OR条件都会导致SQL走全表扫描。具体情况具体分析,不要套用教条。<