小编Dan*_*her的帖子

为什么更改声明的连接列顺序会引入排序?

我有两个具有相同名称、类型和索引键列的表。其中一个具有唯一的聚集索引,另一个具有非唯一的.

测试设置

设置脚本,包括一些真实的统计数据:

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

42
推荐指数
2
解决办法
1878
查看次数

查询以选择连接时的最大值


我有一个用户表:

|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)

join sql-server sql-server-2012 max

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

没有 PARTITION BY 的 ROW_NUMBER() 仍然生成 Segment 迭代器

我正在撰写我即将发表的关于排名和聚合窗口函数的博客文章,特别是 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)

sql-server execution-plan

11
推荐指数
2
解决办法
4万
查看次数

如何在 UPDATE STATISTICS ... WITH ROWCOUNT 后重置统计信息

出于查询优化和测试的目的,您可以通过运行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 行)。

10 000 行

运行UPDATE STATISTICS命令..

UPDATE STATISTICS dbo.StatTest WITH ROWCOUNT=10000000;
Run Code Online (Sandbox Code Playgroud)

...计划看起来像这样,现在估计有 1000 …

sql-server index-statistics sql-server-2014

11
推荐指数
1
解决办法
2142
查看次数

如何查找 SQL Server 安装介质属于哪个版本

如果不安装 SQL Server 媒体 2008 和 2012,我们如何知道媒体属于某个版本(如 Developer、Standard 或 Enterprise)?

sql-server-2008 sql-server sql-server-2012

7
推荐指数
1
解决办法
6819
查看次数

在可用性组数据库中部署和回滚更改

我正在寻找解决方案或工作流程。以下是我在使用独立服务器时进行数据库部署的方式:

  • 创建生产数据库的快照
  • 部署更改
  • 验证部署是否成功
  • 如果部署不成功,请从快照还原数据库。

我想对可用性组中的数据库执行类似的过程,但从备份或快照还原不是理想的选择,因为数据库相当大,我必须先将数据库从 AG 中取出。这是我正在寻找的理想解决方案类型:

  • 暂停 AG 中的数据移动
  • 将更改部署到主副本
  • 验证部署是否成功
  • 如果部署不成功,将主副本回滚到我们暂停数据移动并重新启动同步的 LSN。

有没有可行的方法来做到这一点?

我会使用BEGIN/ ROLLBACK TRANSACTION,但这在自动构建过程中更难实现,并且考虑到我想在提交或回滚之前首先检查结果(来自不同的数据库连接)。

snapshot availability-groups sql-server-2014

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

在我看来,如何实现谓词下推

我有一个报告表(大约 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)

optimization sql-server-2019 query-performance

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

我想在 SQL SERVER 2012 中找出谁在创建 SQL 登录以及在哪个日期

我试图在 sql server 2012 中找出谁创建了登录名和日期。任何机构都可以帮助解决这个问题,谢谢,

sql-server audit sql-server-2012 logins

4
推荐指数
1
解决办法
8950
查看次数