我有一个事实表 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
大小:11GB 行数:56,959,828
现在访问这个表变得非常困难,一个简单Select count(*) from CardTransactionFact
的需要几个小时才能执行。
表中的大多数列只是整数,这就是我没有做任何索引的原因。
你认为我应该做些什么来改进这个表,并提高查询这个表的速度
- 如果索引我应该索引哪些列以及为什么
- 对表进行分区是个好主意吗
- 任何其他建议
这里有很多问题,谢天谢地,有很多可以修复的。
问题:
修复:
11GB 不适合 6GB,真的就这么简单。一个非常粗略的估计表明该表将占用大约 150 万个 8KB 页面,如果 100 IOPS 从磁盘读取大约需要 4 个小时(假设最坏的情况,100% 随机读取,没有预读等)。
替换您的查询
下面有
你必须
Clustered Index
在你的表中。执行DBCC CONTIG检查堆表中的碎片桌子上出现的一个问题是碎片化的问题。根据执行的活动(例如删除、插入和更新),您的堆表和聚簇表可能会变得碎片化。这在很大程度上取决于活动以及用于聚集索引的键值。
索引重建前的统计
再次执行DBCC CONTIG以检查堆表中的碎片
索引重建后的统计
重建索引查询以删除索引
参考
索引和分区都可以提供很大帮助。但是哪些索引以及如何划分分区在很大程度上取决于您在它们上运行的查询。
如果没有索引或分区,查询优化器将不得不为每个查询读取完整的表。
对于分区部分,是否有一个逻辑列可以轻松用于将数据分隔到多个分区中?是否可以将此列添加到大多数查询的 where 子句中?