这是我的存储过程,即使使用本地数据库运行也需要一些时间来执行。
请提出更改以改善效果
BEGIN TRY
DECLARE @COUNTRY_CD INT
SET @COUNTRY_CD =(SELECT COUNTRY_CD FROM COUNTRY WHERE COUNTRY_DESC = LTRIM(RTRIM(@COUNTRY_DESC)))
DECLARE @COMPANNY_CD INT
SET @COMPANNY_CD =(SELECT COMPANY_CD FROM COMPANY WHERE COMPANY_DESC = LTRIM(RTRIM(@COMPANY_DESC)))
BEGIN TRANSACTION
DELETE FROM PACK
WHERE COUNTRY_CD = @COUNTRY_CD
AND COMPANY_CD = @COMPANNY_CD
AND PACK_DESC = LTRIM(RTRIM(@PACK_DESC))
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF(@@TRANCOUNT > 0)
ROLLBACK TRANSACTION
DECLARE @ErrMsg nvarchar(4000),
@ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
答案 0 :(得分:1)
尝试评估变量@COUNTRY_CD和的值 @COMPANNY_CD在一个单独的proc中,并将它们作为i / p参数传递给它 proc并看看它是否有帮助。我在过去和过去看过这个问题 我刚刚提到的解决方案解决了这个问题。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果不了解有关数据库架构的更多信息,很难说清楚。一些初步想法可能是立即清除* _DESC变量,而不是在WHERE子句中执行LTRIM和RTRIM。也许在PACK表上考虑或添加一个包含COUNTRY_CD / COMPANY_CD的索引(不过描述,假设它是长字符串文本。我认为COMPANY和COUNTRY是非常小的表,但希望你在这些字段上有适当的索引。同样值得尝试在DELETE中加入这些表,而不是提前进行查找。
-- clenaup variables
-- these should be new vars, not input parms
SELECT @COUNTRY_DESC = LTRIM(RTRIM(@COUNTRY_DESC))
,@COMPANY_DESC = LTRIM(RTRIM(@COMPANY_DESC))
,PACK_DESC = LTRIM(RTRIM(@PACK_DESC ))
-- delete
DELETE PACK
FROM PACK
JOIN COUNTRY ON PACK.COUNTRY_CD = COUNTRY.COUNTRY_CD
JOIN COMPANY ON PACK.COMPANY_CD = COMPANY.COMPANY_CD
WHERE COUNTRY.COUNTRY_DESC = @COUNTRY_DESC
AND COMPANY.COMPANY_DESC = @COMPANY_DESC
AND PACK.PACK_DESC = @PACK_DESC
答案 3 :(得分:0)
确保公司在company_cd,country_cd上的COUNTRY和company_cd,country_cd,pack_desc上的PACK上编入索引。
从没有正确索引的大表中删除会花费一些时间。