0

我有一个查询要在作为视图的表的 2 列上查找 not null ,因此执行需要花费大量时间。查询是:Query1

SELECT [Table1].M, [[Table1]].B, [Table1].P
FROM [Table1]
WHERE ((([[Table1]].B) Is Not Null) AND (([[Table1]].P) Is Not Null));

下面的查询是否与 Query1 具有相同的功能,但执行时间更快?

SELECT [Table1].M, [[Table1]].B, [Table1].P
FROM [Table1]
WHERE COALESCE (([[Table1]].B),([[Table1]].P)) Is Not Null

任何帮助都会有很大帮助,并在此先感谢您。

视图查询

select dbo.TABLE1.[COL1]
    , dbo.TABLE1.[COL2]
    , RIGHT(dbo.TABLE1.M, 12) as M
    , dbo.TABLE2.[MD]
    , dbo.TABLE1.[COL3]
    , dbo.TABLE1.[COL4]
    , dbo.TABLE3.COL1
    , dbo.TABLE3.[COL2]
    , dbo.TABLE3.[COL3]
    , dbo.TABLE4.[COL1]
    , dbo.TABLE5.[COL1]
    , dbo.TABLE6.[COL1]
    , dbo.TABLE7.[COL1] as [BA]
    , dbo.TABLE8.[COL1]
    , dbo.TABLE3.[COL4]
    , dbo.TABLE3.[COL5]
    , dbo.TABLE3.[COL6]
from dbo.TABLE1
left outer join dbo.TABLE2
    on dbo.TABLE1.M = dbo.TABLE2.M
left outer join dbo.TABLE3
    on dbo.TABLE1.M = dbo.TABLE3.M
left outer join dbo.TABLE5
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE5.OBJ
left outer join dbo.TABLE6
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE6.OBJ
left outer join dbo.TABLE7
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE7.OBJ
left outer join dbo.TABLE4
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE4.OBJ
left outer join dbo.TABLE8
    on dbo.TABLE3.[OBJ_NR] = dbo.TABLE8.OBJ
where (
        (
            dbo.TABLE1.[COL1] not in (
                'XX'
                , 'YY'
                )
            )
        and (dbo.TABLE1.COL5 = 'x')
        )
4

2 回答 2

3

不,两个查询不等价。

第二个中的WHERE子句相当于

WHERE [[Table1]].B Is Not Null OR [[Table1]].P Is Not Null

COALESCE将评估第一个参数并在不为空时返回它。否则,如果不为空,它将返回第二个参数,依此类推,直到到达最后一个参数,无论其值如何,都将返回该参数。所以COALESCE(...) IS NOT NULL只需要一个非空值来返回真,而不是全部。

于 2014-11-04T09:24:12.227 回答
0

我已经在我的开发数据库中的一张表上尝试过了。结果如下:

只有 PK 索引:800 万表中的 400 万条选定记录需要 2 分钟

在 3 个选定列(没有一个是 PK)上具有索引 1.8 秒。

您可能需要进行一些测试才能为您的设置获取正确的索引,但这里是我更改的示例:

select [col1]
    , [col2]
    , [col3]
from [dbo].[tbl]
where col2 is not null
    and col3 is not null

create nonclustered index [idx_test] on [dbo].[tbl] (
    [col2] asc
    , [col3] asc
    ) INCLUDE ([col1])
于 2014-11-04T09:53:27.613 回答