Does anyone know another way to run the query below more efficiently? I’m using SQL Server 2014. I’m facing a problem if i create index on table or on view .
On table 2 (TB_FATURA_ITEM_TRANSACAO_HST) , has stored 50 million rows .
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW vItemFatura (ID , ID_TRANSACAO , ID_FATURA ,ID_FATURA_ITEM ,ID_TIPO_SERVICO , ID_SERVICO ,ID_TARIFA ,DATA_REGISTRO_TRANSACAO ,DATA_PAGAMENTO ,CODIGO_REFERENCIA , DESCRICAO ,MERCHANT_ID,ORDER_ID,IDENTIFICACAO_TITULO,CNPJ,NUMERO_AGENCIA,NUMERO_CONTA,QUANTIDADE_ITENS,VALOR_ITEM,VALOR_TRANSACAO,STATUS_TRANSACAO,DATA_INI_CONTABILIZACAO,DATA_FIM_CONTABILIZACAO,DATA_INI_RETROATIVO,DATA_FIM_RETROATIVO,ATIVO,DATA_INSERT,DATA_UPDATE,APP_INSERT,APP_UPDATE,VALOR_PEDIDO_EC)
AS
SELECT
T1.ID
,T1.ID_TRANSACAO
,T1.ID_FATURA
,T1.ID_FATURA_ITEM
,T1.ID_TIPO_SERVICO
,T1.ID_SERVICO
,T1.ID_TARIFA
,T1.DATA_REGISTRO_TRANSACAO
,T1.DATA_PAGAMENTO
,T1.CODIGO_REFERENCIA
,T1.DESCRICAO
,T1.MERCHANT_ID
,T1.ORDER_ID
,T1.IDENTIFICACAO_TITULO
,T1.CNPJ
,T1.NUMERO_AGENCIA
,T1.NUMERO_CONTA
,T1.QUANTIDADE_ITENS
,T1.VALOR_ITEM
,T1.VALOR_TRANSACAO
,T1.STATUS_TRANSACAO
,T1.DATA_INI_CONTABILIZACAO
,T1.DATA_FIM_CONTABILIZACAO
,T1.DATA_INI_RETROATIVO
,T1.DATA_FIM_RETROATIVO
,T1.ATIVO
,T1.DATA_INSERT
,T1.DATA_UPDATE
,T1.APP_INSERT
,T1.APP_UPDATE
,T1.VALOR_PEDIDO_EC
FROM dbo.TB_FATURA_ITEM_TRANSACAO T1
UNION
SELECT
T2.ID
,T2.ID_TRANSACAO
,T2.ID_FATURA
,T2.ID_FATURA_ITEM
,T2.ID_TIPO_SERVICO
,T2.ID_SERVICO
,T2.ID_TARIFA
,T2.DATA_REGISTRO_TRANSACAO
,T2.DATA_PAGAMENTO
,T2.CODIGO_REFERENCIA
,T2.DESCRICAO
,T2.MERCHANT_ID
,T2.ORDER_ID
,T2.IDENTIFICACAO_TITULO
,T2.CNPJ
,T2.NUMERO_AGENCIA
,T2.NUMERO_CONTA
,T2.QUANTIDADE_ITENS
,T2.VALOR_ITEM
,T2.VALOR_TRANSACAO
,T2.STATUS_TRANSACAO
,T2.DATA_INI_CONTABILIZACAO
,T2.DATA_FIM_CONTABILIZACAO
,T2.DATA_INI_RETROATIVO
,T2.DATA_FIM_RETROATIVO
,T2.ATIVO
,T2.DATA_INSERT
,T2.DATA_UPDATE
,T2.APP_INSERT
,T2.APP_UPDATE
,T2.VALOR_PEDIDO_EC
from dbo.TB_FATURA_ITEM_TRANSACAO_HST T2
I was wondering using Schemabiding on View , but I was looking in some articles that is not recommended when you are using UNION .
Probably I got see which indexes I will use on it, right ?
…………………………………………………………
I applied the query that Gordon posted, I got huge performance on it. I reduced 15 minutes to 5 minutes. Anyway I got hustle on it to reduce more time.
Advertisement
Answer
The overhead in the view is due to duplication elimination. So, the first suggestion is to use union all
, if there are no duplicates between the two tables. If you can, problem solved.
If not, you can use not exists
. I might speculate that something like this would work:
select . . .
from dbo.TB_FATURA_ITEM_TRANSACAO T1
union all
select . . .
from dbo.TB_FATURA_ITEM_TRANSACAO_HST Th
where not exists (select 1
from dbo.TB_FATURA_ITEM_TRANSACAO T1
where t1.id = t2.id
);
This where
clause in the subquery would contain all columns that need to be equal for a row to be considered a duplicate. I am speculating the id
is sufficient.