【发布时间】: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 我明白你在说什么。我会做一些测试,我会尽快发布。
标签: sql sql-server performance indexing view