查看 - 索引 SQL 服务器

Posted

技术标签:

【中文标题】查看 - 索引 SQL 服务器【英文标题】:VIEW - INDEX SQL SERVEr 【发布时间】:2018-05-03 18:16:58 【问题描述】:

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

在表 2 (TB_FATURA_ITEM_TRANSACAO_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

我想知道在 View 上使用 Schemabiding,但我正在查看一些在您使用 UNION 时不推荐使用的文章。

可能我知道我将在上面使用哪些索引,对吧?

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

我应用了 Gordon 发布的查询,我获得了巨大的性能。我把 15 分钟缩短到 5 分钟。无论如何,我都在忙着减少更多时间。

【问题讨论】:

输入视图的表是否正确分区和索引?优化这一点的最佳方法是优化提供视图的表。与单独的表相比,当前针对视图运行选择语句的速度有多快?除此之外,您需要多久查看一次历史交易? @Skeik,是的,所有这些表都是分区的。但是第二个没有索引。所以我需要一直看它。 向 TB_FATURA_ITEM_TRANSACAO_HST 添加索引可能会有所帮助。这不是最简单的答案,但我认为你最好的选择是尽可能避免使用视图。我之前不得不使用类似的视图,交易量超过 5 亿次。在业务逻辑中,我们确定查询是否需要历史数据,然后才使用视图。如果有必要定期缓存数据。我想不出人们需要定期搜索 100m~ 原始交易的太多理由。 @Skeik 我明白你在说什么。我会做一些测试,我会尽快发布。 【参考方案1】:

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

【讨论】:

实际上我必须在这个解决方案上使用视图。此外,我将在我正在处理的过程中使用上面的查询。 @Luiz 。 . .和?您可以在视图中使用union all

以上是关于查看 - 索引 SQL 服务器的主要内容,如果未能解决你的问题,请参考以下文章

在ORACLE如何查看自己建立的所有表,而不是系统表

如何查看表和索引的统计信息

mysql-一条sql的执行过程

Mysql学会查看sql的执行计划

sql server 中如何查看自定义函数的源代码?

SQL Server查看索引重建重组索引进度