我有两个具有相同名称、类型和索引键列的表。其中一个具有唯一的聚集索引,另一个具有非唯一的.
测试设置
设置脚本,包括一些真实的统计数据:
DROP TABLE IF EXISTS #left;
DROP TABLE IF EXISTS #right;
CREATE TABLE #left (
a char(4) NOT NULL,
b char(2) NOT NULL,
c varchar(13) NOT NULL,
d bit NOT NULL,
e char(4) NOT NULL,
f char(25) NULL,
g char(25) NOT NULL,
h char(25) NULL
--- and a few other columns
);
CREATE UNIQUE CLUSTERED INDEX IX ON #left (a, b, c, d, e, f, g, h)
UPDATE STATISTICS #left WITH ROWCOUNT=63800000, PAGECOUNT=186000;
CREATE …Run Code Online (Sandbox Code Playgroud) join sql-server sql-server-2014 sort-operator sql-server-2017
我有一个用户表:
|Username|UserType|Points|
|John |A |250 |
|Mary |A |150 |
|Anna |B |600 |
Run Code Online (Sandbox Code Playgroud)
和级别
|UserType|MinPoints|Level |
|A |100 |Bronze |
|A |200 |Silver |
|A |300 |Gold |
|B |500 |Bronze |
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个查询来获取每个用户的级别。类似的东西:
SELECT *
FROM Users U
INNER JOIN (
SELECT TOP 1 Level, U.UserName
FROM Levels L
WHERE L.MinPoints < U.Points
ORDER BY MinPoints DESC
) UL ON U.Username = UL.Username
Run Code Online (Sandbox Code Playgroud)
这样的结果将是:
|Username|UserType|Points|Level |
|John |A |250 |Silver |
|Mary |A |150 |Bronze |
|Anna |B |600 …Run Code Online (Sandbox Code Playgroud) 我正在撰写我即将发表的关于排名和聚合窗口函数的博客文章,特别是 Segment 和 Sequence Project 迭代器。我理解的方式是 Segment 标识流中构成组结束/开始的行,因此以下查询:
SELECT ROW_NUMBER() OVER (PARTITION BY someGroup ORDER BY someOrder)
Run Code Online (Sandbox Code Playgroud)
将使用 Segment 来判断一行何时属于前一行以外的不同组。然后 Sequence Project 迭代器根据 Segment 迭代器的输出进行实际的行号计算。
但是使用该逻辑的以下查询不应包含 Segment,因为没有分区表达式。
SELECT ROW_NUMBER() OVER (ORDER BY someGroup, someOrder)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试这个假设时,这两个查询都使用了 Segment 运算符。唯一的区别是第二个查询不需要GroupBy在 Segment 上。这不是首先消除了对 Segment 的需求吗?
例子
CREATE TABLE dbo.someTable (
someGroup int NOT NULL,
someOrder int NOT NULL,
someValue numeric(8, 2) NOT NULL,
PRIMARY KEY CLUSTERED (someGroup, someOrder)
);
--- Query 1:
SELECT ROW_NUMBER() OVER (PARTITION BY someGroup ORDER BY someOrder)
FROM …Run Code Online (Sandbox Code Playgroud) 出于查询优化和测试的目的,您可以通过运行UPDATE STATISTICS. 但是你如何重新计算/重置统计数据到表格的实际内容?
--- Create a table..
CREATE TABLE dbo.StatTest (
i int NOT NULL,
CONSTRAINT PK_StatTest PRIMARY KEY CLUSTERED (i)
);
GO
--- .. and give it a thousand-or-so rows:
DECLARE @i int=1;
INSERT INTO dbo.StatTest (i) VALUES (@i);
WHILE (@i<1000) BEGIN;
INSERT INTO dbo.StatTest (i) SELECT @i+i FROM dbo.StatTest;
SET @i=@i*2;
END;
Run Code Online (Sandbox Code Playgroud)
一个虚拟查询:
SELECT i%100, COUNT(*) FROM dbo.StatTest GROUP BY i%100;
Run Code Online (Sandbox Code Playgroud)
... 将返回以下查询计划(索引扫描中的行估计为 1024 行)。
运行UPDATE STATISTICS命令..
UPDATE STATISTICS dbo.StatTest WITH ROWCOUNT=10000000;
Run Code Online (Sandbox Code Playgroud)
...计划看起来像这样,现在估计有 1000 …
如果不安装 SQL Server 媒体 2008 和 2012,我们如何知道媒体属于某个版本(如 Developer、Standard 或 Enterprise)?
我正在寻找解决方案或工作流程。以下是我在使用独立服务器时进行数据库部署的方式:
我想对可用性组中的数据库执行类似的过程,但从备份或快照还原不是理想的选择,因为数据库相当大,我必须先将数据库从 AG 中取出。这是我正在寻找的理想解决方案类型:
有没有可行的方法来做到这一点?
我会使用BEGIN/ ROLLBACK TRANSACTION,但这在自动构建过程中更难实现,并且考虑到我想在提交或回滚之前首先检查结果(来自不同的数据库连接)。
我有一个报告表(大约 10 亿行)和一个很小的维度表:
CREATE TABLE dbo.Sales_unpartitioned (
BusinessUnit int NOT NULL,
[Date] date NOT NULL,
SKU varchar(8) NOT NULL,
Quantity numeric(10, 2) NOT NULL,
Amount numeric(10, 2) NOT NULL,
CONSTRAINT PK_Sales_unpartitioned PRIMARY KEY CLUSTERED (BusinessUnit, [Date], SKU)
);
--- Demo data:
INSERT INTO dbo.Sales_unpartitioned
SELECT severity AS BusinessUnit,
DATEADD(day, message_id, '2000-01-01') AS [Date],
LEFT([text], 3) AS SKU,
1000.*RAND(CHECKSUM(NEWID())) AS Quantity,
10000.*RAND(CHECKSUM(NEWID())) AS Amount
FROM sys.messages
WHERE [language_id]=1033;
--- Artificially inflate statistics of demo data:
UPDATE STATISTICS dbo.Sales_unpartitioned WITH ROWCOUNT=1000000000;
--- …Run Code Online (Sandbox Code Playgroud) 我试图在 sql server 2012 中找出谁创建了登录名和日期。任何机构都可以帮助解决这个问题,谢谢,