该系统是多年前在 SQL7 中构建的,目前在 SQL2k5 中运行
我们有一个表 tProducts,它的 PK/Clustered Index 为自豪ctid Guid。我意识到为了获得最佳性能,我们应该修改表格,但目前不可能。我将它加入到 tProductSpecial 表中,该表还具有 productid 的 PK/Clustered Index,这也是这种关系中的 FK。我们在 tProducts 表中有大约 50k 条记录,在 tProductSpecial 表中有大约 35k 条记录(有些产品有特殊信息,有些没有)。还有一块。我在存储过程中使用临时表来获取登录的用户安全角色并加载它们,这也加入了 tProducts 表,roleid 是 tProducts 中的非聚集索引。我已经包含了一些访问这些表的 WHERE 条件。
SELECT *
FROM tProducts
JOIN tProductSpecial ON tProducts.productid=tProductSpecial.productid
JOIN #tRoles ON tProducts.roleid=#tRoles.roleid
WHERE
(tProducts.productSKU = @sku AND tProducts.productStatus=1) --DIRECT MATCH
OR
( -- KEYWORD SEARCH
CONTAINS(tProducts.*,'FORMSOF(INFLECTIONAL,''' + @lookuptext + ''')')
AND
(
@productStatus IS NULL
OR
(
@productStatus IS NOT NULL
AND
tProducts.productStatus = @productStatus
)
)
AND
( --- item on sale
@bOnSale IS NULL
OR @bOnSale=0
OR
(
@bOnSale = 1
AND tProducts.productOnSale=1
)
)
AND
( -- from price
@from=0
OR @from IS NULL
OR
(
@from<>0
AND
tProducts.customerCost>=@from
)
)
AND
( --to price
@to=0
OR @to IS NULL
OR
(
@to<>0
AND
tProducts.customerCost<=@from
)
)
AND
( --how old is product
@age IS NULL
OR @age = 0
OR
(
@age IS NOT NULL
AND @age > 0
AND DATEDIFF(day,tProducts.productCreated,GETDATE())
<=CONVERT(varchar(10),@age)
)
)
ORDER BY tProducts.productSKU