标签: sql-server

TDE 准备:用于还原的密钥/证书备份

我在开发环境中工作以更好地理解TDE加密。我让它与另一台服务器上的备份和恢复一起工作。有几个问题,我知道我需要使用相应的私钥备份证书。

USE master; 
GO 
BACKUP CERTIFICATE Test
TO FILE = 'C:\Test.cer'
WITH PRIVATE KEY
(FILE = 'C:\Test.pvk',
ENCRYPTION BY PASSWORD = 'Example12#')
Run Code Online (Sandbox Code Playgroud)

如果发生故障,这些需要在新服务器上移动/恢复。在需要恢复到另一台服务器的情况下,我还需要从源服务器备份什么吗?

还有关于私钥存储的任何建议吗?我目前的想法是将证书、私钥和密码备份到单独备份和异地复制的 KeePass 数据库中。

这留下了一个问题,即将 KeePass 私钥备份到哪里?

sql-server encryption transparent-data-encryption

10
推荐指数
1
解决办法
1353
查看次数

启用 SQL Server 全文索引后更新查询速度变慢

我有一个 asp.net 网站,其中有许多针对我的数据库运行的插入、更新和删除查询。

几天前,我在其中一个表的两列上创建了一个全文索引。之后我意识到当网站在该表上运行更新查询时,SQL Server 进程的内存和磁盘使用量正在跳跃并且更新速度较慢。在创建全文索引之前,查询运行没有任何性能问题。

我也意识到以前非常简单的更新查询现在变得复杂了,因为执行计划现在有诸如全文索引更新之类的东西。这是启用全文后变得复杂的新执行计划的一部分:

在此处输入图片说明

在我更新站点内容的几个小时内,我运行了 5000 个更新查询,我认为每次都为每一行完成全文索引过程。

我应该在更新行开始时禁用全文扫描,然后重新启用它(如在这个相关问题中)?

我可以告诉 SQL Server 停止全文索引 5 分钟,然后开始索引新数据吗?

有没有更好的选择?我正在使用 SQL Server 2012。

performance sql-server full-text-search sql-server-2012 query-performance

10
推荐指数
1
解决办法
1989
查看次数

Windows 10 上的 SQL Server 2000

我需要在 Windows 10 上安装 SQL Server MSDE 2000 SP4。

我有其他运行 Windows 7 和 8.1 的机器,并且 SQL Server MSDE 2000 工作正常(也配置了合并复制)。

现在我在 Windows 10 上测试了相同的场景,但安装程序在安装过程中意外关闭。

我知道这个版本很旧,但是有没有办法在 Windows 10 上安装它?

sql-server sql-server-2000 installation windows-10

10
推荐指数
2
解决办法
8万
查看次数

按表显示数据和磁盘使用细分

我有一个 SQL Server 2008 R2 数据库正在被几个部署的程序使用。

问题:有没有一种简单的方法来显示每个表消耗多少空间,对于数据库中的所有表,并区分逻辑空间和磁盘空间?

如果我使用 SSMS (Management Studio),则为数据库显示的存储属性读取 167 MB,其中 3 MB“可用”(大小合适,但我担心 3 MB 可用 - 这是一个需要关注的限制吗? ,假设我知道我有足够的磁盘空间?)

我可以钻进每张桌子,但这需要永远做。

我知道我可以编写自己的查询并进行测试,但我想知道是否已经有一种简单的(内置的?)方法可以做到这一点。

sql-server ssms sql-server-2008-r2 database-size

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

基于时间戳的窗口偏移

我正在编写一个查询,用于对社交提要的结果进行分页。这个概念是移动应用程序将请求 N 个项目,并提供我在@CutoffTime下面调用的开始日期时间。截止时间的目的是确定分页窗口应该何时开始。我们使用时间戳而不是行偏移量的原因是,即使添加了较新的社交内容,时间戳也会让我们在获取较旧帖子时从一致的位置翻页。

由于社交提要项目可以来自您自己或您的朋友,因此我使用 aUNION来组合这两个组的结果。最初我尝试了TheQuery_CTE没有的逻辑UNION,结果很慢。

这就是我所做的(包括相关的表架构):

    CREATE TABLE [Content].[Photo]
(
    [PhotoId] INT NOT NULL PRIMARY KEY IDENTITY (1, 1), 
    [Key] UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(),
    [FullResolutionUrl] NVARCHAR(255) NOT NULL, 
    [Description] NVARCHAR(255) NULL, 
    [Created] DATETIME2(2) NOT NULL DEFAULT SYSUTCDATETIME(),
);

CREATE TABLE [Content].[UserPhotoAssociation]
(
    [PhotoId] INT NOT NULL, 
    [UserId] INT NOT NULL, 
    [ShowInSocialFeed] BIT NOT NULL DEFAULT 0,

    CONSTRAINT [PK_UserPhotos] PRIMARY KEY ([PhotoId], [UserId]), 
    CONSTRAINT [FK_UserPhotos_User] FOREIGN KEY ([UserId]) 
        REFERENCES [User].[User]([UserId]), 
    CONSTRAINT [FK_UserPhotos_Photo] …
Run Code Online (Sandbox Code Playgroud)

sql-server azure-sql-database window-functions paging

10
推荐指数
1
解决办法
255
查看次数

SQL Server 数据文件夹访问权限

我做了一个全新的 SQL Server 2014 安装。接下来,我想从以前的 SQL Server 2012 服务器附加一些数据库。我将所有mdfldf文件复制到数据目录,但是当我尝试附加它们时,我收到以下错误消息:

CREATE FILE
在尝试打开或创建物理文件
“D:\SQLSERVERDATA\MSSQL12.BIDEV\MSSQL\DATA\controlling_demo.mdf”时遇到操作系统错误 5(访问被拒绝)。
(Microsoft SQL Server,错误:5123)

当我检查文件安全设置(右键单击文件、属性、安全)时,它说我没有读取权限。我用来复制文件的帐户在管理员组中。我可以完全控制DATA文件夹,但是,只有我复制到那里的文件受到限制。

当我尝试对整个文件夹重新应用安全权限时,它说:

无法枚举容器中的对象。访问被拒绝。

当我将文件复制到其他地方时,我拥有访问权限。

问题是,如何获得文件DATA夹中这些文件的访问权限?

sql-server migration permissions installation

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

如果复合索引包含主键,我应该将复合索引标记为唯一吗?

给定一些带有主键的表,例如:

CREATE TABLE Customers (
   CustomerID int NOT NULL PRIMARY KEY,
   FirstName nvarchar(50),
   LastName nvarchar(50),
   Address nvarchar(200),
   Email nvarchar(260)
   --...
)
Run Code Online (Sandbox Code Playgroud)

我们有一个唯一的主键CustomerID

传统上,我可能需要一些额外的覆盖索引;例如通过CustomerID或快速找到用户Email

CREATE INDEX IX_Customers_CustomerIDEmail ON Customers
(
   CustomerID,
   Email
)
Run Code Online (Sandbox Code Playgroud)

这些是我几十年来创建的索引类型。

它不需要是唯一的,但它实际上是

索引本身的存在是为了避免表扫描;它是一个覆盖索引,以帮助提高性能(该索引不是强制执行唯一性的约束)。

今天我想起了一点信息——SQL Server 可以使用以下事实:

  • 一列有外键约束
  • 一列有唯一索引
  • 一个约束是可信的

以帮助它优化其查询执行。事实上,来自SQL Server 索引设计指南

如果数据是唯一的并且您希望强制执行唯一性,则在相同的列组合上创建唯一索引而不是非唯一索引可为查询优化器提供附加信息,从而可以生成更高效的执行计划。在这种情况下,建议创建唯一索引(最好通过创建 UNIQUE 约束)。

鉴于我的多列索引包含主键,这个复合索引实际上是唯一的。这不是我特别需要 SQL Server 在每次插入或更新期间强制执行的约束;但事实是这个非聚集索引唯一的。

将此事实上的唯一索引标记为实际唯一索引是否有任何优势?

在客户上创建唯一索引 IX_Customers_CustomerIDEmail
(
   顾客ID,
   电子邮件
) …

index sql-server

10
推荐指数
2
解决办法
2120
查看次数

sql server:以小块更新大表上的字段:如何获取进度/状态?

我们有一个非常大(1 亿行)的表,我们需要更新其中的几个字段。

对于日志运输等,我们显然也希望将其保持为一口大小的交易。

  • 下面会做的伎俩吗?
  • 我们如何让它打印一些输出,以便我们可以看到进度?(我们尝试在其中添加 PRINT 语句,但在 while 循环期间没有输出任何内容)

代码是:

DECLARE @CHUNK_SIZE int
SET @CHUNK_SIZE = 10000

UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01'
where deleted is null or deletedDate is null

WHILE @@ROWCOUNT > 0
BEGIN
    UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01'
    where deleted is null or deletedDate is null
END
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

10
推荐指数
1
解决办法
9827
查看次数

过滤索引仅在过滤部分在 JOIN 而不是 WHERE 时使用

我已经在下面创建了过滤索引,但是当我进一步运行 2 个查询时,该索引仅用于第一个示例中的查找,该示例在 JOIN 中有 END_DTTM 而不是 where 子句(这是查询中的唯一区别) . 任何人都可以解释为什么会发生这种情况?

索引创建

CREATE NONCLUSTERED INDEX [ix_PATIENT_LIST_BESPOKE_LIST_ID_includes] ON [dbo].[PATIENT_LIST_BESPOKE] 
(
    [LIST_ID] ASC,
    [END_DTTM] ASC
)
WHERE ([END_DTTM] IS NULL)
Run Code Online (Sandbox Code Playgroud)

查询

DECLARE @LIST_ID INT = 3655

--This one seeks on the index

SELECT  
    PATIENT_LISTS.LIST_ID
FROM    
    DBO.PATIENT_LISTS
    LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = PATIENT_LIST_BESPOKE.LIST_ID  
                                      AND PATIENT_LIST_BESPOKE.END_DTTM IS NULL
WHERE
    PATIENT_LISTS.LIST_ID = @LIST_ID

--This one scans on the index

SELECT  
    PATIENT_LISTS.LIST_ID
FROM    
    DBO.PATIENT_LISTS
    LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = PATIENT_LIST_BESPOKE.LIST_ID  
WHERE   
    PATIENT_LISTS.LIST_ID = @LIST_ID …
Run Code Online (Sandbox Code Playgroud)

performance index sql-server t-sql filtered-index query-performance

10
推荐指数
2
解决办法
2759
查看次数

不相关的列会影响select语句的查询时间吗?

我只是好奇。

假设您有一个包含 100 万条记录/行的表。

select order_value from store.orders
Run Code Online (Sandbox Code Playgroud)

那个表有1个字段、2个字段还是100个字段,在实际查询的时候有区别吗?我的意思是“order_value”以外的所有字段。

现在我正在将数据推送到数据仓库。有时我将字段转储到表中,“将来可能会在某天使用” - 但现在不会被任何东西查询。这些“无关”字段是否会直接或间接影响不包含它们的选择语句(不* 我的意思是)?

performance sql-server select query-performance

10
推荐指数
2
解决办法
989
查看次数