I have a query that's assigns engagement definition to subscribers based on their interaction with the email. The dataViewSubscribers DE contains 16million users. However, the query times out now every time it's ran. Is there a way it can be optimised?
SELECT DISTINCT ds.emailaddress,
'New' AS EngagementDefinition
FROM dataviewsubscribers ds
WHERE CONVERT(VARCHAR(10), ds.datejoined, 102) >=
CONVERT(VARCHAR(10), Getdate() - 14, 102)
UNION
SELECT DISTINCT ds.emailaddress,
'Active' AS EngagementDefinition
FROM dataviewsubscribers ds
INNER JOIN _open o
ON o.subscriberkey = ds.emailaddress
WHERE CONVERT(VARCHAR(10), ds.datejoined, 102) <
CONVERT(VARCHAR(10), Getdate() - 14, 102)
AND CONVERT(VARCHAR(10), o.eventdate, 102) >=
CONVERT(VARCHAR(10), Getdate() - 90, 102)
UNION
SELECT DISTINCT ds.emailaddress,
'Defining' AS EngagementDefinition
FROM dataviewsubscribers ds
LEFT JOIN _open o
ON o.subscriberkey = ds.emailaddress
WHERE CONVERT(VARCHAR(10), ds.datejoined, 102) <
CONVERT(VARCHAR(10), Getdate() - 14, 102)
AND CONVERT(VARCHAR(10), ds.datejoined, 102) >=
CONVERT(VARCHAR(10), Getdate() - 90, 102)
AND o.subscriberkey IS NULL
UNION
SELECT DISTINCT ds.emailaddress,
'At Risk' AS EngagementDefinition
FROM dataviewsubscribers ds
LEFT JOIN _open o
ON o.subscriberkey = ds.emailaddress
WHERE CONVERT(VARCHAR(10), ds.datejoined, 102) <
CONVERT(VARCHAR(10), Getdate() - 90, 102)
AND o.subscriberkey IS NULL
UNION
SELECT DISTINCT ds.emailaddress,
'Inactive' AS EngagementDefinition
FROM dataviewsubscribers ds
LEFT JOIN _open o
ON ds.emailaddress = o.subscriberkey
WHERE CONVERT(VARCHAR(10), ds.datejoined, 102) <
CONVERT(VARCHAR(10), Getdate() - 90, 102)
AND CONVERT(VARCHAR(10), o.eventdate, 102) <
CONVERT(VARCHAR(10), Getdate() - 90, 102)
AND CONVERT(VARCHAR(10), o.eventdate, 102) !<
CONVERT(VARCHAR(10), Getdate() - 90, 102)