我有两个可以使用以下命令创建的表(以及一个非聚集索引):
CREATE TABLE GroupTable
(
GroupKey int NOT NULL PRIMARY KEY,
RecordCount int NOT NULL,
GroupScore float NOT NULL
);
CREATE TABLE RecordTable
(
RecordKey varchar(10) NOT NULL,
GroupKey int NOT NULL,
PRIMARY KEY(RecordKey, GroupKey)
);
CREATE UNIQUE INDEX ixGroupRecord ON RecordTable(GroupKey, RecordKey);
Run Code Online (Sandbox Code Playgroud)
虽然从技术上讲,我的表略有不同,而且我正在加入其他一些表,但这是适合我的情况的代理。
GroupKeys
不是另一个GroupKey
.GroupScore
所有子集(包括其自身)的最大值。GroupKey
包含与RecordKeys
another完全相同的实例中GroupKey(s)
,则只GroupKeys
抓取其中一个(哪个无关紧要)。GroupKey
完全相同的也将具有相同的.RecordKeys
GroupKey(s)
GroupScore
GroupKeys
也可以有相同的分数。下面是一个例子来说明我在问什么:
CREATE TABLE GroupTable
(
GroupKey int NOT NULL …
Run Code Online (Sandbox Code Playgroud) 我有一个可以使用以下代码创建和填充的表:
CREATE TABLE dbo.Example(GroupKey int NOT NULL, RecordKey varchar(12) NOT NULL);
ALTER TABLE dbo.Example
ADD CONSTRAINT iExample PRIMARY KEY CLUSTERED(GroupKey ASC, RecordKey ASC);
INSERT INTO dbo.Example(GroupKey, RecordKey)
VALUES (1, 'Archimedes'), (1, 'Newton'), (1, 'Euler'), (2, 'Euler'), (2, 'Gauss'),
(3, 'Gauss'), (3, 'Poincaré'), (4, 'Ramanujan'), (5, 'Neumann'),
(5, 'Grothendieck'), (6, 'Grothendieck'), (6, 'Tao');
Run Code Online (Sandbox Code Playgroud)
对于基于与另一行的有限协作距离的所有行RecordKey
,我想分配一个唯一值 - 我不关心唯一值是如何或什么数据类型。
可以使用以下查询生成符合我要求的正确结果集:
SELECT 1 AS SupergroupKey, GroupKey, RecordKey
FROM dbo.Example
WHERE GroupKey IN(1, 2, 3)
UNION ALL
SELECT 2 AS SupergroupKey, GroupKey, …
Run Code Online (Sandbox Code Playgroud) 背景:每天都会创建几个临时表,用于计算各种不同的聚合值。它们都包含相同的唯一标识符(我将在其上创建 PRIMARY KEY 的字段)。每个表大约有 10 万行,只有 2-8 列。然后在临时表上完成几个 JOIN 和 UNION ALL。使用所有临时表中的每个字段。此外,大多数时候每一行都被使用——最坏的情况是,一半的行在某处使用,另一半在其他地方使用。查询完成后,结果将保存在磁盘上,以便个人可以访问当天剩余时间的数据。
问题:以下哪种方法应该是最好的最快的:
• 临时表上没有索引。
• 在所有临时表上都有一个聚集索引(通过唯一标识符上的 PRIMARY KEY 声明)。
• 在唯一标识符上有一个非聚集索引,同时包括所有临时表上的其余列。
• 最后两个要点放在一起。
想法:同时运行所有四个选项时,每个选项的查询成本为 25%(相对于批处理);然而,当第一个要点运行时,执行计划(在 SELECT 查询上)指出我应该在唯一标识符上创建一个非聚集索引,同时包括每个临时表的剩余列。
我对此有些困惑。如果我有效地使用所有临时表中的每个字段和行,为什么会建议这样做?堆或聚集索引不是更好吗?
对我来说,堆可以最大限度地减少创建索引和排序数据的开销;因为我基本上需要每一行,所以进行表扫描没有坏处。
另一方面,聚集索引应该改进通过在其他两个临时表上的 JOIN 创建的临时表,并改进依赖于 JOIN 和 UNION ALL 的最终 SELECT 查询。
相关说明:在一个有 400 列和 70M 行的大表上——不要问我为什么我们有一个荒谬的列——当使用不相关的非聚集索引时,只获取 PRIMARY KEY 的查询快 50 倍聚集索引。
如果有人有任何见解,我将不胜感激。
sql-server nonclustered-index sql-server-2014 temporary-tables