The issue was that some postcodes were stored with spaces and some without.
This was further complicated by some user inputs (into the “Postcode Search” SSRS Report) had a space and some did not.
The root cause of the slow report was that the 90 MILLION stored postcode was being retrieved and manipulated (to remove spaces) before being compared with the ONE input.
--- OLD CODE ----------------- DECLARE @PostCode VARCHAR(8) SELECT Forename, Surname, AccountNumber AS CustomerNo, AccountStartDate, AddressLine2 AS Address, PostCode, DateOfBirth FROM [dbo].[SV_Customers] WHERE (CountryCode = 'GB') AND (REPLACE(Postcode, ' ', '') = @PostCode);
My insight was to manipulate just the ONE input postcode before comparing it TWICE (with and without a space) to the un-manipulated postcodes stored in the database.
The first task then, was to split the input postcode into two parts. In all formats the last 3 characters were number, letter, letter.
So after saving the last part of the postcode separately, it was easy to deduce that the first part must be the whole thing minus the last part.
--- NEW CODE ------------------------ DECLARE @PostCode VARCHAR(8) DECLARE @pc2 CHAR(3) = RIGHT(@PostCode, 3); DECLARE @pc1 VARCHAR(4) = RTRIM(REPLACE(@PostCode, @pc2, '')); SELECT Forename, Surname, AccountNumber AS CustomerNo, AccountStartDate, AddressLine2 AS Address, Postcode, DateOfBirth FROM [dbo].[SV_Customers] WHERE CountryCode = 'GB' AND (PostCode = @pc1 + @pc2 -- without space OR PostCode = @pc1 + ' ' + @pc2); -- or with space
The final task was to write the WHERE clause as simply as possible for long term maintenance. That’s the DBA in me 🙂