VIEW - INDEX SQL SERVER - PullRequest
       5

VIEW - INDEX SQL SERVER

0 голосов
/ 03 мая 2018

Кто-нибудь знает другой способ выполнить запрос ниже более эффективно? Я использую SQL Server 2014. Я сталкиваюсь с проблемой, если я создаю индекс для таблицы или представления.

В таблице 2 (TB_FATURA_ITEM_TRANSACAO_HST) хранится 50 миллионов строк.

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

Мне было интересно использовать Schemabiding в View, но я искал в некоторых статьях, что не рекомендуется при использовании UNION.

Возможно, я понял, какие индексы я буду использовать для этого, верно?

Спасибо заранее

............................................... ...................

Я применил запрос, который отправил Гордон, я получил огромную производительность. Я сократил 15 минут до 5 минут. Во всяком случае я получил толчок на это, чтобы сократить больше времени.

1 Ответ

0 голосов
/ 03 мая 2018

Издержки в представлении из-за устранения дублирования. Итак, первое предложение - использовать union all, если между двумя таблицами нет дубликатов. Если можете, проблема решена.

Если нет, вы можете использовать not exists. Я могу предположить, что что-то вроде этого будет работать:

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 
                 );

Это предложение where в подзапросе будет содержать все столбцы, которые должны быть равны, чтобы строка считалась дубликатом. Я предполагаю, что id достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...