我有一個用MS SQL Server R2編寫的查詢。請幫助優化它。它返回超過6個Lakhs的字符串數據結構。返回結果大約需要5-6分鐘。有什麼辦法可以改善嗎?優化SQL查詢以減少執行時間
下面是我的查詢:
CREATE proc [dbo].[Test]
(
@UserTypeID int,
@UserID int,
@CityID int,
@OperatorID int,
@ParameterID int
)
as
begin
declare @temp table
(
range decimal(18,2),
range2 decimal(18,2),
image varchar(50),
symbol varchar(20)
)
If(@UserID>0)
Begin
--print 'hii'
Insert into @temp(range,range2,image,symbol)
SELECT tbl_Legend_ViewNetwork_Dtls.range, tbl_Legend_ViewNetwork_Dtls.range2, tbl_Legend_ViewNetwork_Dtls.image,tbl_Legend_ViewNetwork_Dtls.symbol
FROM tbl_Legend_ViewNetwork_Dtls INNER JOIN
tbl_Legend_ViewNetwork ON tbl_Legend_ViewNetwork_Dtls.tbl_legend_view_network_id = tbl_Legend_ViewNetwork.id
WHERE tbl_Legend_ViewNetwork.parameter_id = @ParameterID and tbl_Legend_ViewNetwork.user_type_id = @UserTypeID and tbl_Legend_ViewNetwork.is_default = 1 and tbl_Legend_ViewNetwork.user_id = @UserID
update @temp set
range = range2,
range2 = range
where symbol = '<'
End
Else
Begin
Insert into @temp(range,range2,image,symbol)
SELECT tbl_Legend_ViewNetwork_Dtls.range, tbl_Legend_ViewNetwork_Dtls.range2, tbl_Legend_ViewNetwork_Dtls.image,tbl_Legend_ViewNetwork_Dtls.symbol
FROM tbl_Legend_ViewNetwork_Dtls INNER JOIN
tbl_Legend_ViewNetwork ON tbl_Legend_ViewNetwork_Dtls.tbl_legend_view_network_id = tbl_Legend_ViewNetwork.id
WHERE tbl_Legend_ViewNetwork.parameter_id = @ParameterID and tbl_Legend_ViewNetwork.user_type_id = @UserTypeID and tbl_Legend_ViewNetwork.is_default = 1
update @temp set
range = range2,
range2 = range
where symbol = '<'
End
--select * from @temp
Select '[' + STUFF(
(SELECT ',{"latitude":"'+ a.lat+ '","longitude":"' + a.long+ '","value":"' +convert(varchar(20),a.value)+ '","image":"' +temp.image +'"}'
FROM (SELECT tbl_Survey_Details.lat, tbl_Survey_Details.long, tbl_Survey_Details.value
FROM tbl_Survey_Details INNER JOIN
tbl_Survey ON tbl_Survey_Details.tbl_survey_id = tbl_Survey.id INNER JOIN
tbl_Location ON tbl_Survey.tbl_location_id = tbl_Location.id INNER JOIN
tbl_Area ON tbl_Location.tbl_area_id = tbl_Area.id INNER JOIN
tbl_City ON tbl_Area.tbl_city_id = tbl_City.id
WHERE tbl_Survey_Details.tbl_parameter_id = @ParameterID and tbl_Survey.tbl_mobile_operator_id = @OperatorID and tbl_Area.tbl_city_id = @CityID) AS a
INNER JOIN @temp temp on a.value between temp.range and temp.range2
For XML Path ('')),1,1,'') + ']' as data
End
我試了一下,它給了我一些建議(在survey_details表索引),我應用了所有,我只有幾秒的差異。其他可能的解決方案? –
大部分時間花在哪裏?如果數據發生很大變化,那麼通常需要很長時間。你真的想要一次定位1-10 000行,所以使用你增量的變量來分割範圍。我不知道是否最好在用戶ID或範圍上分割,攻擊查詢分析器中佔據最大比例的位。 –
已轉移到[此鏈接](http://dba.stackexchange.com/questions/43553/reduce-clustered-index-seek-cost-sql-server-2008-r2) –