代码之家  ›  专栏  ›  技术社区  ›  Luiz

视图-索引SQL SERVEr

  •  0
  • Luiz  · 技术社区  · 6 年前

    有人知道另一种更有效地运行下面的查询的方法吗?我正在使用SQL Server 2014。如果在表或视图上创建索引,我将面临一个问题。

    在表2(TB\u FATURA\u ITEM\u TRANSACAO\u HST)中,存储了5000万行。

    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,但我看到了一些在使用UNION时不推荐的文章。

    也许我看到了我将在上面使用哪些索引,对吗?

    。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    我应用了Gordon发布的查询,我在上面获得了巨大的性能。我把15分钟缩短到5分钟。不管怎样,我还是抓紧时间来减少更多的时间。

    1 回复  |  直到 4 年前
        1
  •  2
  •   Gordon Linoff    6 年前

    视图中的开销是由于消除了重复。因此,第一个建议是使用 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 足够了。