sql - 如何在超过 2000 万行的 sql 中加快查询速度
问题描述
我在 SQL 中有一个超过 2000 万行的表。数据从该表中的多个位置存储。我必须对日期进行查询。我不能使用任何过滤器,因为我必须明智地展示数据位置。从单个表运行数据需要 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;
解决方案
我认为主要问题是从服务器返回的 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;
推荐阅读
- datatable - DataTable - 服务器端 - 排序列初始化
- json - Angular如何在formArray中推送嵌套的反应表单json id
- pyspark - 使用带有参数的 PySpark 3 DataFrame#transform 方法
- google-bigquery - 上传到 BigQuery GIS:“无效嵌套:循环 1 不应包含循环 0”
- python - 如何修复图像未显示在 heroku 部署的 django 应用程序中
- r - 条形图 R 中的图例
- flutter - 如何在 dart/flutter 中获取 mp3 元数据?
- android - Android Preference如何选择彼此相邻的多个项目之一
- qt - 如何加载和显示 QML 文件
- python - 连接pyspark中的两个嵌套列