标签: sql-server

并行计划中的“实际”行数不准确

这是一个纯粹的学术问题,以至于它不会引起问题,我只是想听听对这种行为的任何解释。

以标准问题 Itzik Ben-Gan 交叉连接 CTE 计数表为例:

USE [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[TallyTable] 
(   
    @N INT
)
RETURNS TABLE WITH SCHEMABINDING AS
RETURN 
(
    WITH 
    E1(N) AS 
    (
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
    )                                       -- 1*10^1 or 10 rows …
Run Code Online (Sandbox Code Playgroud)

sql-server

17
推荐指数
3
解决办法
1465
查看次数

截断 SQL Server 错误日志的安全方法

我们的空间快用完了。清除错误日志的安全方法是什么?

清除此问题的安全方法是什么?

sql-server sql-server-2008-r2 truncate disk-space errors

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

在调用数据库上下文中执行的中央存储过程

我正在使用该sys.dm_db_index_physical_stats视图开发定制的维护解决方案。我目前从存储过程中引用它。现在,当该存储过程在我的一个数据库上运行时,它会执行我想要它做的事情并拉下有关任何数据库的所有记录的列表。当我将它放在不同的数据库上时,它会拉下与该数据库相关的所有记录的列表。

例如(底部的代码):

  • 针对数据库 6 运行的查询显示了数据库 1-10 的 [请求] 信息。
  • 针对数据库 3 运行的查询仅显示数据库 3 的 [请求] 信息。

我希望这个过程专门针对数据库 3 的原因是因为我更愿意将所有维护对象保留在同一个数据库中。我希望这项工作位于维护数据库中,并像在该应用程序数据库中一样工作。

代码:

ALTER PROCEDURE [dbo].[GetFragStats] 
    @databaseName   NVARCHAR(64) = NULL
    ,@tableName     NVARCHAR(64) = NULL
    ,@indexID       INT          = NULL
    ,@partNumber    INT          = NULL
    ,@Mode          NVARCHAR(64) = 'DETAILED'
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @databaseID INT, @tableID INT

    IF @databaseName IS NOT NULL
        AND @databaseName NOT IN ('tempdb','ReportServerTempDB')
    BEGIN
        SET @databaseID = DB_ID(@databaseName)
    END

    IF @tableName IS NOT NULL
    BEGIN
        SET @tableID = …
Run Code Online (Sandbox Code Playgroud)

index sql-server-2008 sql-server stored-procedures maintenance

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

使用 WITH REPLACE 还原备份时出现错误 3154

我的计算机上安装了 SQL 2012 SP1。我做了一个数据库的备份test.bak。

我有一个test2同名的数据库,但数据发生了变化。

我想test.bak通过test2数据库恢复。

我总是收到错误:

错误 3154:备份集包含现有数据库以外的数据库的备份。

我试过:

  1. 我右键单击 test2 -> Restore database -> From device

    我选择test.bak并检查了With Replace但我收到错误。

  2. 然后我尝试右键单击 test2 -> Restore file and filegroups

    我选择test.bak并检查了With Replace但我收到错误。

我可以删除旧数据库,然后使用正确的名称恢复备份,但是当我使用 SQL 2008 时,恢复现有数据库没有问题。

好像是因为我用的是SQL2012,所以经常出现这个错误!

sql-server backup restore sql-server-2012

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

为什么顶级数据库平台中没有无符号整数类型?

数据库通常是非常可定制的,具有不同的数据类型和自定义长度。

这让我感到惊讶,因为我试图寻找语法来使用unsigned int它们在 PostgreSQL 和 MS SQL Server 中都不可用的类型。MySQL 和 Oracle 似乎都可以。

这对他们来说似乎是一个明显的遗漏 - 下一个最佳性能选项是 long/bigint,(8 字节整数),但可能完全没有必要!有谁知道为什么他们会选择不包含本机 unsigned int 支持?

postgresql sql-server datatypes

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

避免大 ID 值的原因

我们正在开发一个 Web 应用程序,用户尚无法访问。我的老板注意到新创建的记录的 ID 超过 10 000,即使表中只有不到 100 条记录。她假设 Web 界面出于某种原因创建了比实际记录多 100 倍的临时记录(并删除了它们),这可能导致我们在发布后的几个月内超出范围。

我不认为她关于 ID 膨胀的原因是正确的(可以回答这个问题的同事正在休假,所以我们不确定),但让我们假设她是。她说她讨厌使用 bigint 列,她希望我们停止自动递增 ID 列并编写服务器端代码,选择第一个“未使用”的整数并将其用作 ID。

我是一名计算机科学研究生,几乎没有实践经验,担任初级开发人员的角色。她在管理我们组织的所有数据库和设计其中大部分数据库方面拥有多年经验。我认为在这种情况下她是不正确的,bigint ID 没有什么可害怕的,并且模仿 DBMS 功能的反模式气味。但我还不相信我的判断。

支持和反对每个立场的论据是什么?如果我们使用 bigint 会发生什么坏事,重新发明轮子自动递增功能有什么危险?有没有比任何一种都更好的第三种解决方案?她想要避免身份证面值膨胀的原因是什么?我也有兴趣了解实际原因 - 也许 bigint ID 理论上可行,但在实践中会引起头痛?

该应用程序预计不会处理大量数据。我怀疑它会在未来几年内达到 10 000 条实际记录。

如果它有任何区别,我们正在使用 Microsoft SQL 服务器。该应用程序是用 C# 编写的,并使用 Linq to SQL。

更新

谢谢,我发现现有的答案和评论很有趣。但恐怕你误解了我的问题,所以它们包含了我想知道的。

我并不真正关心高 ID 的真正原因。如果我们自己找不到它,我可以问一个不同的问题。我感兴趣的是了解这种情况下的决策过程。为此,请假设应用程序将每天写入 1000 条记录,然后删除其中的 9999 条。我几乎可以肯定事实并非如此,但这就是我的老板提出要求时所相信的。那么,在这些假设情况下,使用 bigint 或编写我们自己的代码来分配 ID(以重用已删除记录的 ID 的方式,以确保没有间隙)的优缺点是什么?

至于实际原因,我强烈怀疑这是因为我们曾经写过代码从另一个数据库中导入数据,作为概念证明,以后可以在一定程度上进行迁移。我认为我的同事在导入过程中实际上创建了数千条记录,后来又删除了它们。我必须确认是否确实如此,但如果是,则甚至不需要采取行动。

sql-server auto-increment

17
推荐指数
2
解决办法
5545
查看次数

获取 SQL 代理作业的详细输出

我们有一个 SQL Server 代理作业,它运行维护计划以重新索引服务器上的所有数据库。最近这失败了,但工作历史记录没有提供足够的信息来诊断问题。

在作业历史记录中,它指出作业失败。该作业由用户 foo\bar 调用。运行的最后一步是第 1 步(重建索引)。

在详细信息窗口中有以下形式的多条消息:

Executing query "ALTER INDEX [something] ON [a...".: 0% complete  End Progress  Progress: 2015-03-15 22:51:23.67     Source: Rebuild Index Task
Run Code Online (Sandbox Code Playgroud)

正在运行的 SQL 语句被截断,我假设语句的输出也被截断,从而使我无法确定哪个特定语句失败以及为什么失败。有没有办法提取这些消息的全文?

sql-server sql-server-agent

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

删除表字段后声明磁盘空间

我正在运行 sql 2008 r2 并且数据库在过去 3 年中运行良好且快速,直到大约 3 个月前我们在非常活跃和使用过的表上添加了 ntext 字段。现在我们开始用尽服务器空间,因为这个表的大小越来越大。

我读到了缩小,我们不想放松 db 的索引,因为它多年来一直在快速工作,而且我们不想让碎片消耗殆尽。

我们决定删除该字段及其所有值: 有没有办法删除 ntext 字段及其所有值并释放空间而不删除索引,不缩小,不损失数据库性能?

我附上 db size 查询输出,以显示过去 5 个月的大小扩展。

在此处输入图片说明

sql-server shrink sql-server-2008-r2

17
推荐指数
2
解决办法
9173
查看次数

在可用性组中的辅助数据库上运行大型查询会影响主数据库中的事务性能吗?

我需要为 SSRS 和 Tableau 报告提供实时或几乎实时的数据。我不希望生产 OLTP 系统受到长时间运行的查询的负面影响。在可用性组中的辅助数据库上运行大型查询会影响主数据库中的事务性能吗?

sql-server ssrs availability-groups sql-server-2014

17
推荐指数
1
解决办法
3178
查看次数

SELECT TOP 1 from a very large table on a index column 非常慢,但不是反向顺序(“desc”)

我们有一个大约 1TB 的大型数据库,在强大的服务器上运行 SQL Server 2014。几年来,一切都运行良好。大约 2 周前,我们进行了全面维护,其中包括: 安装所有软件更新;重建所有索引和压缩 DB 文件。但是,我们没想到在某个阶段,在实际负载相同的情况下,DB 的 CPU 使用率会增加超过 100% 到 150%。

经过大量的故障排除,我们将其缩小到一个非常简单的查询,但我们找不到解决方案。查询非常简单:

select top 1 EventID from EventLog with (nolock) order by EventID
Run Code Online (Sandbox Code Playgroud)

它总是需要大约 1.5 秒!但是,使用“desc”的类似查询总是需要大约 0 毫秒:

select top 1 EventID from EventLog with (nolock) order by EventID desc
Run Code Online (Sandbox Code Playgroud)

PTable 大约有 5 亿行;EventID是ASC数据类型为 bigint(身份列)的主聚集索引列(ordered )。顶部有多个线程向表中插入数据(较大的 EventID),底部有 1 个线程删除数据(较小的 EventID)。

在 SMSS 中,我们验证了两个查询始终使用相同的执行计划:

  • 聚集索引扫描;

  • 估计行数和实际行数均为1;

  • 估计和实际执行次数均为1;

  • 估计I/O成本是8500(好像有点高)

  • 如果连续运行,则两者的查询成本相同 50%。

我更新了索引统计with fullscan,问题依旧;我再次重建索引,问题似乎消失了半天,但又回来了。

我打开了 IO 统计:

set statistics io on …
Run Code Online (Sandbox Code Playgroud)

performance sql-server select sql-server-2014 top query-performance

17
推荐指数
1
解决办法
4713
查看次数