如何在超过2000万行的SQL中加快查询速度

时间:2018-08-08 05:18:57

标签: sql sql-server sql-server-2008

我有一个表,其中有超过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;

2 个答案:

答案 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_]
)