dea*_*ock 1 performance index-tuning sql-server-2012 query-performance
我有下表交易。该表如下所示:
CREATE TABLE [dbo].[Transactions](
[TransactionID] [bigint] IDENTITY(1,10) NOT NULL,
[PlayerID] [bigint] NOT NULL,
[BalanceTransactionTypeID] [int] NOT NULL,
[BalanceTransactionSubTypeID] [int] NULL,
[PointDelta] [money] NULL,
[TransactionDate] [datetime] NOT NULL,
Run Code Online (Sandbox Code Playgroud)
该表包含以下约束和索引。
CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED
(
[TransactionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_Transactions_PlayerID] ON [dbo].
[Transactions]
(
[PlayerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_Transactions_TransactionDate] ON [dbo].
[Transactions]
(
[TransactionDate] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON
[PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我正在编写一个查询,其目标是返回前 50 名的积分收入者,并使用 SSIS 将结果写入一个单独的表中,该表将每天查看。该作业计划每天运行一次。主要问题是有超过 30 亿行,并且每天增长约 30 万行。我知道最终的解决方案是对其进行分区等,因为它从未在游戏中使用过,而且只是历史性的。我们也计划将其卷起。但是现在我需要在合理的时间内运行此查询。我曾尝试使用 CTE 来获取玩家 id 和 Delta 的总和,然后通过 id 将其结果连接到另一个表以获取玩家详细信息,我尝试使用包含所有这些连接的直接查询超过 25 分钟来运行查询。我可以做些什么来调整它并使查询在正常的时间内可以运行?如果没有什么让我知道,但我真的希望暂时有一些方法可以对此进行优化。一如既往地提前感谢所有帮助。
我们也计划将其卷起。
取消您的其他计划并立即执行此操作。停止尝试优化 30 亿行的评估,而是评估汇总 + 300k 行。从你对情况的概述来看,其他任何事情都是浪费时间和金钱。
疯狂的模仿定义是一遍又一遍地做同样的事情并期待不同的结果。读取 30 亿行不变的数据符合该定义。停止。