小编bas*_*n22的帖子

只选择超集

我有两个可以使用以下命令创建的表(以及一个非聚集索引):

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所有子集(包括其自身)的最大值。
  • 在 aGroupKey包含与RecordKeysanother完全相同的实例中GroupKey(s),则只GroupKeys抓取其中一个(哪个无关紧要)。
  • 任何与另一个GroupKey完全相同的也将具有相同的.RecordKeysGroupKey(s)GroupScore
  • 不相关的GroupKeys也可以有相同的分数。

下面是一个例子来说明我在问什么:

CREATE TABLE GroupTable
(
  GroupKey int NOT NULL …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2014

10
推荐指数
1
解决办法
319
查看次数

为具有有限协作距离的行分配唯一值的解决方案

我有一个可以使用以下代码创建和填充的表:

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)

sql-server sql-server-2016

9
推荐指数
3
解决办法
412
查看次数

具有包括所有列的非聚集索引的临时表

背景:每天都会创建几个临时表,用于计算各种不同的聚合值。它们都包含相同的唯一标识符(我将在其上创建 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

6
推荐指数
1
解决办法
1406
查看次数