查看 - 索引 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 服务器的主要内容,如果未能解决你的问题,请参考以下文章