Rac*_*SQL 2 performance sql-server sql-server-2008-r2
我有这个查询。这是第二个查询。第一个是在子查询之外使用左侧/或外部,查询计划很糟糕。(用完整的语法编辑了问题):
https://www.brentozar.com/pastetheplan/?id=HJEioh56N
我nested loop (inner join)在查询计划中有 97%。
我确定问题出OR在第二个连接内部,因为我在这里和那里更改了一些东西,我可以摆脱它们,但我想确定处理此类数据的最佳方法是什么。所有这些表也有数百万行。
表定义:
CREATE TABLE [DBO].[TABLE1](
[F1] [int] NOT NULL,
[F1] [varchar](16) NOT NULL,
[F3] [money] NOT NULL,
[F4] [money] NOT NULL,
Run Code Online (Sandbox Code Playgroud)
我知道创建了这个索引:
在 DBO.TABLE1 ( F1, F2 ) 上创建非聚集索引 IX_TB1
该索引搜索现在是 14%,但HASH MATCH成本为 82%。
有助于 OR 谓词的常见查询重写如下所示:
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
INNER 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
INNER 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)
Run Code Online (Sandbox Code Playgroud)
Apply 并不总是最好的方法,尽管我经常使用常规派生的 JOIN 成功。
这里有一些关于类似问题的背景: