[英]How to speed up query in sql with over 20 million rows
我有一个表,其中有超过2000万行的SQL。 数据从此表的多个位置存储。 我必须按日期运行查询。 我不能使用任何过滤器,因为我必须明智地展示数据位置。 从单个表中运行数据需要花费30多分钟的时间。 我该如何管理? 我也尝试了索引编制,但没有任何区别
-- declare @DateTo as DateTime ='2018-08-01';
select distinct
[Location Code]
,[Bin Code]
,[Item No_]
,[Quantity]
,[Qty_ (Base)]
,[Zone Code]
,[Bin Type Code]
,[Lot No_]
,[Registering Date]
from
[Warehouse Entry]
where
[Registering Date] <= @DateTo;
我认为主要问题是服务器返回了2000万条记录。 它花费时间。 尤其是,如果您要查询“大”数据类型(xml,二进制等),并且您的服务器处于远程且Internet连接缓慢。
次要问题是DISTINCT。 您正在对所有要返回到前端的记录执行此操作。
切勿将所有数据集返回前端。 请改用PAGING。
这是执行此操作的方法:
-- declare @DateTo as DateTime ='2018-08-01';
-- declare @page_size int = 25;
-- declare @page int = 1;
;with [data] as (
select distinct
[Location Code]
,[Bin Code]
,[Item No_]
,[Quantity]
,[Qty_ (Base)]
,[Zone Code]
,[Bin Type Code]
,[Lot No_]
,[Registering Date]
from
[Warehouse Entry]
where
[Registering Date] <= @DateTo
)
select
[Location Code]
,[Bin Code]
,[Item No_]
,[Quantity]
,[Qty_ (Base)]
,[Zone Code]
,[Bin Type Code]
,[Lot No_]
,[Registering Date]
from
[data]
order by
[Registering Date] asc
offset
@page_size * (@page - 1) rows fetch next @page_size rows only;
首先,您应该显示精确的查询,尤其是精确的where子句 。
我不能使用任何过滤器,因为我必须明智地展示数据位置。
这条线不清楚,这条线很重要。
对于2千万行, distinct
问题非常重要。
删除区别。
还有为什么您一次要获取这么多记录的原因。您必须应用分页。
根据您的可见查询,
在注册日期创建非聚集索引
Create non clustered index ix_Test on [Warehouse Entry]([Registering Date])include( [Location Code]
,[Bin Code]
,[Item No_]
,[Quantity]
,[Qty_ (Base)]
,[Zone Code]
,[Bin Type Code]
,[Lot No_]
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.