【发布时间】:2026-01-03 04:15:02
【问题描述】:
DECLARE @cid int=1
DECLARE @datee date='2016-01-25';
WITH dl AS (
SELECT DISTINCT
dl.imei,
dl.vname,
dl.driver,
dl.mobileno
FROM devices_list dl
WHERE dl.cid=@cid
),
gd AS (
SELECT b.imei,
MAX(b.odometer) odometer,
MIN(b.odometer) minod
FROM gpsdata b
WHERE FORMAT(b.packettime,'yyyy-MM-dd') = @datee
GROUP BY b.imei
),
gd1 AS (
SELECT b.imei,
MAX(b.odometer) odometer,
MIN(b.odometer) minod2
FROM gpsdata b
WHERE FORMAT(b.packettime,'yyyy-MM-dd') = DATEADD(day,-1,@datee)
GROUP BY b.imei
),
gd2 AS (
SELECT b.imei,
MAX(b.odometer) odometer
FROM gpsdata b
WHERE FORMAT(b.packettime,'yyyy-MM-dd') = DATEADD(day,-7,@datee)
GROUP BY b.imei
),
gd3 AS (
SELECT b.imei,
MIN(b.odometer) odometer
FROM gpsdata b
WHERE FORMAT(b.packettime,'yyyy-MM')=FORMAT(@datee,'yyyy-MM')
GROUP BY b.imei
)
SELECT dl.imei,
dl.vname,
dl.driver,
dl.mobileno,
gd.odometer,
(gd.odometer-gd.minod) today,
(gd1.odometer-gd1.minod2) yesterday,
(gd.odometer-gd2.odometer) last7days,
(gd.odometer-gd3.odometer) thismonth
FROM dl
LEFT JOIN gd ON dl.imei=gd.imei
LEFT JOIN gd1 ON dl.imei=gd1.imei
LEFT JOIN gd2 ON dl.imei=gd2.imei
LEFT JOIN gd3 ON dl.imei=gd3.imei;
【问题讨论】:
-
请显示执行计划。还要量化你的信息。什么太长了,有多少数据等等。杀死 FORMAT 东西 - 它们的意思是“不使用索引”,因为它们是不可分割的。
-
执行速度缓慢通常是由于缺少索引。您在需要的地方有索引吗?
-
@OlivierDeMeulder 即使他有索引,查询条件也不是 sargeable - 因此不会使用索引。
-
@TomTom 正在存储过程中执行此查询。我在 gpsdata 表中有大约 500 万条记录。
-
@OlivierDeMeulder 我有索引的 id 字段。
标签: sql-server sql-server-2012