我有一个表,其中有超过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;
答案 0 :(得分:0)
我认为主要问题是服务器返回了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;
答案 1 :(得分:0)
首先,您应该显示确切的查询,尤其是确切的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_]
)