【发布时间】:2018-07-05 14:10:34
【问题描述】:
我有一个具有以下定义的表:
CREATE TABLE [dbo].[Transactions]
(
[ID] [varchar](18) NOT NULL,
[TIME_STAMP] [datetime] NOT NULL,
[AMT] [decimal](18, 4) NOT NULL,
[CID] [varchar](90) NOT NULL,
[DEPARTMENT] [varchar](4) NULL,
[SOURCE] [varchar](14) NULL,
PRIMARY KEY NONCLUSTERED
(
[ID] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
该表中有 7500 万行。不知何故,它占用了 20 GB 的磁盘空间!
以下2个查询...
SELECT
SUM(AMT)
FROM
Transactions
WHERE
TIME_STAMP >= '2017-11-11 00:00:00' AND
TIME_STAMP < '2017-11-12 00:00:00'
SELECT
COUNT(DISTINCT(CID))
FROM
Transactions
WHERE
TIME_STAMP >= '2017-11-11 00:00:00' AND
TIME_STAMP < '2017-11-12 00:00:00'
...每个运行大约需要 2 分钟!
顺便说一句,该表有一个我无法删除的“Clustered ColumnStore Index”,上次我尝试删除它时,由于磁盘空间不足,DROP 失败。存储数据的驱动器有 28 GB 可用空间,压缩 DB 后没有 50 GB。
请告知我需要做什么,我需要创建哪些索引,使用哪些设置来优化这些查询的性能以及为什么这样我和其他人可以理解和学习。
另外,如果我还需要在某些 WHERE 子句中指定 DEPARTMENT 和 SOURCE 怎么办?这些列只有几个不同的值。
谢谢!
【问题讨论】:
-
@Larnu - 已发布问题。
-
查看 SSMS 中这两个查询的实际执行计划,它们通常还包括索引提示。
-
查看您的查询,我会查看时间戳上的分区。
标签: sql sql-server database indexing