【问题标题】:How to speed up query in sql with over 20 million rows如何在超过 2000 万行的 sql 中加快查询速度
【发布时间】:2018-08-08 05:18:56
【问题描述】:

我有一个包含超过 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;

【问题讨论】:

  • 这是完整的查询吗?你在WHERE 子句中有一个ILE,而我在FROM 中根本看不到它
  • 最好在dba.stackexchange.com 上问这个问题而不是在这里。
  • 您可以通过[Registering Date] 字段对您的表进行分区,尽管在获得数据之前这样做更容易,甚至可以通过该字段创建索引以加快您的查询速度。除此之外,你不能做太多来改进这个简单的查询。这一点,省略了@Squirrel 所说的完全正确的说法,即您使用的 ILE 别名在您的查询中的任何地方都不存在
  • 您在ILE.[Registering Date] 上有索引吗,因为这是您唯一的一个过滤器?此查询返回多少行?
  • @Squirrel 我编辑了它。

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


【解决方案1】:

我认为主要问题是从服务器返回的 20 000 000 条记录。它的时间成本很高。特别是,如果您正在查询“大”数据类型(xml、二进制等),并且您的服务器位于远程且互联网连接速度较慢。

小问题是 DISTINCT。您正在对所有要返回到前端的记录执行此操作。

永远不要将所有数据集返回到前端。请改用分页。

这里是如何做到这一点的方法:

--  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;

【讨论】:

  • 固定规模,千万千万。
【解决方案2】:

首先,您应该显示准确的查询,尤其是准确的 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_]
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多