SQL用where子句对行进行计数的最快方法

时间:2018-11-09 02:08:39

标签: sql-server select count

我是SQL Server的新手,在SQL Server中从大表中检索时非常慢。

这是我的查询。

    public partial class portfolio_project_db : DbContext
    {
    public portfolio_project_db()
        : base("name=portfolio_project_db")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<Image> Images { get; set; }
}

我在google上进行了一些研究,发现了这段代码,但是我不知道如何为此添加WHERE子句(其中status ='A'且shipment_date在'2018-01-01'和' 2018-12-31'

SELECT 
    COUNT(reference) 
FROM 
    shipment_table 
WHERE
    status = 'A' 
    AND shipment_date BETWEEN '2018-01-01' AND '2018-12-31'

谢谢

4 个答案:

答案 0 :(得分:0)

尝试使用 COUNT(*),而不是 COUNT(reference)。它们看起来可能相同,但事实并非如此。 COUNT(列名)不包含NULL 值。因此,如果您有一个可为空的列,它将扫描每一行,只是查找什么是NULL,什么不是。另一方面, COUNT(*)将包含可为空的值,因此不需要扫描每一行。当表 ENGINE = MYISAM 时,它还利用缓存。

答案 1 :(得分:0)

由于大多数记录搜索将为'A'。希望状态仅为char(1)

在状态列上创建过滤索引

CREATE NONCLUSTERED INDEX XI_Status
ON shipment_table (Status)
WHERE Status= 'A'

创建另一个非聚集索引的“日期”列

CREATE NONCLUSTERED INDEX XI_ShipDate
ON shipment_table (shipment_date)


SELECT COUNT(*) FROM dbo.shipment_table 
where status = 'A' and shipment_date BETWEEN '2018-01-01' 
and '2018-12-31'

答案 2 :(得分:0)

如果shipping_date字段类似于值插入日期,则可以在shipping_date上创建聚簇索引,我的意思是总是随着每一行增加而增加

这将提高在给定的发货日期范围内的读取性能

答案 3 :(得分:0)

首先在日期字段上创建非聚簇索引,并在主键列上创建聚簇索引,然后可以使用下面的查询将比上一个更快。

SELECT 
    COUNT(primaryKeyColumn) 
FROM 
    shipment_table 
WHERE
    status = 'A' 
    AND shipment_date BETWEEN '2018-01-01' AND '2018-12-31'