小编Mar*_*ith的帖子

确定架构更改是如何发生的?

昨天发生了不好的事情。

前一段时间创建的视图被某人修改,最终破坏了报告。很遗憾。有人(有意或无意)在 PRODUCTION 数据库中进行了此修改。

我的问题:有没有办法(脚本/软件/免费软件等)让我们知道谁(用户名)做了这个修改,这样我就可以撤销该用户对生产数据库的访问权限。

如果我的问题不清楚,请发表评论。

sql-server view

21
推荐指数
3
解决办法
2万
查看次数

为什么我的 STRING_AGG 中的 ORDER BY 并不总是有效?

我有一个表,其中包含记录 ID、组 ID(将 1 个或多个记录链接到一个组中)以及每个记录的哈希值。

CREATE TABLE HashTable(
    RecordID VARCHAR(255),
    GroupIdentifier VARCHAR(255),
    Hash VARCHAR (255),
    GroupHashList VARCHAR(4000)
)
Run Code Online (Sandbox Code Playgroud)

(我知道这不是一个有效的表,但它只是用于本示例的临时表)。

我想为每个组生成一个哈希值,所以我认为最简单的方法是连接组中每个记录的哈希值。RecordID 是唯一的,但这些记录所涉及的内容不一定是唯一的,因此散列可能是重复的。这样做的目的是标记完全重复的组,即该组中的所有记录都是另一组中的所有记录的重复项的组。如果 GUI 要将组中的所有成员识别为重复组,则需要该组的所有成员具有相同的哈希值。

我使用 STRING_AGG 连接组中记录的各个散列,并按散列对它们进行排序,以确保我为重复的组获得相同的字符串。我实际上并不关心哈希的顺序是什么,只要每次都相同即可。当我将其作为 SELECT 查询运行时,它工作正常,并且我可以看到重复组的相同字符串。当我采用相同的 SELECT 查询并将其放入 UPDATE 查询中时,顺序似乎丢失了。

SELECT STRING_AGG([Hash],';') WITHIN GROUP (ORDER BY [Hash] ASC) 
FROM HashTable
GROUP BY [GroupIdentifier]
Run Code Online (Sandbox Code Playgroud)

这给出了结果(对于一对重复组的示例):

CREATE TABLE HashTable(
    RecordID VARCHAR(255),
    GroupIdentifier VARCHAR(255),
    Hash VARCHAR (255),
    GroupHashList VARCHAR(4000)
)
Run Code Online (Sandbox Code Playgroud)

当我将相同的代码放入 UPDATE 查询中时,它无法正确对它们进行排序:

UPDATE HashTable
SET GroupHashList = c.HashList
FROM HashTable
INNER JOIN (
    SELECT (STRING_AGG([Hash],';') WITHIN GROUP (ORDER BY [Hash] …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql string-aggregation

21
推荐指数
1
解决办法
8347
查看次数

你能解释一下这个执行计划吗?

当我遇到这个东西时,我正在研究其他东西。我正在生成包含一些数据的测试表并运行不同的查询,以了解编写查询的不同方式如何影响执行计划。这是我用来生成随机测试数据的脚本:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('t') AND type in (N'U'))
DROP TABLE t
GO

CREATE TABLE t 
(
 c1 int IDENTITY(1,1) NOT NULL 
,c2 int NULL
) 
GO

insert into t
select top 1000000 a from
(select t1.number*2048 + t2.number a, newid() b
from [master]..spt_values t1 
cross join  [master]..spt_values t2
where t1.[type] = 'P' and t2.[type] = 'P') a
order by b
GO

update t set c2 = null
where c2 < 2048 * 2048 …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan sql-server-2008-r2

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

为什么 DELETE 会对性能产生挥之不去的影响?

最后是一个测试脚本,用于比较@table 变量和#temp 表之间的性能。我想我已经正确设置了 - 性能计时是在 DELETE/TRUNCATE 命令之外进行的。我得到的结果如下(以毫秒为单位)。

@Table Variable  #Temp (delete)  #Temp (truncate)
---------------  --------------  ----------------
5723             5180            5506
15636            14746           7800
14506            14300           5583
14030            15460           5386
16706            16186           5360
Run Code Online (Sandbox Code Playgroud)

只是为了确保我是理智的,这表明 CURRENT_TIMESTAMP (aka GetDate()) 是在语句时使用的,而不是批处理时,因此 TRUNCATE/DELETE 与SET @StartTime = CURRENT_TIMESTAMP语句之间不应有交互。

select current_timestamp
waitfor delay '00:00:04'
select current_timestamp

-----------------------
2012-10-21 11:29:20.290

-----------------------
2012-10-21 11:29:24.290
Run Code Online (Sandbox Code Playgroud)

当使用 DELETE 清除表时,第一次运行和后续运行之间的跳转非常一致。我对DELETE 的理解缺少什么?我已经重复了很多次,交换了顺序,调整了 tempdb 的大小以使其不需要增长等。

CREATE TABLE #values (
  id int identity primary key, -- will be clustered …
Run Code Online (Sandbox Code Playgroud)

performance sql-server delete truncate sql-server-2012

20
推荐指数
1
解决办法
4094
查看次数

此查询的正确结果是什么?

在这里的评论中遇到了这个难题

CREATE TABLE r (b INT);

SELECT 1 FROM r HAVING 1=1;
Run Code Online (Sandbox Code Playgroud)

SQL ServerPostgreSQL返回 1 行。

MySQLOracle返回零行。

哪个是正确的?或者两者都同样有效?

aggregate sql-standard

20
推荐指数
2
解决办法
825
查看次数

使用 SQL Server 中另一个表中的值更新表

我的数据库中有 2 个表。

表格1

-------------------------------------------------------------------------
| name | family | phone | email | gender | phone2 | address | birthdate |
-------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

表#2

-----------------------------------------
| gender | address | phone | birthdate |
-----------------------------------------
Run Code Online (Sandbox Code Playgroud)

在表#1的列地址PHONE2是空的和列性别生日的值是相同的表#2。

当每行的性别出生日期相同时,如何从表 #2 中读取数据并使用表 #2 addressphone列中的值更新表 #1 中的addressphone2

例如:这是表 #1 中的一些数据

-------------------------------------------------------------------------
| name | family | phone | email | gender | phone2 | address …
Run Code Online (Sandbox Code Playgroud)

join sql-server t-sql update sql-server-2014

20
推荐指数
1
解决办法
22万
查看次数

优化 SQL Server 中的数字范围(间隔)搜索

这个问题类似于优化 IP 范围搜索?但那个仅限于 SQL Server 2000。

假设我有 1000 万个范围临时存储在一个表中,结构和填充如下。

CREATE TABLE MyTable
(
Id        INT IDENTITY PRIMARY KEY,
RangeFrom INT NOT NULL,
RangeTo   INT NOT NULL,
CHECK (RangeTo > RangeFrom),
INDEX IX1 (RangeFrom,RangeTo),
INDEX IX2 (RangeTo,RangeFrom)
);

WITH RandomNumbers
     AS (SELECT TOP 10000000 ABS(CRYPT_GEN_RANDOM(4)%100000000) AS Num
         FROM   sys.all_objects o1,
                sys.all_objects o2,
                sys.all_objects o3,
                sys.all_objects o4)
INSERT INTO MyTable
            (RangeFrom,
             RangeTo)
SELECT Num,
       Num + 1 + CRYPT_GEN_RANDOM(1)
FROM   RandomNumbers 
Run Code Online (Sandbox Code Playgroud)

我需要知道包含值的所有范围50,000,000。我尝试以下查询

SELECT *
FROM MyTable
WHERE 50000000 …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization

19
推荐指数
5
解决办法
3783
查看次数

为什么在连接谓词中引用变量会强制嵌套循环?

最近遇到了这个问题,在网上找不到任何讨论。

下面的查询

DECLARE @S VARCHAR(1) = '';

WITH T
     AS (SELECT name + @S AS name2,
                *
         FROM   master..spt_values)
SELECT *
FROM   T T1
       INNER JOIN T T2
         ON T1.name2 = T2.name2;
Run Code Online (Sandbox Code Playgroud)

总是得到一个嵌套循环计划

在此处输入图片说明

尝试使用INNER HASH JOININNER MERGE JOIN提示强制问题会产生以下错误。

由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询。

我找到了一种允许使用散列或合并连接的解决方法 - 将变量包装在聚合中。生成的计划成本显着降低(19.2025 与 0.261987)

DECLARE @S2 VARCHAR(1) = '';

WITH T
     AS (SELECT name + (SELECT MAX(@S2)) AS name2,
                *
         FROM   spt_values)
SELECT *
FROM   T T1
       INNER JOIN T T2 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server optimization query-performance

16
推荐指数
1
解决办法
787
查看次数

排序溢出到 tempdb 但估计行等于实际行

在最大内存设置为 25GB 的 SQL Server 2016 SP2 上,我们有一分钟执行大约 80 次的查询。该查询将大约 4000 页溢出到 tempdb。这会导致 tempdb 的磁盘上出现大量 IO。

当您查看查询计划(简化查询)时,您会看到估计行数等于实际行数,但仍然会发生溢出。所以过时的统计数据不能成为问题的原因。

我做了一些测试和以下查询溢出到 Tempdb:

select id --uniqueidentifier
from SortProblem
where [status] ='A'
order by SequenceNumber asc
option (maxdop 1)
Run Code Online (Sandbox Code Playgroud)

但是,如果我选择不同的列,则不会发生溢出:

select startdate --datetime
from SortProblem
where [status] ='A'
order by SequenceNumber asc 
option (maxdop 1)
Run Code Online (Sandbox Code Playgroud)

所以我试图“放大” id 列的大小:

select CONVERT(nvarchar(512),id)
from SortProblem
where [status] ='A'
order by SequenceNumber asc 
option (maxdop 1)
Run Code Online (Sandbox Code Playgroud)

然后也不会发生溢出。

为什么 uniqueidentifier 不会溢出到 tempdb 和 datatime 列?当我删除大约 20000 条记录时,当我选择 id …

sql-server tempdb sorting sql-server-2016 cardinality-estimates

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

优化 BLOB 数据的 BCP 性能

我正在计划将 2TB 数据库实时迁移到分区表的过程。从广义上讲,该系统是一个文档存储,大部分空间分配给 50kb 到 500kb 之间的 LOB,一小部分在 500kb 到 1MB 范围内。部分迁移将涉及从旧数据库到新数据库的 BCPing 数据。

BCP 是首选方法,因为数据中的当前/历史鸿沟允许在最终切换之前分阶段(在较安静的时期)提取较旧的数据,从而最大限度地减少对实时系统的影响。数据量和存储可用性排除了对分区方案的原位重建

由于 BLOB 内容,我怀疑通过尝试使用 KILOBYTES_PER_BATCH 而不是 ROWS_PER_BATCH 可能会获得一些性能提升。BCP文档中建议SQL可以根据这个值优化操作。

我找不到关于这些优化的性质或从哪里开始测试的任何指导。在没有建议的情况下,我将尝试在 4/8/16/32/64mb 边界处进行短期运行。

可能会从更改数据包大小(BCP -a 参数,而不是服务器级别设置)中获得一些收益,但我倾向于将其提高到最大 65535,除非有人有更公式化的方法。

performance sql-server bcp

14
推荐指数
1
解决办法
5407
查看次数