小编Pau*_*mes的帖子

查询挑战:基于度量而不是行数创建大小均匀的存储桶

我将用尽可能均匀地装载固定数量的卡车订单来描述问题。

输入:

@TruckCount - the number of empty trucks to fill
Run Code Online (Sandbox Code Playgroud)

一套:

OrderId, 
OrderDetailId, 
OrderDetailSize, 
TruckId (initially null)
Run Code Online (Sandbox Code Playgroud)

Orders由一个或多个组成OrderDetails

这里的挑战是TruckId为每条记录分配一个。

单个订单不能跨卡车拆分。

卡车应尽可能均匀*装载,以sum(OrderDetailSize).

* 均匀:装载最少的卡车和装载最多的卡车之间可实现的最小增量。根据这个定义,1,2,3 比 1,1,4 分布更均匀。如果有帮助,请假装您是统计算法,创建均匀的高度直方图。

没有考虑最大卡车负载。这些是神奇的弹性卡车。然而,卡车的数量是固定的。

有一个明显的迭代解决方案 - 循环分配订单。

但是它可以作为基于集合的逻辑来完成吗?

我的主要兴趣是 SQL Server 2014 或更高版本。但其他平台的基于集合的解决方案也可能很有趣。

这感觉就像 Itzik Ben-Gan 领土 :)

我的实际应用程序将处理工作负载分配到多个存储桶中,以匹配逻辑 CPU 的数量。因此每个桶没有最大大小。统计更新,特别是。我只是认为将问题抽象为卡车作为构建挑战的一种方式会更有趣。

CREATE TABLE #OrderDetail (
OrderId int NOT NULL,
OrderDetailId int NOT NULL PRIMARY KEY,
OrderDetailSize tinyint NOT NULL,
TruckId tinyint NULL)

-- Sample Data

INSERT #OrderDetail (OrderId, OrderDetailId, …
Run Code Online (Sandbox Code Playgroud)

sql-server query sql-server-2014

12
推荐指数
1
解决办法
1768
查看次数

先前的外连接禁止内连接消除

概要:如果逻辑树中较早存在未消除的外连接,则可以逻辑消除的内连接将被保留。为什么?

示例在 AdventureWorks2008R2 及更高版本中运行。我添加了跟踪标志来提供连续树和规则的整体上下文。


第一个例子,对于上下文:

  • Product在简化过程中消除了左连接(连接表中不需要数据并且引用的值是唯一的)。
  • SalesOrderDetail然后在连接崩溃期间消除内部连接,即启发式连接重新排序(连接表中不需要数据,引用者不可为空,并且强制执行 FK)
SELECT sod.SalesOrderDetailID
FROM Sales.SalesOrderDetail AS sod
    LEFT JOIN Production.Product AS p -- Eliminated during simplification (Rule: RedundantLOJN)
        ON p.ProductID = sod.ProductID
    JOIN Sales.SalesOrderHeader AS soh -- Eliminated during join collapse. (Annotated by TF 8619)
        ON soh.SalesOrderID = sod.SalesOrderID
OPTION (RECOMPILE, QUERYTRACEON 8619, QUERYTRACEON 8621, QUERYTRACEON 8606, QUERYTRACEON 3604);
Run Code Online (Sandbox Code Playgroud)

然而,在第二个示例中,可以从逻辑上消除与 SalesOrderHeader 的连接,但事实并非如此。

  • 保留左连接,因为需要来自 的数据Product。在逻辑树中,此连接被定义为在不消除的连接之前。
  • 后续的加入SalesOrderHeader可以在逻辑上被消除,因为先前的加入不能使消除要求无效:非空引用 + FK 完整性。
SELECT p.Name
FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization

12
推荐指数
2
解决办法
428
查看次数

EXCEPT & INTERSECT:逻辑计划中被动投射的目的

下面的 EXCEPT 查询生成一个带有看似无目的投影的逻辑计划。INTERSECT 也会发生这种情况。

投影的目的是什么?例如,是否有不同的 EXCEPT 查询,其中外投影会指定某些内容?

询问:

use AdventureWorks2017

select p.ProductId
from Production.Product as p
except
select pinv.ProductID
from Production.ProductInventory as pinv
option (recompile, querytraceon 8605, querytraceon 3604)
Run Code Online (Sandbox Code Playgroud)

转换树:

    LogOp_Select

        LogOp_GbAgg OUT(QCOL: [p].ProductID,) BY(QCOL: [p].ProductID,)

            LogOp_Project -- << ?? PASSIVE PROJECTION ??

                LogOp_Project

                    LogOp_Get TBL: Production.Product(alias TBL: p) Production.Product TableID=482100758 TableReferenceID=0 IsRow: COL: IsBaseRow1000 

                    AncOp_PrjList 

                AncOp_PrjList 

            AncOp_PrjList 

        ScaOp_Exists 

            LogOp_Select

                LogOp_Project

                    LogOp_Get TBL: Production.ProductInventory(alias TBL: pinv) Production.ProductInventory TableID=914102297 TableReferenceID=0 IsRow: COL: IsBaseRow1001 

                    AncOp_PrjList 

                ScaOp_Comp x_cmpEq

                    ScaOp_Identifier QCOL: [p].ProductID

                    ScaOp_Identifier QCOL: …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization database-internals except

9
推荐指数
2
解决办法
533
查看次数

确定是否正在进行自动统计更新

在我们的生产系统中,查询有时会“停滞”。在停止时,sp_whoisactive 中没有显示增加的资源使用(CPU、读取),并且没有阻塞。

在回顾性诊断中,我们可以看到 sys.dm_db_stats_properties 显示 last_updated 大约在查询“停滞”时。

我们想要做的是——当我们看到一个停滞的查询时——然后确定正在进行哪些自动统计更新。

因为我们想要临时执行此操作,也因为我们不想影响生产性能,所以使用分析器可能不是我们的选择。

(如果没有办法进行临时决定,那么也许我们将不得不考虑扩展事件或其他一些影响较小的先发制人跟踪)。

我们的版本是 2014,但对更高版本的回答也很有用。

sql-server

8
推荐指数
1
解决办法
367
查看次数

SSMS 约束脚本:第二个alter table 语句的目的?

SSMS 脚本外键约束为两个语句:

ALTER TABLE {table}
WITH CHECK
ADD CONSTRAINT {constraintname} {constraint spec}
GO

ALTER TABLE {table}
CHECK CONSTRAINT {constraintname}
GO
Run Code Online (Sandbox Code Playgroud)

第二个陈述的目的是什么?

foreign-key sql-server constraint ssms scripting

5
推荐指数
1
解决办法
731
查看次数

逻辑树:Before Project Normalization 和 Join Collapsed 的区别

Before Project Normalization 树跟在 Join Collapsed 树之后。

使用大约 250 个查询的样本集 - 和 Traceflags 8605、8606、8607、3604 - 在任何示例查询中,我都没有检测到这两种树之间的任何差异。

是否可以构建一个查询,其中这两棵树之间存在差异?

(这是一篇博客文章的研究 - 我会感谢任何可以提供帮助的人。)

sql-server optimization

5
推荐指数
1
解决办法
112
查看次数

Linux SQL Server 是否支持 xp_create_subdir

一些系统扩展程序在 2017 RC2 上工作

例如

exec xp_dirtree @directory = '/var', @depth = 1
Run Code Online (Sandbox Code Playgroud)

正确返回 /var 中包含的目录

然而:

exec xp_create_subdir '/foo'
Run Code Online (Sandbox Code Playgroud)

退货

Msg 22048, Level 15, State 0, Line 18
Error executing extended stored procedure: Invalid Parameter
Run Code Online (Sandbox Code Playgroud)

是否支持该过程,如果支持,参数的语法是什么?

在 Ubuntu 上测试运行,在 MacOS 上的 Docker 容器内。

select @@VERSION
Microsoft SQL Server 2017 (RC2) - 14.0.900.75 (X64)   Jul 27 2017 08:53:49   Copyright (C) 2017 Microsoft Corporation  Developer Edition (64-bit) on Linux (Ubuntu 16.04.2 LTS)
Run Code Online (Sandbox Code Playgroud)

sql-server linux

2
推荐指数
1
解决办法
561
查看次数

SQL 获取分区边界和文件组

对于给定的分区方案名称,我需要检索一组

  • 边界值
  • 文件组名称

必须在不存在参与该方案的任何表的情况下起作用。

通过 sys.indexes 加入将不起作用。

认为答案在于 sys.destination_data_spaces,但尚未弄清楚与 sys.partition_range_values 的连接。

sql-server query metadata partitioning sql-server-2012

2
推荐指数
1
解决办法
2615
查看次数