1) Vous avez des champs à la fois dans les clauses Partition By et Order By. Cela n'a pas de sens puisque vous aurez une et une seule valeur pour chacun (sma.FastPer, sma.SlowPer). Vous pouvez supprimer en toute sécurité ces champs de la partie Trier par de la fonction de fenêtre.
2) En supposant que vous avez déjà des index pour des performances adéquates dans "initialSmas i join initialSmas" et que vous avez déjà un index pour (initialSmas.Symbol, initialSmas.Period, initialSmas.TradeDate), le mieux que vous puissiez faire est de copier smaComparisonsByPer dans un table temporaire où vous pouvez créer un index sur (sma.Symbol, sma.FastPer, sma.SlowPer, sma.TradeDate)