Stored procedures sqlserver查询优化技术
我的存储过程需要很长时间才能执行。 除了使用一些良好的实践记录查询外,还有谁可以建议我如何加快存储过程的速度。 我听说过创建索引,但我不确定它们是什么。 请提出加快我的查询速度的所有最佳方法。 谢谢 去这里有一些:Stored procedures sqlserver查询优化技术,stored-procedures,query-optimization,user-defined-functions,indices,Stored Procedures,Query Optimization,User Defined Functions,Indices,我的存储过程需要很长时间才能执行。 除了使用一些良好的实践记录查询外,还有谁可以建议我如何加快存储过程的速度。 我听说过创建索引,但我不确定它们是什么。 请提出加快我的查询速度的所有最佳方法。 谢谢 去这里有一些: WHERE子句中的每一列都应该有索引。看见 您的SQL语言提供了如何实现这一点 学习如何解释计划,看看什么是慢的 存储过程语言是功能性的,而不是基于集合的。使用JOIN,不要落入(n+1)查询/迭代陷阱 了解使用某些函数如何强制您在WHERE子句中扫描表 如果您想立即获得一些帮助,请
如果您想立即获得一些帮助,请向我们展示存储过程,我要集中精力加速存储过程的第一个地方是函数(外部应用于底部附近)。它们可以而且经常绝对破坏性能。若要知道是否是这种情况,请制作一个已删除它们的存储过程版本,并查看它所产生的差异。通常从Tentherapeuticalt返回多少行?3)解释计划:是!!!非常好的建议。1) 索引:错误(如果按字面理解)。你应该考虑索引:是的。“必须有索引”:第4)个存储过程提供了基于集合(SQL)和过程的最佳性能。尽可能使用集合,而不是逐项处理。2) “where”原因中列的顺序可能会有所不同。有时会有很大的不同。关于看哪里的顺序。我的经验是使用MS Sql Server,很少发现摆弄WHERE表达式的顺序会产生任何影响。1)@palsm4是正确的。存储过程中对特定表的所有where子句引用只需要一个精心选择的索引。
CREATE PROCEDURE [dbo].[usp_GetAlternates]
(
@NNumber CHAR(11) ,
@pid INT ,
@pbmid INT
)
AS
BEGIN
TRUNCATE TABLE TempTherapeuticAlt
INSERT INTO TempTherapeuticAlt
SELECT NULL AS MedicationID ,
PR.ePrescribingName AS MedicationName ,
U.Strength AS MedicationStrength ,
FRM.FormName AS MedicationForm ,
PR.DEAClassificationID AS DEASchedule ,
NULL AS NDCNumber
FROM Product PR
JOIN ( SELECT MP.MarketedProductID
FROM table2 TCTSP
JOIN table3 MP ON MP.SpecificProductID = TCTSP.SpecificProductID
JOIN ( SELECT TCTSP.TherapeuticConceptTreeID
FROM table3 MP
JOIN table2 TCTSP ON MP.SpecificProductID = TCTSP.SpecificProductID
JOIN ( SELECT
PR.MarketedProductID
FROM
table4 PA
JOIN Product PR ON PA.ProductID = PR.ProductID
WHERE
PA.NDC11 = @NNumber
) PAPA ON MP.MarketedProductID = PAPA.MarketedProductID
) xxx ON TCTSP.TherapeuticConceptTreeID = xxx.TherapeuticConceptTreeID
) MPI ON PR.MarketedProductID = MPI.MarketedProductID
JOIN ( SELECT P.ProductID ,
O.Strength ,
O.Unit
FROM Product AS P
INNER JOIN table3 AS M ON P.MarketedProductID = M.MarketedProductID
INNER JOIN table5 AS S ON M.SpecificProductID = S.SpecificProductID
LEFT OUTER JOIN table6 AS O ON S.SpecificProductID = O.SpecificProductID
GROUP BY P.ProductID ,
O.Strength ,
O.Unit
) U ON PR.ProductID = U.ProductID
JOIN ( SELECT PA.ProductID ,
S.ScriptFormID ,
F.Code AS NCPDPScriptFormCode ,
S.FormName
FROM table4 AS PA
INNER JOIN table7 AS S ON PA.NCPDPScriptFormCode = S.NCPDPScriptFormCode
INNER JOIN table8 AS F ON S.FormName = F.FormName
GROUP BY PA.ProductID ,
S.ScriptFormID ,
F.Code ,
S.FormName
) FRM ON PR.ProductID = FRM.ProductID
GROUP BY PR.ePrescribingName ,
U.Strength ,
FRM.FormName ,
PR.DEAClassificationID
ORDER BY pr.ePrescribingName
SELECT LL.ProductID AS MedicationID ,
temp.MedicationName ,
temp.MedicationStrength ,
temp.MedicationForm ,
temp.DEASchedule ,
temp.NDCNumber ,
fs.[ReturnFormulary] AS FormularyStatus ,
copay.CopaTier ,
copay.FirstCopayTerm ,
copay.FlatCopayAmount ,
copay.PercentageCopay
FROM TempTherapeuticAlt temp
OUTER APPLY ( SELECT TOP 1
ProductID
FROM Product
WHERE ePrescribingName = temp.MedicationName
) AS LL
OUTER APPLY function1(@pid, LL.ProductID, @pbmid) AS fs
OUTER APPLY function2(LL.ProductID, @pbmid) AS copay
ORDER BY LL.ProductID
TRUNCATE TABLE TempTherapeuticAlt
END