小编McN*_*ets的帖子

删除 SQL Server 14.0 上的数百万条记录

我有两个表,每个表包含 2 亿条记录。我必须根据列中的整数值从它们中删除大约 7000 万条记录。

我使用以下脚本以 4000 块为单位删除它们:

DECLARE @BATCHSIZE INT, @ITERATION INT, @TOTALROWS INT, @MSG VARCHAR(500)
DECLARE @STARTTIME DATETIME, @ENDTIME DATETIME

SET NOCOUNT ON;
SET DEADLOCK_PRIORITY LOW;
SET @BATCHSIZE = 4000
SET @ITERATION = 0 
SET @TOTALROWS = 0 

WHILE @BATCHSIZE>0
BEGIN   
    SET @STARTTIME = GETDATE();

    BEGIN TRANSACTION
    DELETE TOP(@BATCHSIZE)
    FROM [mydb].[dbo].tableA 
    WHERE [mydb].[dbo].tableA.Code not IN (
            SELECT Code
            FROM [mydb].[dbo].TableB)

    SET @BATCHSIZE=@@ROWCOUNT
    SET @ITERATION=@ITERATION+1
    SET @TOTALROWS=@TOTALROWS+@BATCHSIZE
    COMMIT TRANSACTION;

    SET @ENDTIME = GETDATE();

    SET @MSG = 'Iteration: ' + …
Run Code Online (Sandbox Code Playgroud)

sql-server delete sql-server-2017

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

SQL Server 计划指南

我有一个需要计划指南的查询,但我很难设置它。

从过程缓存中查询以下...

(@state nvarchar(14),
 @jobName nvarchar(18),
 @jobGroup nvarchar(28),
 @oldState nvarchar(6)) 

 UPDATE JOB_TRIGGERS 
 SET TRIGGER_STATE = @state 
 WHERE JOB_NAME = @jobName 
 AND JOB_GROUP = @jobGroup 
 AND TRIGGER_STATE = @oldState
Run Code Online (Sandbox Code Playgroud)

SQL Server 选择执行聚集索引扫描与非聚集索引查找。我在这个更新语句和表上的某个 select 语句中遇到了零星的死锁问题。我理解为什么 SQL 选择对表进行聚集索引扫描....Rows < 100 和 PageCount < 25。

该表有大量活动,由于它是第 3 方产品,我无法修改查询并提供索引提示。使用非聚集索引的查询成本更高,但我相信它会基于测试提高并发性....

我需要告诉它使用下面的非聚集索引

WITH (INDEX (ix_jobname_jobgroup_triggerstate))
Run Code Online (Sandbox Code Playgroud)

帮助设置这个将不胜感激..

sql-server optimization execution-plan plan-guides

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

Microsoft 是否发布其 SQL 查询哈希算法..?

我们在我们的环境中使用 SQL Spotlight。它很方便。我们特别使用 sys.dm_exec_requests 和 sys.dm_exec_query_stats 的输出。

Spotlight 使用很好的散列从计划缓存中为您提取查询计划。

问题是,除非您对代码库有经验,否则很难知道该查询来自何处。

我有一个想法,如果我可以:

  • 解析代码库
  • 拉取 SQL 查询
  • 以与微软相同的方式散列它们

通过这种方式,我可以快速匹配哈希值,以便能够查看特定查询来自代码库的何处。

或者我必须做一些非常慢的正则表达式......

sql-server hashing

6
推荐指数
2
解决办法
897
查看次数

是否有可能用完日志序列号?

我一直想知道为事务日志记录生成日志序列号的算法,我担心如果工作负载足够大,可能会用完日志序列号。

在这种情况下会发生什么?

sql-server transaction-log

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

pg_restore 错误:“关系不存在”并创建新数据库

我已经备份了我想要恢复到新数据库中的特定表,使用:

call pg_dump -Fc -h server -d database -U user -p password -v -f dump.sql -t public.table1 -t public.table2
Run Code Online (Sandbox Code Playgroud)

我没有问题。

然后我想通过使用 pg_restore 创建一个新数据库来恢复转储:

call pg_restore --clean --create -d temp -h server -p password -U user dump.sql
Run Code Online (Sandbox Code Playgroud)

这给了我一个“数据库临时不存在”的错误。据我所知,这应该已经创建了数据库并恢复了它。

但是,我然后手动创建“临时”数据库并运行:

call pg_restore --clean --create -d temp -h server -p password -U user dump.sql
Run Code Online (Sandbox Code Playgroud)

这将贯穿始终,但不会创建表并给我一个错误“ relation table1”和“ relation table2”不存在,并且只为两个表创建相应的 id_sewuences。

我真正想要的是不必手动创建新数据库,并且备份中的所有表都通过 pg_restore 使用以下命令恢复到全新的数据库中:

call pg_restore --clean --create -d temp -h server -p password -U user dump.sql
Run Code Online (Sandbox Code Playgroud)

据我了解。

请帮助,非常令人沮丧

postgresql psql pg-dump exists pg-restore

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

如何配置 Ola Hallengren IndexOptimize 脚本以针对表的子集运行

我正在将 Ola Hallengren IndexOptimize 脚本用于大小为 7 TB、表超过 300,000 的 SQL 2016 数据库。我每晚只有 6 小时的时间来管理索引。我正在使用 timelimit 参数在 6 小时后停止作业。

问题是,每天晚上索引作业都按字母顺序从索引的开头开始,并且只能通过大约相同的 4,000 个表。

我该怎么做才能让索引作业覆盖数据库中的所有索引?也许通过创建多个作业,一周中的每个晚上做一个索引子集?或者有没有办法让工作在之前停止的第二天重新开始?

所有的表都在同一个数据库模式中。这是供应商提供的数据库,我无法更改数据库架构。

在此先感谢您的任何指导。

我目前的工作步骤如下:

EXECUTE [dbo].[IndexOptimize]
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL, 
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', 
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', 
@FragmentationLevel1 = 10, 
@FragmentationLevel2 = 40,
@UpdateStatistics = 'ALL', 
@OnlyModifiedStatistics = 'Y', 
@PartitionLevel = 'N', 
@MaxDOP = 0,
@SortInTempdb = 'Y',
@TimeLimit = 21600,
@LogToTable = 'Y'
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016 ola-hallengren

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

由于“UTF-8”属性,将 VARCHAR(MAX) 转换为 XML 时出错

我需要深入研究具有类似于此架构的日志表:

CREATE TABLE t (
  id int PRIMARY KEY,
  data varchar(max)
);
Run Code Online (Sandbox Code Playgroud)

data以这种格式存储从 Web 服务接收的 XML 文本:

这是缩小版

<?xml version="1.0" encoding="UTF-8"?>
<PARAM>
  <TAB DIM="30" ID="ZC3D2_1" SIZE="5">
    <LIN NUM = "1">
      <FLD NAME = "ZDOC" TYPE = "Char">Ferran López</FLD>
    </LIN>
  </TAB>
</PARAM>
Run Code Online (Sandbox Code Playgroud)

当我尝试将此文本转换为 XML 时,出现下一个错误:

XML 解析:第 xx 行,字符 48,非法 xml 字符

可以通过删除<xml>标记或至少删除encoding属性来解决。

注意:如果没有像 那样的特殊字符ó,即使我不删除<xml>标签,它也能正常工作。

有没有办法在不替换或删除<xml>标签的情况下将其转换为 XML ?

CAST(REPLACE(data, 'encoding="UTF-8"', '') as XML)
Run Code Online (Sandbox Code Playgroud)

db<>在这里摆弄

更新

服务器整理是: …

xml sql-server cast sql-server-2014

6
推荐指数
3
解决办法
2177
查看次数

有没有办法使用 sysconv() 内置函数?

如果您使用以下方法获取某些视图的定义sys.sp_helptext

exec sys.sp_helptext 'sys.columns'

CREATE VIEW sys.columns
AS
  SELECT c.id                                                             AS object_id,
         c.NAME,
         c.colid                                                          AS column_id,
         c.xtype                                                          AS system_type_id,
         c.utype                                                          AS user_type_id,
         c.length                                                         AS max_length,
         c.prec                                                           AS PRECISION,
         c.scale,
         CONVERT(SYSNAME, CollationPropertyFromId(c.collationid, 'name')) AS collation_name,
         sysconv(bit, 1 - ( c.status & 1 ))                               AS is_nullable,-- CPM_NOTNULL  
         sysconv(bit, c.status & 2)                                       AS is_ansi_padded,-- CPM_NOTRIM  
         sysconv(bit, c.status & 8)                                       AS is_rowguidcol,-- CPM_ROWGUIDCOL  
         sysconv(bit, c.status & 4)                                       AS is_identity,-- CPM_IDENTCOL  
         sysconv(bit, c.status & 16)                                      AS is_computed,-- CPM_COMPUTED  
         sysconv(bit, c.status & 32)                                      AS …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

无法在 SSMS v17 中查看 SQL Server 代理

我登录了两个帐户。SA 帐户和我的个人帐户。在我的 SA 帐户上,我可以看到 SQL Server 代理节点,而在另一个帐户上则看不到。它们都连接到完全相同的服务器和实例。

在我的个人用户属性中,我检查了所有角色,包括 SQLAgentOperatorRole、SQLAgentReaderRole 和 SQLAgentUserRole。我也是系统管理员。

在此处输入图片说明

ssms sql-server-2012

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

关于 T-SQL 脚本的建议,改为使用动态 SQL

下面的脚本将查询 Ola 的维护解决方案结果表 (CommandLog),并在过去 4 周内对每两周一次的重新索引执行持续时间进行比较。

现在看起来,这是一个快速的技巧,可以帮助我调整维护窗口。但我想删除日期硬编码,这样我就不必在未来的每个周末手动添加一个新的 JOIN。

请提供完整的重写(动态 SQL?)或仅提供有关如何实现此功能或要包含的其他一些有用功能的一些提示。确定更改 sproc 并将额外的输出添加到表中。使用 SQL 2016。如果已经有一个脚本可以满足这个目的,那么很高兴使用那个脚本。

WITH t0 AS 
(
SELECT ObjectName, IndexName, IndexType
FROM Tools.dbo.CommandLog
WHERE 1=1
AND DatabaseName = 'testdb'
AND CommandType = 'ALTER_INDEX'
GROUP BY ObjectName, IndexName, IndexType
)

SELECT 
 t0.ObjectName
,t0.IndexName
,t0.IndexType
,DATEDIFF(ss,t1.StartTime,t1.EndTime) as '20-40 01-06'
,DATEDIFF(ss,t2.StartTime,t2.EndTime) as '5-40 01-07'
,DATEDIFF(ss,t3.StartTime,t3.EndTime) as '20-40 01-13'
,DATEDIFF(ss,t4.StartTime,t4.EndTime) as '5-40 01-14'
,DATEDIFF(ss,t5.StartTime,t5.EndTime) as '20-40 01-20'
,DATEDIFF(ss,t6.StartTime,t6.EndTime) as '5-40 01-21'
,DATEDIFF(ss,t7.StartTime,t7.EndTime) as '20-40 01-27'
,DATEDIFF(ss,t8.StartTime,t8.EndTime) as '5-40 01-28'
FROM t0
LEFT JOIN …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2016

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