I have [this query plan](https://www.brentozar.com/pastetheplan/?id=HJEioh56N). It shows a *nested loop (inner join)* with 97% cost.
I'm sure the problem is the `OR` inside the second join, because I changed something here and there and I could get rid of it, but I would like to be sure what would be the best way to deal with data like these. These tables have millions of rows.
### Table Definition
CREATE TABLE [DBO].[TABLE1](
[F1] [int] NOT NULL,
[F1] [varchar](16) NOT NULL,
[F3] [money] NOT NULL,
[F4] [money] NOT NULL)
I created this index:
```
CREATE NONCLUSTERED INDEX IX_TB1 ON DBO.TABLE1
(
F1,
F2
)
```
The index seek is now 14% cost, but got a *Hash Join* with 82% cost.
A common query rewrite that helps with `OR` predicates looks like this:
```
SELECT
tTitulo.CdContaCartao,
tTitulo.CdStatus,
MAX(DiariaMaxima)
INTO #DiariaMaxima
FROM Sistema.Titulo AS tTitulo
CROSS APPLY
(
SELECT MAX(DiariaMaxima)
FROM
(
SELECT tTIPM.DtDiaria
FROM Sistema.TaxaIndice_PagamentoMensal_ContaCartao AS tTIPM_Cartao
JOIN Sistema.TaxaIndice_PagamentoMensal AS tTIPM
ON tTIPM.CdTaxaIndice_PagamentoMensal = tTIPM_Cartao.CdTaxaIndice_PagamentoMensal
WHERE tTIPM_Cartao.CdContaCartao = tTitulo.CdContaCartao
UNION ALL
SELECT tTIPM.DtDiaria
FROM Sistema.TaxaIndice_PagamentoMensal_ContaCartao AS tTIPM_Cartao
JOIN Sistema.TaxaIndice_PagamentoMensal AS tTIPM
ON tTIPM.CdTaxaIndice_PagamentoMensal = tTIPM_Cartao.CdTaxaIndice_PagamentoMensal
WHERE tTIPM_Cartao.CdContaCartao = tTitulo.CdContaCartao_Visa
) AS x (DiariaMaxima)
) AS DiariaMaxima (DiariaMaxima);
```
`Apply` is not always the best method for this, though I've often had success with it over using a regular join.
Some background on similar problems here:
- [Analysing A Query Plan][1]
- [How to Optimise Query][2]
[1]: https://dba.stackexchange.com/questions/23773/analysing-a-query-plan
[2]: https://dba.stackexchange.com/questions/23766/how-to-optimise-query