提高事实表的性能

Amm*_*arR 2 performance index sql-server-2008 facttable query-performance

我有一个事实表 CardTransactionFact

表结构

TABLE [dbo].[CardTransactionFact]
    [CardTransactionID] [int] IDENTITY(1,1) NOT NULL,
    [TransactionTerminalID] [int] NOT NULL,
    [SourceAccountTypeID] [int] NULL,
    [DestinationAccountTypeID] [int] NULL,
    [RimNo] [varchar](15) NULL,
    [CaptureCodeID] [int] NOT NULL,
    [RoutingCodeID] [int] NOT NULL,
    [ProcessingCodeID] [int] NOT NULL,
    [ActionCodeID] [int] NOT NULL,
    [NetworkCodeID] [int] NOT NULL,
    [ProductCodeID] [int] NOT NULL,
    [AcquiringCountryCodeID] [int] NOT NULL,
    [IssuingCountryCodeID] [int] NOT NULL,
    [TransactionCurrencyCodeID] [int] NOT NULL,
    [AmountBD] [decimal](18, 3) NOT NULL,
    [LocalCurrencyCodeID] [int] NOT NULL,
    [CardIssuerBank] [int] NOT NULL,
    [CardTypeID] [int] NOT NULL,
    [SuspectTransactionFlag] [char](1) NOT NULL,
    [ReversalTransactionFlag] [char](1) NOT NULL,
    [LocalTransactionDateKey] [int] NOT NULL,
    [LocalTransactionHourKey] [int] NOT NULL,
    [BBKRole] [char](1) NOT NULL,
    [AmountRangeKey] [int] NULL,
    [CustomerKey] [int] NULL
Run Code Online (Sandbox Code Playgroud)

大小:11GB 行数:56,959,828


现在访问这个表变得非常困难,一个简单的Select count(*) from CardTransactionFact需要几个小时才能执行。

表中的大多数列只是整数,这就是我没有做任何索引的原因。

你认为我应该怎么做来改进这张表,并提高对这张表的查询速度

  1. 如果索引我应该索引哪些列以及为什么
  2. 对表进行分区是个好主意吗
  3. 任何其他建议

Mar*_*ith 9

这里有很多错误,值得庆幸的是很多可以修复。

问题:

  • 你有一堆。很有可能这是严重碎片化的页面,并且页面分布在 82GB 的数据文件中。有关检查碎片的指导,请参阅sys.dm_db_index_physical_stats
  • 您只有 6GB 的内存,如果幸运的话,缓冲池可能有 4GB 可用。
  • 从字里行间看,您正在使用狗慢速 SATA 旋转驱动器。
  • 对该表的扫描将需要 11GB 的随机 IO 跨越该狗慢速驱动器并将缓冲池完全搅动 3 次。

修复:

  • 在表上创建聚集索引。CardTransactionId 看起来是目前唯一明智的选择。
  • 你非常需要记忆。对于 82GB 的数据仓库,128GB 是合理的。
  • 你的 IO 严重不足。SSD 将是最便宜的最快修复方法。

11GB 装不下 6GB,真的就是这么简单。一个非常粗略的估计表明该表将占用约 150 万个 8KB 页面,在 100 IOPS 的情况下,从磁盘读取大约需要 4 小时(假设最坏的情况,100% 随机读取,没有预读等)。

  • @EdwardDortland 通常是的,在这种情况下不是。这是一个 DW 事实表,即构建用于扫描。确实可能存在进一步划分轨道的情况,但需要首先解决基础问题。它运行在一个电力不足的可笑系统上,通常情况下,升级是完成工作的最简单、最快、最便宜、风险最低的解决方案。我从一台 32GB 的笔记本电脑做出回应,一个 6GB 的服务器用于 82GB 的数据仓库是荒谬的。 (3认同)