标签: t-sql

有效地重建聚集索引

在测试数据库中,我希望:

  • 删除聚集索引(它们是对我们来说超级无用的行上的主键聚集约束。)
  • 创建新的聚集索引
  • 重新创建主键约束作为非聚集索引
  • 重建所有其他非聚集索引。

我的工作流程也是如此,在删除聚集索引之前添加了禁用所有非聚集索引。

由于删除聚集约束索引需要将表保存为 HEAP,因此此过程在我们的 45m 行表上花费的时间是巨大的。约束的下降一直持续到 1:17:00,似乎只有大约 31m(基于会话的 Spotlight 中的逻辑读取)。

有没有更有效的方法来处理这个工作流程?也许是一种删除约束索引并重建为新聚集索引而不是 HEAP 的方法?

谢谢,韦斯

DDL 语句:

表结构

    CREATE TABLE [dbo].[hist](
    [prrowid] [varchar](36) NOT NULL,
    [part] [varchar](30) NULL,
    [date] [datetime] NULL,
    [per_date] [datetime] NULL,
    [type] [varchar](80) NULL,
    [loc] [varchar](80) NULL,
    [loc_begin] [decimal](28, 10) NULL,
    [begin_qoh] [decimal](28, 10) NULL,
    [qty_req] [decimal](28, 10) NULL,
    [qty_chg] [decimal](28, 10) NULL,
    [qty_short] [decimal](28, 10) NULL,
    [um] [varchar](30) NULL,
    [last_date] [datetime] NULL,
    [nbr] [varchar](30) NULL,
    [so_job] [varchar](80) NULL,
    [ship_type] [varchar](30) NULL,
    [addr] [varchar](80) …
Run Code Online (Sandbox Code Playgroud)

index sql-server clustered-index t-sql sql-server-2014

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

需要关于备份策略的建议

我们的客户已同意一天数据丢失的 RPO。所以我将改变备份策略以消除空间限制。

数据库处于完全恢复模式。

现有的备份计划:-

  1. 我们每天对数据库进行一次完整备份。

想改变如下: -

  1. 每周,在周日或周六,我们都会对数据库进行完整备份。
  2. 并计划每天对​​数据库进行一次事务备份或差异备份。

这将避免我的空间限制。

如果我们备份事务日志,那么 RTO 会不会更大,因为我们每天只备份一个事务?

无论如何,我们需要执行事务日志备份以在日志文件中腾出空间。

那么你能建议哪种备份类型会更好,差异或事务日志?

如果我走错了方向,请根据我的 RPO 建议一个备份策略。

谢谢。

sql-server backup t-sql restore sql-server-2012

5
推荐指数
2
解决办法
944
查看次数

如何识别哪些 SSIS 包使用给定的环境变量?

我怀疑我今天的 Google 技能不够,但我正在寻找一个快速的 TSQL 脚本,该脚本将识别包存储中使用给定环境变量名称的所有 SSIS 包。

例如,当我配置一个包并查看 Paramaters 页面时,我可以选择一个给定的环境变量。在以下屏幕截图中,我关注的环境变量名为SMTP。我想找到所有使用这个环境变量的包,这样我就可以在进行任何大规模更改之前进行一些调查/测试。

在此处输入图片说明

如果有人有现成的脚本,我将不胜感激,如果你能发布它,否则我会在编码后发布一些东西。

谢谢!

sql-server ssis t-sql

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

在 SQL Server 脚本中的 SELECT 末尾使用 X?

我对 T-SQL 比较陌生,在查看我的前辈脚本时,我发现了一条我无法解析的行。自己去查查是一件很困难的事情。希望指教。

这条线出现在 WHILE 循环内,但我认为这并不重要。我相信从功能上讲,这是从共享 ID 的几行中的一列中收集值,并将它们用逗号连接到 1 个字段中。但我不知道这叫什么,也不知道如何查找以供自己使用。

这个'x'最后在做什么?谁能给我指点这方面的信息?

(select @invtid = coalesce(@invtid + ',',' ')+rtrim(RoleID) 
FROM (
    Select distinct roleid 
    from UserAccounts 
    WHERE CustID = @custID
     )
 x)
Run Code Online (Sandbox Code Playgroud)

谢谢。

sql-server scripting t-sql

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

从系统日志中恢复存储过程的参数

我正在尝试调试一个应用程序,我想在处理代码之前排除数据库错误。

我知道哪个存储过程负责处理我正在查看的数据,但是在此数据库上没有设置日志记录或任​​何跟踪。有没有办法使用现有的系统日志恢复传递给该过程的参数?

我看: dm_exec_procedure_statsfn_dblog,但他们似乎并没有把我需要什么。

我正在设置日志记录。

sql-server ssms t-sql

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

证书、非对称密钥或私钥文件无效或不存在

我正在尝试将数据库从不同的服务器还原到我的本地主机服务器上。那个数据库是加密的(bak 文件),所以我必须解密它,这很好,我有所有的证书文件和密码,但是出于某种原因,我仍然收到以下错误:

The certificate, asymmetric key, or private key file is not valid or does not exist; or you do not have permissions for it.

这是我正在执行的代码:

      CREATE CERTIFICATE [Certificate1] 
FROM FILE = 'C:\Location of the certs'
WITH PRIVATE KEY ( 
    FILE = 'C:\Location of the certs' ,   
    DECRYPTION BY PASSWORD = 'password'
);
Run Code Online (Sandbox Code Playgroud)

附注。我不是备份和恢复方面的专家。

sql-server t-sql restore certificate

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

如何将行转换为 SQL 中的列?

抱歉误导性的问题,但我不知道如何命名我的问题。

我的 db<>fidle 在这里

我有一个定义如下的表:

CREATE TABLE shift (
     worker_name VARCHAR(25), 
     log_time DATETIME, 
     in_out VARCHAR(3)
);
Run Code Online (Sandbox Code Playgroud)

它包含以下数据:

INSERT INTO shift VALUES ('User 1', '2018-05-14 07:24:40.000', 'IN');
INSERT INTO shift VALUES ('User 2', '2018-05-14 11:55:29.000', 'IN');
INSERT INTO shift VALUES ('User 3', '2018-05-14 14:03:26.000', 'IN');
INSERT INTO shift VALUES ('User 1', '2018-05-14 14:05:08.000', 'Out');
INSERT INTO shift VALUES ('User 3', '2018-05-14 20:08:30.000', 'Out');
INSERT INTO shift VALUES ('User 2', '2018-05-14 20:08:36.000', 'Out');
INSERT INTO shift VALUES ('User 4', '2018-05-14 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

可以通过 DMV 检查 NOEXEC 的状态吗?

在用于部署的大型 DDL 脚本中,将 SET NOEXEC ON 作为错误处理的一部分使用是很常见的,以防止下游代码的执行。如果与 SET NOCOUNT ON 结合使用,则除非进行适当的部署后检查,否则可能会无意中抑制代码执行。我检查了 sys.dm_exec_sessions 并且没有任何 SET 语句的属性。从 DBA 的角度来看,是否有其他方法可以检查当前会话或任何用户会话的任一语句的状态?

这是一个快速示例...

CREATE TABLE dbo.MJZTest
    (Col1 int)
ON [PRIMARY2]
GO
IF @@ERROR<>0
    SET NOEXEC ON

INSERT INTO dbo.MJZTest (Col1)
VALUES (1)
GO
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,如果[PRIMARY2]文件组不存在,阻止了表的创建,@@ERROR检查将调用SET NOEXEC ON阻止后续INSERT语句实际执行的语句。我见过使用 RedGate SQL Compare 等工具生成这种类型的代码。

问题是,如果执行代码的人SET NOEXEC OFF在调试期间忽略运行以重置会话,他们可能会收到一条Command(s) completed successfully.消息,而不管实际结果如何。

sql-server t-sql session

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

SQL 挑战 - 传感器阈值异常报告

我添加了一个不使用窗口函数的解决方案和一个基准测试,其中包含一个低于 Martin's Answer 的大数据集

这是GROUP BY 使用不在 SELECT 列表中的列的后续线程- 这什么时候实用、优雅或强大?

在我对这一挑战的解决方案中,我使用了一个查询,该查询按不属于选择列表的表达式进行分组。当逻辑分组元素涉及来自其他行的数据时,这经常与窗口函数一起使用。

也许这是一个矫枉过正的例子,但我认为你可能会发现挑战本身很有趣。我会等待发布我的解决方案,也许你们中的一些人可以提出更好的解决方案。

挑战

我们有一个定期记录读数值的传感器表。无法保证采样时间处于单调间隔。

您需要编写一个查询来报告“异常”,这意味着传感器报告的读数超出阈值的次数,无论是低还是高。传感器报告超过或低于阈值的每个时间段都被视为“例外”。一旦读数恢复正常,异常结束。

示例表和数据

该脚本采用 T-SQL 格式,是我的培训材料的一部分。

这是 SQLFiddle 的链接

------------------------------------------
-- Sensor Thresholds - 1 - Setup Example --
------------------------------------------

CREATE TABLE [Sensors]
(
    [Sensor] NVARCHAR(10) NOT NULL,
    [Lower Threshold] DECIMAL(7,2) NOT NULL,
    [Upper Threshold] DECIMAL(7,2) NOT NULL,
    CONSTRAINT [PK Sensors] 
        PRIMARY KEY CLUSTERED ([Sensor]),
    CONSTRAINT [CK Value Range]
        CHECK ([Upper Threshold] > [Lower Threshold])
);
GO

INSERT INTO [Sensors]
( 
    [Sensor] , …
Run Code Online (Sandbox Code Playgroud)

t-sql window-functions group-by

5
推荐指数
2
解决办法
280
查看次数

优雅地处理 T-SQL 代码中的“类枚举”幻数

我们运行 Dynamics GP,任何处理过 GP 的人都会熟悉它的所有“幻数”列,这些列代表应用程序内的各种枚举值。例如,报告查询可能如下所示:

...
WHERE sod.SOPTYPE = 2
    AND iv.VCTNMTHD = 3
    AND pod.POLNESTA IN (2, 3)
Run Code Online (Sandbox Code Playgroud)

......这与自我记录尽可能远。

起初我有一个聪明的想法,即创建一个名为“Enums”的表,用值填充它,并制作一个标量包装函数,这样你就可以像这样查询:

...
WHERE sod.SOPTYPE = Enum('Sales Doc Type', 'Order')
    AND iv.VCTNMTHD = Enum('Valuation Method', 'Average Perpetual')
    AND pod.POLNESTA IN (Enum('PO Line State', 'Released'), Enum('PO Line State', 'Change Order'))
Run Code Online (Sandbox Code Playgroud)

当然,这很糟糕,因为优化器无法看到潜在的“常量”值,因此做出了一些相当糟糕的选择,因为它必须进行基数猜测。

所以它需要是代码中的实际常量值,但我不确定 SSMS 中是否有任何很好的功能可以使这种事情变得容易。我可以(错误地)以某种方式使用代码片段或模板吗?如果我们可以进行某种查找/插入来使我们的代码看起来像这样,那就太棒了:

...
WHERE sod.SOPTYPE = /*Order*/2
    AND iv.VCTNMTHD = /*Average Perpetual*/3
    AND pod.POLNESTA IN (/*Released*/2, /*Change Order*/3)
Run Code Online (Sandbox Code Playgroud)

我也不反对检查 SSMS 加载项。

sql-server ssms t-sql enum

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