繁体   English   中英

NULLABLE列上的SQL Server分组

[英]SQL server grouping on NULLABLE column

我在SQL Server(使用旧版数据库)中遇到一种情况,我无法理解为什么?

我有一个表A(约200万行),其表CODE允许为空。 CODE = NULL的行数只是几行(<10行)。 当我运行查询时:

select code, sum(C1)
from A
-- where code is not null
group by code;

它永远运行。 但是,当我取消注释where子句时,它花了1.5秒左右(仍然太慢了,对吧?)

这里有人可以帮助我指出造成这种情况的可能原因吗?

执行计划添加: 在此处输入图片说明

通常,常规索引无法存储NULL值。 因此,即使您在代码上有索引,您的WHERE条件也无法从该索引中受益。

如果索引中包含C1(我认为不是NOT NULL),则情况会有所不同,因为所有元组(code = NULL,C1 =( some value ))都可以并且将被索引。 根据您的问题,数量很少; 因此,SQL Server只需返回所有这些元组的行就可以大大提高速度。

首先,关于性能的几句话。 我们为您提供几种变型。

索引视图-

IF OBJECT_ID('dbo.t', 'U') IS NOT NULL
    DROP TABLE dbo.t
GO

CREATE TABLE dbo.t (
    ID INT IDENTITY PRIMARY KEY,
    Code VARCHAR(10) NULL,
    [Status] INT NULL
)
GO

ALTER VIEW dbo.v
WITH SCHEMABINDING
AS
    SELECT Code, [Status] = SUM(ISNULL([Status], 0)), Cnt = COUNT_BIG(*)
    FROM dbo.t
    WHERE Code IS NOT NULL
    GROUP BY Code
GO

CREATE UNIQUE CLUSTERED INDEX ix ON dbo.v (Code)

SELECT Code, [Status]
FROM dbo.v

筛选索引-

CREATE NONCLUSTERED INDEX ix ON dbo.t (Code)
    INCLUDE ([Status])
    WHERE Code IS NOT NULL

将等待您的第二个执行计划。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM