标签: sql-server-2012

强制实施 IsDeleted(软删除)时,合适的索引架构是什么?

目前,我们有一个功能齐全的现有数据库和应用程序。我目前没有能力更改架构。今天,数据库中的每个表都有一个“IsDeleted”NOT NULL BIT 字段,默认值为“0”。当应用程序“删除”数据时,它只是将 IsDeleted 标志更新为 1。

我无法理解的是每个表上的索引应该如何构建。现在,每个查询/加入/等总是实现 IsDeleted 检查。这是我们的开发人员必须遵循的标准。话虽如此,我正在尝试确定是否需要更改每个表上的所有聚集主键索引以包含主键和 IsDeleted BIT 字段。此外,由于每个查询/加入/等。必须实施 IsDeleted 检查,是否适当假设每个索引(非聚集索引)都应包含 IsDeleted 字段作为索引的第一个字段?

我的另一个问题是关于过滤索引。我知道我可以在索引上放置过滤器,例如“WHERE IsDeleted = 0”以减少索引的大小。但是,由于每个连接/查询都必须实现 IsDeleted 检查,这是否会阻止使用过滤索引(因为在连接/查询中使用了 IsDeleted 列)?

请记住,我无法更改 IsDeleted 方法。

index sql-server sql-server-2012

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

在哪里学习 SQL Server Service Broker?

是否有学习 Service Broker 的好资源?我正在寻找对新手友好的指南。

sql-server service-broker sql-server-2012

16
推荐指数
2
解决办法
2372
查看次数

分页时 SQL Server 查询速度变慢

我在 SQL Server 2012 中看到以下 T-SQL 查询的一些奇怪行为:

SELECT Id 
FROM dbo.Person 
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name
Run Code Online (Sandbox Code Playgroud)

单独执行这个查询在不到两秒的时间内给了我大约 1,300 个结果(有一个全文索引Name

但是,当我将查询更改为:

SELECT Id 
FROM dbo.Person 
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name
OFFSET 0 rows
FETCH NEXT 10 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

给我10个结果需要20多秒。

下面的查询更糟糕:

SELECT Id 
FROM ( 
    SELECT ROW_NUMBER() OVER (ORDER BY Name) AS RowNum, Id 
    FROM dbo.Person
    WHERE CONTAINS(Name, '"John" AND "Smith"') ) AS RowConstrainedResult 
WHERE RowNum >= 0 AND RowNum < 11 
ORDER BY …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012

16
推荐指数
2
解决办法
5646
查看次数

将主键移动到文件组 (SQL Server 2012)

如何将集群主键移动到新文件组?我已经找到了一种可能的“算法”,但它的效率非常低:

  1. 删除非聚集索引(需要重新使用和重建它们)
  2. 删除聚集索引(需要对整个表进行重新排序)
  3. 创建新的主键约束(巨大的排序操作)
  4. 创建所有非聚集索引(需要排序和写入)

有没有更有效的方法?这是非常低效的,并且需要很长时间,因为表在弱服务器上的大小为 50GB。

有没有办法跳过所有这些并在新文件组上重建?这不需要对数据进行任何排序。

index sql-server filegroups sql-server-2012

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

强制索引假脱机

我知道出于性能原因应该避免它,但我试图展示一个条件,它显示为演示如何确保它不会出现。

但是,我最终得到了缺少索引警告,但优化器选择不创建临时索引。

我正在使用的查询是

SELECT 
    z.a
FROM dbo.t5 AS z WITH(INDEX(0))
WHERE 
    EXISTS 
    (
        SELECT y.a 
        FROM dbo.t4 AS y
        WHERE y.a = z.a
    )
OPTION (MAXDOP 1);
Run Code Online (Sandbox Code Playgroud)

表模式是:

CREATE TABLE dbo.t4
(
    a   integer NULL,
    b   varchar(1000) NULL,
    p   varchar(100) NULL
);

CREATE TABLE dbo.t5
(
    a   integer NULL,
    b   varchar(1000) NULL
);

CREATE UNIQUE CLUSTERED INDEX c1 
ON dbo.t5 (a);
Run Code Online (Sandbox Code Playgroud)

两个表都有 10,000 行,您可以使用以下方法进行模拟:

UPDATE STATISTICS dbo.t4 
WITH 
    ROWCOUNT = 10000, 
    PAGECOUNT = 1000;

UPDATE STATISTICS dbo.t5 
WITH 
    ROWCOUNT = …
Run Code Online (Sandbox Code Playgroud)

t-sql execution-plan sql-server-2012 index-spool

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

SQL Server 2012 比 2008 慢

我将大型网站和数据库从旧服务器(Windows 2008 / SQL Server 2008 / 16 GB RAM / 2 x 2.5 GHz 四核 / SAS 磁盘)迁移到更新、更好的服务器(Windows 2008 R2 / SQL Server 2012 SP1 / 64 GB RAM / 2 x 2.1 GHz 16 核处理器 / SSD 磁盘)。

我分离了旧服务器上的数据库文件,将它们复制并附加到新服务器上。一切都很顺利。

之后,我将兼容级别更改为 110,更新统计信息,重建索引。

令我非常失望的是,我注意到大多数 sql 查询在新的 SQL 2012 服务器上比在旧的 SQL 2008 服务器上慢得多(慢 2-3-4 倍)。

例如,在一个包含大约 70 万条记录的表上,在旧服务器上查询索引需要大约 100 毫秒。在新服务器上,相同的查询大约需要 350 毫秒。

所有查询都会发生同样的情况。

我会很感激这里的一些帮助。让我知道要检查/验证的内容。因为我发现很难相信在具有更新 SQL Server 的更好服务器上,性能会更差。

更多细节:

内存设置为最大。

我有这个表和索引:

CREATE TABLE [dbo].[Answer_Details_23](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [UserID] [int] NOT …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012

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

在 SQL Server 中安全地生成 UNIQUEIDENTIFIER

我打算使用 aUNIQUEIDENTIFIER作为用户可以用来访问某些数据的访问密钥。从这个意义上说,密钥将充当密码。

我需要生成多个这样的标识符作为INSERT...SELECT语句的一部分。出于架构原因,我想在这种情况下生成服务器端标识符。

如何生成安全的随机数UNIQUEIDENTIFIER?请注意,这NEWID不够随机,因为它根本不承诺任何安全属性。我正在寻找与System.Security.Cryptography.RandomNumberGenerator等效的 SQL Server,因为我需要不可猜测的 ID。任何基于CHECKSUM, RANDor 的东西GETUTCDATE也不符合条件。

security sql-server uniqueidentifier sql-server-2012 cryptography

16
推荐指数
2
解决办法
7213
查看次数

如何在维护计划作业中更改或更新本地服务器连接

两天前,我们的客户更改了我们的开发服务器名称之一

服务器重命名后,由于服务器名称不匹配,我所有的维护工作和其他工作都失败了。

我们使用的是sql server 2012版本和server 2008 操作系统

所以今天早上我将我的 Sql server 2012 名称重命名为更新的给定名称并制作表,程序更新

我试图在维护工作中更新本地服务器连接,但它是不可编辑的。然后我添加了新的服务器连接,但仍然没有用我在执行作业时遇到错误。

在我尝试在作业属性选项中使用目标页面后,也只选择了目标服务器并禁用了多个目标服务器。

下面的错误

以用户身份执行:NT Service\SQLSERVERAGENT。Microsoft (R) SQL Server 执行包实用程序版本 11.0.2100.60,适用于 64 位 版权所有 (C) Microsoft Corporation。版权所有。
开始时间:12:01:28 AM 错误:2013-12-16 00:01:43.98 代码:0xC00291EC 来源:{410F7661-F71A-4B68-9584-BA422AB00F02} 执行 SQL
连接任务说明:获取本地服务器连接失败. 连接可能未正确配置,或者您可能没有此连接的正确权限。结束错误
错误:2013-12-16 00:02:00.00
代码:0xC0024104
来源:Territory_Update
说明:任务上的 Execute 方法返回错误代码 0x80131904(建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。未找到或无法访问服务器。验证实例名称是否正确,并且SQL Server 配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 - 无法打开与 SQL Server 的连接))。Execute 方法必须成功,并使用“out”参数指示结果。结束错误
错误:2013-12-16 00:02:15.00
代码:0xC0024104
来源:{4E2AF328-0B8D-4905-83BE-839FDDEFC09C}
说明:任务上的 Execute 方法返回错误代码 0x80131904(建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。验证实例名称是否正确,并且SQL Server 配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 - 无法打开与 SQL Server 的连接))。Execute 方法必须成功,并使用“out”参数指示结果。
结束错误 …

maintenance t-sql sql-server-2012 jobs

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

角色 db_owner 允许什么

我一直在尝试解决无法查看 SQL Server 2012 数据库中某些表的登录问题。在这样做时,我发现我不太了解db_owner角色中的成员资格允许的内容。我可以理解其他角色,db_datareader and db_datawriter但我对db_owner允许的内容仍然感到困惑。

security sql-server sql-server-2012

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

SQL Server Isnull 当字段为空时返回 1900-01-01

当 DOB 字段为空时,以下代码返回 1900-01-01。我想要(并期望)它返回一个空字符串(''),但事实并非如此。我应该如何继续获得我想要的结果?

isnull(convert(date,DOB,1),'')
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 datetime

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