I have a table in my database.The table has a field VehId(Int) and trackdt(Datetime)
My table has 3000 billion rows(yes, that's right 3000 billion). so i want to delete old data. but i want to delete data based on time interval.
I want to delete records of every 20 seconds for each vehicle.
Below is the table I have
VehId Trackdt
1 2017-05-20 00:00:30.000
2 2017-05-20 00:00:32.000
2 2017-05-20 00:00:42.000
1 2017-05-20 00:00:40.000
2 2017-05-20 00:00:52.000
1 2017-05-20 00:00:50.000
1 2017-05-20 00:01:00.000
2 2017-05-20 00:01:02.000
1 2017-05-20 00:01:10.000
1 2017-05-20 00:01:20.000
2 2017-05-20 00:01:12.000
1 2017-05-20 00:01:30.000
2 2017-05-20 00:01:22.000
2 2017-05-20 00:01:32.000
After delete data should be like below
VehId TRackdt
1 2017-05-20 00:00:30.000
2 2017-05-20 00:00:32.000
1 2017-05-20 00:01:00.000
2 2017-05-20 00:01:02.000
1 2017-05-20 00:01:30.000
2 2017-05-20 00:01:32.000
I tried below query but it is taking too much time
ALTER PROCEDURE [dbo].[DELETEINTERVALDATA]
@FROMDATE DATETIME,
@TODATE DATETIME,
@INTERVAL INT,
@FLAG INT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TRACKDT DATETIME
DECLARE @I INT =1
DECLARE @V INT =1
DECLARE @COUNT INT
DECLARE @VCOUNT INT
DECLARE @STARTDATE DATETIME = ''
DECLARE @VEHID INT
DECLARE @TIMEDIFF INT
CREATE TABLE #TEMPVEHICLE
(
SNO INT IDENTITY(1,1),
VEHID INT
)
CREATE TABLE #TEMPLOG
(
SNO INT IDENTITY(1,1),
TRACKDT DATETIME
)
IF (@FLAG = 1 )
BEGIN
INSERT INTO #TEMPVEHICLE (VEHID) SELECT VEHID FROM VEHICLEMASTER ORDER BY VEHID
SELECT @VCOUNT = COUNT(SNO) FROM #TEMPVEHICLE
WHILE (@V <= @VCOUNT)
BEGIN
SELECT @VEHID = VEHID FROM #TEMPVEHICLE WHERE SNO = @V
INSERT INTO #TEMPLOG(TRACKDT) SELECT TRACKDT
FROM TRACKINGLOG WITH(NOLOCK)
WHERE TRACKDT BETWEEN @FROMDATE AND @TODATE AND VEHID = @VEHID
ORDER BY TRACKDT ASC
SELECT @COUNT = COUNT(SNO) FROM #TEMPLOG
WHILE (@I <= @COUNT)
BEGIN
SELECT @TRACKDT=TRACKDT FROM #TEMPLOG WHERE SNO = @I
IF (@I = 1)
BEGIN
SELECT @STARTDATE = @TRACKDT
END
ELSE
BEGIN
SELECT @TIMEDIFF = DATEDIFF(SECOND,@STARTDATE,@TRACKDT)
IF @TIMEDIFF <= 20
BEGIN
DELETE FROM TRACKINGLOG WHERE TRACKDT = @TRACKDT AND VEHID = @VEHID
END
ELSE
BEGIN
SELECT @STARTDATE = @TRACKDT
END
END
SELECT @I = @I + 1
END
TRUNCATE TABLE #TEMPLOG
SELECT @V = @V + 1,@STARTDATE= '',@I=1
END
DROP TABLE #TEMPLOG
DROP TABLE #TEMPVEHICLE
END
END
How can I write query which delete data based on time interval and should be quick??
Thanks in advance