我将用尽可能均匀地装载固定数量的卡车订单来描述问题。
输入:
@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) 概要:如果逻辑树中较早存在未消除的外连接,则可以逻辑消除的内连接将被保留。为什么?
示例在 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) 下面的 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) 在我们的生产系统中,查询有时会“停滞”。在停止时,sp_whoisactive 中没有显示增加的资源使用(CPU、读取),并且没有阻塞。
在回顾性诊断中,我们可以看到 sys.dm_db_stats_properties 显示 last_updated 大约在查询“停滞”时。
我们想要做的是——当我们看到一个停滞的查询时——然后确定正在进行哪些自动统计更新。
因为我们想要临时执行此操作,也因为我们不想影响生产性能,所以使用分析器可能不是我们的选择。
(如果没有办法进行临时决定,那么也许我们将不得不考虑扩展事件或其他一些影响较小的先发制人跟踪)。
我们的版本是 2014,但对更高版本的回答也很有用。
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)
第二个陈述的目的是什么?
Before Project Normalization 树跟在 Join Collapsed 树之后。
使用大约 250 个查询的样本集 - 和 Traceflags 8605、8606、8607、3604 - 在任何示例查询中,我都没有检测到这两种树之间的任何差异。
是否可以构建一个查询,其中这两棵树之间存在差异?
(这是一篇博客文章的研究 - 我会感谢任何可以提供帮助的人。)
一些系统扩展程序在 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) 对于给定的分区方案名称,我需要检索一组
这必须在不存在参与该方案的任何表的情况下起作用。
即通过 sys.indexes 加入将不起作用。
我认为答案在于 sys.destination_data_spaces,但尚未弄清楚与 sys.partition_range_values 的连接。
sql-server ×8
optimization ×3
query ×2
constraint ×1
except ×1
foreign-key ×1
linux ×1
metadata ×1
partitioning ×1
scripting ×1
ssms ×1