1) Hai dei campi sia nelle clausole Partition By che Order By. Ciò non ha senso poiché avrai uno e un solo valore per ciascuno (sma.FastPer, sma.SlowPer). Puoi rimuovere in sicurezza questi campi dalla parte Ordina per della funzione finestra.
2) Supponendo che tu abbia già indici per prestazioni adeguate in "initialSmas i join initialSmas" e che tu abbia già un indice per (initialSmas.Symbol, initialSmas.Period, initialSmas.TradeDate) il meglio che puoi fare è copiare smaComparisonsByPer in un tabella temporanea dove puoi creare un indice su (sma.Symbol, sma.FastPer, sma.SlowPer, sma.TradeDate)