我是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'
谢谢
答案 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'