Skip to content
Advertisement

VIEW – INDEX SQL SERVEr

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.

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement