weve followed all the known methods to improve performance; and now are
ready to start denormalizing the tables. Can anyone see anything obvious
that i can do to improve the perofmrance of this sp under heavy load?
CREATE procedure sprListingSearch(
@Culture nchar(5)
,@MinRentPrice int
,@MaxRentPrice int
,@RentUnit int
,@MinSalePrice int
,@MaxSalePrice int
,@SaleUnit int
,@MinBath int
,@MaxBath int
,@MinBed int
,@MaxBed int
,@CompanyName nvarchar(100)
,@Address nvarchar(100)
,@ProvinceID int
,@City nvarchar(1024)
,@Community nvarchar(1024)
,@PostalCode nvarchar(7)
,@FullName nvarchar(100)
,@AreaId nvarchar(512)
,@Features nvarchar(1000)
,@AllFeatures bit
,@CobrandID int
,@PropertyType nvarchar(1000)
,@MinDateBuilt int
,@MaxDateBuilt int
,@AgeClassID int
,@NumberOfDays int
,@ReferenceNumber nVarchar(25)
,@LinkbackID varchar(512)
,@LinkbackType INT
,@BusinessTypeID varchar(512)
,@BuildingStyleID varchar(512)
,@MinFloorSpace INT
,@MaxFloorSpace INT
,@MinLotSize INT
,@MaxLotSize INT
,@LotSizeUnit INT
,@BoardID varchar(512)
,@ListingType varchar(512)
,@ListingStatus varchar(512)
,@PermitShowPublicICX INT
,@ApplicationID INT
,@OrderDirection CHAR(1)
,@CurrentPage int
,@RecordsPerPage int
,@MaxRecords int
,@OrderBy INT
,@RecordsFound int out
,@Debug BIT = 0
)AS
SET NOCOUNT ON
DECLARE @CultureID INT
EXEC sprGetCultureID @Culture, @CultureID OUT
IF @ApplicationID = 0 BEGIN
EXEC sprGetApplicationID @CobrandID, @ApplicationID OUT
END
IF @CobrandID = 1 AND @LinkbackID = '' BEGIN
exec sprlistingSearchFast @Culture, @MinRentPrice , @MaxRentPrice ,
@RentUnit , @MinSalePrice , @MaxSalePrice , @SaleUnit , @MinBath , @MaxBath
, @MinBed , @MaxBed , @CompanyName, @Address , @ProvinceID , @City ,
@Community , @PostalCode , @FullName , @AreaId , @Features , @AllFeatures,
@CobrandID , @PropertyType , @MinDateBuilt , @MaxDateBuilt , @AgeClassID ,
@NumberOfDays , @ReferenceNumber , @LinkbackID, @LinkbackType ,
@BusinessTypeID, @BuildingStyleID, @MinFloorSpace , @MaxFloorSpace ,
@MinLotSize , @MaxLotSize , @LotSizeUnit , @BoardID, @ListingType,
@ListingStatus, @PermitShowPublicICX , @ApplicationID , @OrderDirection,
@CurrentPage , @RecordsPerPage , @MaxRecords , @OrderBy , @RecordsFound
OUT, @Debug
RETURN
END
DECLARE @SQL AS nvarchar(4000),
@SQLSelect AS nvarchar(4000),
@SQLWhere AS nvarchar(4000),
@SQLFrom AS nVarChar(4000),
@SQLOrderBy as nvarchar(4000),
@ReqAddress AS BIT,
@ReqLand AS BIT,
@ReqBuilding AS BIT,
@ReqBuildingAge AS BIT,
@ReqPropertyFeatures AS BIT,
@ReqListingIndividual AS BIT,
@ReqAreaSearch AS BIT,
@ReqPropertyTypeSearch AS BIT,
@ReqIndividual AS BIT,
@ReqOrganization AS BIT,
@ReqPropertyType AS BIT,
@cvs varchar(512),
@pos INT,
@val2 char(50),
@val char(1),
@IsFirst BIT
SET @ReqLand = 0
SET @ReqAddress = 0
SET @ReqBuilding = 0
SET @ReqBuildingAge = 0
SET @ReqPropertyFeatures = 0
SET @ReqListingIndividual = 0
SET @ReqIndividual = 0
SET @ReqOrganization = 0
SET @ReqAreaSearch = 0
SET @ReqPropertyTypeSearch = 0
SET @ReqPropertyType = 0
SET @SQLWhere = ' WHERE 1 = 1'
IF @PermitShowPublicICX <> -1 BEGIN
SET @SQLWhere = @SQLWhere + ' AND L.PermitShowPublicICX =
@PermitShowPublicICX'
END
IF @Address <> '' BEGIN
SET @ReqAddress = 1
SET @SQLWhere = @SQLWhere + ' AND (L.permitShowAddress = 1 AND
A.AddressLine1 LIKE ''%'' + @Address + ''%'' OR A.AddressLine2 LIKE ''%'' +
@Address + ''%'' OR A.AddressLine3 LIKE ''%'' + @Address + ''%'')'
END
IF @ProvinceID <> 0 BEGIN
SET @ReqAddress = 1
SET @SQLWhere = @SQLWhere + ' AND A.ProvinceID = @ProvinceID'
END
IF @PostalCode <> '' BEGIN
SET @ReqAddress = 1
SET @SQLWhere = @SQLWhere + ' AND A.postalCode = @PostalCode'
END
DECLARE @PriceAndRent as BIT
IF @MinSalePrice >= 0 AND @MinRentPrice >= 0 BEGIN
SET @PriceAndRent = 1
END ELSE BEGIN
SET @PriceAndRent = 0
END
IF @MinSalePrice >= 0 BEGIN
SET @SQLWhere = @SQLWhere + ' AND '
IF @PriceAndRent = 1 SET @SQLWhere = @SQLWhere + ' ('
SET @SQLWhere = @SQLWhere + '(P.Price >= @MinSalePrice'
IF @MaxSalePrice <> 0 SET @SQLWhere = @SQLWhere + ' AND P.Price <=
@MaxSalePrice)'
ELSE SET @SQLWhere = @SQLWhere + ')'
--END ELSE BEGIN
-- SET @SQLWhere = @SQLWhere + ' AND P.Price IS NULL'
END
IF @minRentPrice >= 0 BEGIN
IF @PriceAndRent = 1 BEGIN
SET @SQLWhere = @SQLWhere + ' OR '
END ELSE BEGIN
SET @SQLWhere = @SQLWhere + ' AND '
END
SET @SQLWhere = @SQLWhere + '(P.LeaseRent >= @minRentPrice'
IF @MaxRentPrice <> 0 SET @SQLWhere = @SQLWhere + ' AND P.LeaseRent <=
@MaxRentPrice)'
ELSE SET @SQLWhere = @SQLWhere + ')'
IF @PriceAndRent = 1 SET @SQLWhere = @SQLWhere + ')'
--END ELSE BEGIN
-- SET @SQLWhere = @SQLWhere + ' AND P.LeaseRent IS NULL'
END
IF @MinBed <> 0 BEGIN
SET @ReqLand = 1
SET @ReqBuilding = 1
SET @SQLWhere = @SQLWhere + ' AND B.BedroomsAboveGroundTotal >= @MinBed'
END
IF @MaxBed <> 0 BEGIN
SET @ReqLand = 1
SET @ReqBuilding = 1
SET @SQLWhere = @SQLWhere + ' AND B.BedroomsAboveGroundTotal <= @MaxBed'
END
IF @MinBath <> 0 BEGIN
SET @ReqLand = 1
SET @ReqBuilding = 1
SET @SQLWhere = @SQLWhere + ' AND (B.BathroomsAboveGroundTotal +
(IsNull(B.HalfBathsTotal,0) * 0.5)) >= @MinBath'
END
IF @MaxBath <> 0 BEGIN
SET @ReqLand = 1
SET @ReqBuilding = 1
SET @SQLWhere = @SQLWhere + ' AND (B.BathroomsAboveGroundTotal +
(isNull(B.HalfBathsTotal,0) * 0.5)) <= @MaxBath'
END
IF @CobrandID <> 0 AND @CobrandID <> 1 AND @CobrandID <> 2 BEGIN
SET @ReqListingIndividual = 1
SET @SQLWhere = @SQLWhere + ' AND LI.IndividualID IN (SELECT ID from
cobrand_id_join where cobrandID =@COBRANDID AND type = ''I'' UNION ALL
SELECT INDIVIDUALID AS ID from individual_organization WHERE ORGANIZATIONID
IN (SELECT id from cobrand_id_join where cobrandid = @COBRANDID AND type =
''O''))'
END
IF @ReferenceNumber <> '' BEGIN
SET @SQLWhere = @SQLWhere + ' AND L.ReferenceNumber = @ReferenceNumber'
END
IF @NumberOfDays <> 0 BEGIN
SET @SQLWhere = @SQLWhere + ' AND L.InsertedDate >= (getdate() -
@NumberOfDays)'
END
IF @MinLotSize <> 0 OR @MaxLotSize <> 0 BEGIN
SET @ReqLand = 1
SET @SQLWhere = @SQLWhere + ' AND NOT LA.sizeTotal IS NULL'
END
IF @MinLotSize <> 0 BEGIN
SET @ReqLand = 1
SET @SQLWhere = @SQLWhere + ' AND dbo.MeasureConvert(LA.sizeTotal,
LA.SizeTotalMeasureUnitID, @LotSizeUnit) >= @MinLotSize'
END
IF @MaxLotSize <> 0 BEGIN
SET @SQLWhere = @SQLWhere + ' AND dbo.MeasureConvert(LA.sizeTotal,
LA.SizeTotalMeasureUnitID, @LotSizeUnit) <= @MaxLotSize'
END
IF @MinFloorSpace <> 0 OR @MaxFloorSpace <> 0 BEGIN
SET @ReqLand = 1
SET @ReqBuilding = 1