AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-20225

Kenneth Fisher's questions

Martin Hope
Kenneth Fisher
Asked: 2024-09-20 05:52:38 +0800 CST

在 WHERE 子句中使用不等式时出现性能问题

  • 5

我在 SQL Server Azure 托管实例上有以下代码,性能非常糟糕。

INSERT INTO #CU WITH (TABLOCKX) (LA_ID, CU_ID)
SELECT la.LA_ID,
       c2.CU_ID
FROM #la la
    INNER JOIN dbo.T1 c ON c.CU_ID = la.CU_ID
    INNER JOIN dbo.T1 c2 ON c2.Parent_CU_ID = c.Parent_CU_ID
WHERE c.Parent_CU_ID > 0
      AND c.CU_ID <> c2.CU_ID
      AND la.Flag1 = 1
      AND EXISTS (SELECT 1 FROM #cid WHERE c2.CU_ID = ID)

我在 T1.Flag 上有一个筛选索引,如果我删除不等式,性能就超出了可接受的范围(5 分钟缩短到 10 秒),因此我相信我的问题在于不等式,但我想不出任何模式可以给我相同的结果,但性能更好。有什么建议吗?计划

在此处输入图片描述

sql-server
  • 1 个回答
  • 134 Views
Martin Hope
Kenneth Fisher
Asked: 2020-08-29 12:19:12 +0800 CST

由 sp_MSdetect_nonlogged_shutdown 掩盖的复制错误返回“字符串或二进制数据将被截断”

  • 2

我们的一项复制作业在第 3 步失败,该步骤运行sp_MSdetect_nonlogged_shutdown,返回一个'String or binary data would be truncated'。这当然使我们走上了试图在数据库中找到问题的道路。但是,我们比较了这两个数据库,它们是相同的。据我所知,该错误实际上是sp_MSdetect_nonlogged_shutdown中的一个错误。

最终,我再次检查了作业,第 2 步也失败并抛出了一个小型转储。当我们查看转储时,它说:

线程试图读取或写入它没有适当访问权限的虚拟地址

运行作业的 id 是一个 SQL id,即 sysadmin,步骤 (2) 是在代理服务帐户下运行的。服务帐户有权访问快照目录。我们有多个使用相同安全设置的其他复制作业,它们运行良好。

SQL 版本:

Microsoft SQL Server 2016 (SP2-GDR) (KB4532097) - 13.0.5102.14 (X64) 2019 年 12 月 31 日 22:39:35 版权所有 (c) Microsoft Corporation Enterprise Edition:Windows Server 2016 Standard 上基于内核的许可(64 位) 10.0(内部版本 14393:)(管理程序)

有人知道我在哪里可以找到权限错误吗?或者我可以使用哪些步骤来缩小范围?

sql-server replication
  • 1 个回答
  • 608 Views
Martin Hope
Kenneth Fisher
Asked: 2020-01-01 11:40:56 +0800 CST

显示在对象资源管理器详细信息中的行计数所需的权限

  • 8

我遇到了一个奇怪的安全问题。我有一个用户在 SQL 2016 服务器上使用 SSMS 18.2。他们是 db_datareader 的成员,但是当他们在对象资源管理器详细信息中拉起行数列时,它是空白的。尽我所能告诉它需要 DBO 才能显示行数。

具有读取权限的用户: 在此处输入图像描述

具有 dbo 访问权限的用户: 在此处输入图像描述

这是一个错误还是故意的?有谁知道是否有较低级别的权限可以提供此行数?我知道还有很多其他方法可以获取行数,例如sys.partitions,但是用户坚持要使用 OED 窗口。

sql-server sql-server-2016
  • 1 个回答
  • 354 Views
Martin Hope
Kenneth Fisher
Asked: 2018-05-30 12:49:38 +0800 CST

BULK INSERT 在我有权访问的文件上获取“无法批量加载,因为 ... 访问被拒绝”

  • 8

我正在尝试运行 BULK INSERT 但我收到拒绝访问错误。到目前为止,我已经尝试了以下方法:

  • 我可以从我的机器上打开文件
  • 我已使用 windows auth 登录到 SQL Server(已尝试 v2008 R2 和 v2016)
  • 我有系统管理员权限
  • 我可以type使用 xp_cmdshell 文件(使用 SQL 服务帐户,但它消除了它是防火墙的想法)
  • 路径是网络 URL 而不是本地驱动器

我正在使用的命令是这样的:

BULK INSERT ken_temp
FROM '\\network_path\temp\kdf\text_file.txt'
WITH
   (
    FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'
   ,ROWS_PER_BATCH = 50000
   ,MAXERRORS = 10
   )

有任何想法吗?

sql-server sql-server-2008-r2
  • 1 个回答
  • 17039 Views
Martin Hope
Kenneth Fisher
Asked: 2017-10-12 13:36:52 +0800 CST

用户 `dbo` 和 sys.databases 中存储的数据库的所有者有什么区别

  • 11

我们最近提出了一个问题,即dbo数据库中的用户与 in不sid匹配。我了解数据库的所有者与角色成员的不同之处,但我一直认为用户是数据库的实际所有者。不是这样吗?如果是这样,两者之间有什么真正的区别吗?owner_sidsys.databasesdb_ownerdbodbosys.databases

sql-server security
  • 1 个回答
  • 8233 Views
Martin Hope
Kenneth Fisher
Asked: 2017-06-02 11:27:42 +0800 CST

日志备份到 NUL 的可用性组

  • 2

我们目前有一个正在SIMPLE恢复的数据库,并计划建立一个Availability Group用于报告目的的数据库(Enterprise SQL 2016)。我的理解是,这将需要将数据库移动到FULL恢复状态。我们不需要日志备份,也没有兴趣存储它们,所以我正在考虑将日志备份设置到NUL(位桶)。我读过的任何内容都没有说我对此会有任何问题,但我想确保我没有遗漏任何东西。

availability-groups sql-server-2016
  • 2 个回答
  • 335 Views
Martin Hope
Kenneth Fisher
Asked: 2016-07-26 09:17:51 +0800 CST

为什么这个过滤后的索引不仅没有被使用,而且在我尝试强制使用它时出现错误[重复]

  • 4
这个问题在这里已经有了答案:
被 SQL Server 拒绝的过滤索引提示 1 个回答
6 年前关闭。

我正在尝试调整一个相当烦人的查询,其中许多表的内容如下所示:

date = '9999-12-31 23:59:59.9999999'

至少有几个表在 3 亿行范围内,当我过滤它时,我最终在 2 百万行范围内。尝试过滤索引似乎是合理的。

CREATE TABLE test (col1 int PRIMARY KEY, col2 int, col3 varchar(50), col4 datetime2(7), col5 int);
CREATE INDEX ix_filtered ON test(col2,col3) INCLUDE (col4) 
       WHERE col4 = '9999-12-31 23:59:59.9999999' ;
GO

SELECT col2,col3 FROM test 
WHERE col4 = '9999-12-31 23:59:59.9999999';
GO

但是,当我检查查询计划时,它不会使用索引。它只是进行了聚簇索引扫描和键查找。显然,在没有任何数据的情况下,这是有道理的,但即使使用我所有的数据,它也做了同样的事情。我懒得提供任何数据的原因是无论如何都会出现第二个问题。

当我试图强制索引查看查询计划时:

SELECT col2,col3 FROM test 
WITH (index (ix_filtered))
WHERE col4 = '9999-12-31 23:59:59.9999999'

我收到此错误:

由于此查询中定义的提示,消息 8622、级别 16、状态 1、第 52 行查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询。

我试图弄清楚为什么我会收到查询提示错误。我的猜测是,这个问题的答案也会告诉我为什么过滤索引根本没有被使用。

sql-server-2008-r2 filtered-index
  • 1 个回答
  • 423 Views
Martin Hope
Kenneth Fisher
Asked: 2016-07-06 14:09:36 +0800 CST

分区切换脚本的问题

  • 2

使用一些动态 SQL 来创建一个 13 个月的滚动分区表。 请参阅此处了解一些背景信息。

动态SQL部分很简单,第一个分区切换出来没有问题。不幸的是,当我到达第二个分区时,我开始收到此错误:

Msg 4972, Level 16, State 1, Line 16
ALTER TABLE SWITCH statement failed. Check constraints or partition function of source table 'DBName.dbo.TableName_Partition2' allows values that are not allowed by check constraints or partition function on target table 'DBName.dbo.TableName'.

我确定这很简单,但我不太明白。这是代码。

-- Existing structure
USE [SourceDB]
GO

CREATE TABLE [dbo].[SourceTable](
    [Col1] [bigint] NULL,
    [Col2] [int] NULL,
    [Col3] [int] NULL,
    [Col4] [int] NULL,
    [Col5] [int] NULL,
    [Col6] [money] NULL,
    [Modified] [datetime] NULL,
    [ModifiedBy] [varchar](50) NULL,
    [ModifiedType] [char](1) NULL
); 

CREATE CLUSTERED INDEX [SourceTable_Modified] ON [dbo].[SourceTable]
(   [Modified] ASC   )
GO

USE [DestinationDB]
GO

CREATE PARTITION FUNCTION [ThirteenMonthPartFunction](datetime) AS 
 RANGE RIGHT FOR VALUES 
    (   N'2015.08.01',
        N'2015.09.01',
        N'2015.10.01',
        N'2015.11.01',
        N'2015.12.01',
        N'2016.01.01',
        N'2016.02.01',
        N'2016.03.01',
        N'2016.04.01',
        N'2016.05.01',
        N'2016.06.01',
        N'2016.07.01',
        N'2016.08.01'
 );

CREATE PARTITION SCHEME [ThirteenMonthPartScheme] 
    AS PARTITION [ThirteenMonthPartFunction] ALL TO ([PRIMARY]);

CREATE TABLE [dbo].[DestinationTable](
    [Col1] [bigint] NULL,
    [Col2] [int] NULL,
    [Col3] [int] NULL,
    [Col4] [int] NULL,
    [Col5] [int] NULL,
    [Col6] [money] NULL,
    [Modified] [datetime] NULL,
    [ModifiedBy] [varchar](50) NULL,
    [ModifiedType] [char](1) NULL
) ON ThirteenMonthPartScheme (Modified);
GO

CREATE CLUSTERED INDEX [DestinationTable_Modified] ON [dbo].[DestinationTable]
(
    [Modified] ASC
) ON ThirteenMonthPartScheme (Modified);
GO

SELECT * 
    INTO [TableName_Partition2]
FROM SourceDB.dbo.[SourceTable]
WHERE Modified >= N'2015.08.01'
  AND Modified < N'2015.09.01';
GO

CREATE CLUSTERED INDEX [TableName_Modified]  
    ON [dbo].[TableName_Partition2] ([Modified] ASC);  
GO

ALTER TABLE [dbo].[TableName_Partition2] 
    ADD CONSTRAINT [CK_TableName_Partition2] 
    CHECK ([Modified] >= N'2015.08.01'
      AND  [Modified] < N'2015.09.01');
GO

ALTER TABLE [TableName_Partition2] 
    SWITCH TO [DestinationTable] PARTITION 2;
GO

DROP TABLE TableName_Partition2;
GO

我试过每个分区号,我试过将时间范围缩小到单个日期(即修改 = '2015.09.02'),但仍然出现相同的错误。我很难过。

谢谢你的帮助。

sql-server-2008-r2 partitioning
  • 1 个回答
  • 514 Views
Martin Hope
Kenneth Fisher
Asked: 2016-06-09 12:09:59 +0800 CST

什么是存档除当年之外的所有内容并同时对表进行分区的最佳方法

  • 24

任务

从一组大表中归档除滚动 13 个月之外的所有时间段。归档数据必须存储在另一个数据库中。

  • 数据库处于简单恢复模式
  • 这些表有 5000 万行到数十亿行,在某些情况下每个占用数百 GB。
  • 表当前未分区
  • 每个表在不断增加的日期列上都有一个聚集索引
  • 每个表还有一个非聚集索引
  • 对表的所有数据更改都是插入
  • 目标是最大程度地减少主数据库的停机时间。
  • 服务器是 2008 R2 Enterprise

“存档”表将有大约 11 亿行,“实时”表大约有 4 亿行。显然存档表会随着时间的推移而增加,但我希望实时表也会迅速增加。至少在未来几年内达到 50%。

我曾考虑过 Azure 延伸数据库,但不幸的是,我们处于 2008 R2 并且可能会在那里停留一段时间。

当前计划

  • 创建一个新数据库
  • 在新数据库中创建按月分区的新表(使用修改后的日期)。
  • 将最近 12-13 个月的数据移动到分区表中。
  • 对两个数据库进行重命名交换
  • 从现在的“存档”数据库中删除移动的数据。
  • 对“归档”数据库中的每个表进行分区。
  • 将来使用分区交换来归档数据。
    • 我确实意识到我必须换出要存档的数据,将该表复制到存档数据库,然后将其换入存档表。这是可以接受的。

问题: 我正在尝试将数据移动到初始分区表中(实际上我仍在对其进行概念验证)。我正在尝试使用 TF 610(根据Data Loading Performance Guide)和一个INSERT...SELECT声明来移动数据,最初认为它会被最小化记录。不幸的是,每次我尝试它都已完全记录。

在这一点上,我认为我最好的选择可能是使用 SSIS 包移动数据。我试图避免这种情况,因为我正在处理 200 个表以及我可以通过脚本执行的任何操作,我可以轻松地生成和运行。

我的总体计划中是否遗漏了什么,SSIS 是我快速移动数据并最大限度地减少日志使用(空间问题)的最佳选择吗?

没有数据的演示代码

-- Existing structure
USE [Audit]
GO

CREATE TABLE [dbo].[AuditTable](
    [Col1] [bigint] NULL,
    [Col2] [int] NULL,
    [Col3] [int] NULL,
    [Col4] [int] NULL,
    [Col5] [int] NULL,
    [Col6] [money] NULL,
    [Modified] [datetime] NULL,
    [ModifiedBy] [varchar](50) NULL,
    [ModifiedType] [char](1) NULL
); 
-- ~1.4 bill rows, ~20% in the last year

CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
(   [Modified] ASC   )
GO


-- New DB & Code
USE Audit_New
GO

CREATE PARTITION FUNCTION ThirteenMonthPartFunction (datetime)
AS RANGE RIGHT FOR VALUES ('20150701', '20150801', '20150901', '20151001', '20151101', '20151201', 
                            '20160101', '20160201', '20160301', '20160401', '20160501', '20160601', 
                            '20160701') 

CREATE PARTITION SCHEME ThirteenMonthPartScheme AS PARTITION ThirteenMonthPartFunction
ALL TO ( [PRIMARY] );

CREATE TABLE [dbo].[AuditTable](
    [Col1] [bigint] NULL,
    [Col2] [int] NULL,
    [Col3] [int] NULL,
    [Col4] [int] NULL,
    [Col5] [int] NULL,
    [Col6] [money] NULL,
    [Modified] [datetime] NULL,
    [ModifiedBy] [varchar](50) NULL,
    [ModifiedType] [char](1) NULL
) ON ThirteenMonthPartScheme (Modified)
GO

CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
(
    [Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO

CREATE NONCLUSTERED INDEX [AuditTable_Col1_Col2_Col3_Col4_Modified] ON [dbo].[AuditTable]
(
    [Col1] ASC,
    [Col2] ASC,
    [Col3] ASC,
    [Col4] ASC,
    [Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO

移动代码

USE Audit_New
GO
DBCC TRACEON(610);

INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified
sql-server sql-server-2008-r2
  • 3 个回答
  • 9160 Views
Martin Hope
Kenneth Fisher
Asked: 2016-04-30 12:50:04 +0800 CST

有条件地向临时表添加索引

  • 5

我有一个看起来像这样的存储过程:

SELECT columnlist
INTO #temptable
FROM Table
JOIN lotsofothertables
WHERE severalconditions

UPDATE anothertable
SET column = #temptable.column
FROM anothertable 
JOIN #temptable
    ON anothertable.PKColumn = #temptable.PKColumn

初始查询通常只会生成几列 (<100),因此更新速度很快。但偶尔(这些是我们遇到问题的运行)它会产生 1000 甚至 10,000。在它们之间添加这样的东西是否合理?

IF @@RowCount > 100
   CREATE INDEX ix_temp ON #temptable(PKColumn)

还是我最好只在表上创建索引,因为行数很少,创建索引所花费的时间会相当少?

sql-server index
  • 1 个回答
  • 512 Views
Martin Hope
Kenneth Fisher
Asked: 2016-04-02 08:14:17 +0800 CST

用户 DEFAULT_SCHEMA 如何设置为“dbo”以外的其他内容

  • 6

SQL Server 用户的设置之一是DEFAULT_SCHEMA. 这经常发生dbo,但并非总是如此。我意识到您可以使用以下代码更改设置:

ALTER USER [UserName] WITH DEFAULT_SCHEMA = [SchemaName]

据我所知,每当我创建 aUSER并且不指定DEFAULT_SCHEMA它使用的 a 时dbo。但我仍然发现USERS它具有不同的默认架构。

如果我没记错的话,当您有一个从 SQL 2000 升级的实例时,默认架构是与用户名匹配的架构。我猜这就是我所看到的大部分(如果不是全部)的来源。

有没有其他方法可以在USER不指定的情况下创建 aDEFAULT_SCHEMA并使用除 之外的其他内容创建它dbo?

注意:这适用于 SQL Server 2005 及更高版本。

sql-server schema
  • 2 个回答
  • 4953 Views
Martin Hope
Kenneth Fisher
Asked: 2016-01-29 10:40:44 +0800 CST

为什么添加 TOP 1 会显着降低性能?

  • 41

我有一个相当简单的查询

SELECT TOP 1 dc.DOCUMENT_ID,
        dc.COPIES,
        dc.REQUESTOR,
        dc.D_ID,
        cj.FILE_NUMBER
FROM DOCUMENT_QUEUE dc
JOIN CORRESPONDENCE_JOURNAL cj
    ON dc.DOCUMENT_ID = cj.DOCUMENT_ID
WHERE dc.QUEUE_DATE <= GETDATE()
  AND dc.PRINT_LOCATION = 2
ORDER BY cj.FILE_NUMBER

这给了我可怕的表现(就像从不费心等待它完成一样)。查询计划如下所示:

在此处输入图像描述

但是,如果我删除它,TOP 1我会得到一个看起来像这样的计划,它会在 1-2 秒内运行:

在此处输入图像描述

正确的 PK 和索引如下。

更改查询计划这一事实TOP 1并不让我感到惊讶,我只是有点惊讶它使它变得更糟。

注意:我已经阅读了这篇文章的结果并理解了 aRow Goal等的概念。我很好奇的是如何更改查询以便它使用更好的计划。目前我正在将数据转储到临时表中,然后将第一行从中拉出。我想知道是否有更好的方法。

编辑对于事后阅读本文的人来说,这里有一些额外的信息。

  • Document_Queue - PK/CI 是 D_ID,它有大约 5k 行。
  • Correspondence_Journal - PK/CI 是 FILE_NUMBER、CORRESPONDENCE_ID,它有大约 140 万行。

当我开始时没有其他索引。我最终在 Correspondence_Journal (Document_Id, File_Number) 上找到了一个

sql-server sql-server-2008-r2
  • 6 个回答
  • 12138 Views
Martin Hope
Kenneth Fisher
Asked: 2015-12-02 14:53:41 +0800 CST

在 SSIS 包中创建事务时出现问题

  • 13

我正在开发一个需要使用事务的包,但目前出现以下错误:

SSIS package "CATS-Package.dtsx" starting.
Information: 0x4004300A at Data Flow Task, SSIS.Pipeline: Validation phase is beginning.
Information: 0x4001100A at CATS-Package: Starting distributed transaction for this container.
Error: 0xC001401A at CATS-Package: The SSIS Runtime has failed to start the distributed transaction due to error 0x8004D01B "The Transaction Manager is not available.". The DTC transaction failed to start. This could occur because the MSDTC Service is not running.
SSIS package "CATS-Package.dtsx" finished: Failure.

到目前为止,这是我所知道的:

  • 2012 包
  • 我正在包部署中运行
  • TransactionOption 属性设置为必需
  • 针对 2008 R2 实例运行
  • 我可以在实例上手动创建分布式事务,并根据事件查看器 MSDTC 正在运行。
  • MSDTC 有以下设置

在此处输入图像描述

任何人都可以指出一个方向以找到更多信息。

编辑:我读到的步骤之一是在运行包的本地机器以及持有实例的服务器上运行 DTC。一旦我这样做了,我得到了一个新的错误:

Information: 0x4001100A at CATS-Package: Starting distributed transaction for this container.
Error: 0xC001402C at CATS-Package, Connection manager "connectionName": The SSIS Runtime has failed to enlist the OLE DB connection in a distributed transaction with error 0x8004D024 "The transaction manager has disabled its support for remote/network transactions.".
Error: 0xC0202009 at CATS-Package, Connection manager "connectionName": SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x8004D024.
Error: 0xC00291EC at Execute SQL Task - Max Product ID, Execute SQL Task: Failed to acquire connection "connectionName". Connection may not be configured correctly or you may not have the right permissions on this connection.

重要的部分The transaction manager has disabled its support for remote/network transactions. 是我在权限中遗漏了什么吗?注意:Allow Remote Clients也已检查。

我已经看到提到的 MSDTC ping(包括在下面的评论中),但是当我查看它时,我不太确定如何处理它。

sql-server sql-server-2008-r2
  • 1 个回答
  • 8371 Views
Martin Hope
Kenneth Fisher
Asked: 2015-09-09 10:38:55 +0800 CST

托管 SQL Server 的 VM 上的专用资源

  • 8

我的理解是,使用 VM 的一大好处是您可以在主机上的虚拟机之间共享资源。因此,您可以拥有一台具有 120 个 CPU 的主机,并在其上放置 5 个虚拟机,每个虚拟机具有 32 个 CPU。额外的 CPU 在 VM 之间“共享”,主机根据需要动态分配 CPU。内存也一样。

我也明白这对于容纳 SQL Server 的 VM 来说是一个很大的禁忌,但我的 VM 管理员不同意。有没有人有任何证据或文件?

我不知道这是否重要,但我们正在使用 VMWare。

sql-server virtualisation
  • 3 个回答
  • 1407 Views
Martin Hope
Kenneth Fisher
Asked: 2015-07-09 09:14:38 +0800 CST

尝试强制使用过滤索引时出现问题

  • 3

我昨天试图对过滤索引进行一些测试并创建了一个相当简单的情况:

CREATE TABLE IndexTest 
(
    ID INT NOT NULL IDENTITY(1,1) CONSTRAINT pk_IndexTest PRIMARY KEY, 
    Col1 CHAR(1)
)
GO

CREATE INDEX ix_IndexTest ON IndexTest(Col1)
WHERE Col1 IS NOT NULL
GO

INSERT INTO IndexTest VALUES ('A'),('B'),('C'),('D')
INSERT INTO IndexTest VALUES (''),(''),(''),('')
INSERT INTO IndexTest VALUES (NULL),(NULL),(NULL),(NULL)
GO

然后我尝试使用提示运行以下查询以强制它使用过滤索引。

SELECT * 
FROM IndexTest WITH (INDEX(ix_IndexTest))
GO

但我不断收到错误:

由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询。

如果我删除过滤器而不是它,它会起作用。我什至尝试以各种方式更改过滤器,例如WHERE Col1 = ''等。每当我有过滤器时,我都会收到该错误。谁能告诉我为什么?难道我做错了什么?

我在 SQL Server 2012 和 2014 实例上进行了尝试,并在此处创建了它的 sqlfiddle:

http://www.sqlfiddle.com/#!6/4a850/1

编辑:不确定这是否重要,但具体来说,我想看看我是否能看到索引实际包含了哪些行。这个想法来自于看到有人使用这种技术从损坏的表中恢复数据(使用未过滤的索引)。

sql-server hints
  • 1 个回答
  • 443 Views
Martin Hope
Kenneth Fisher
Asked: 2015-05-20 14:52:02 +0800 CST

将 TDE 数据库移动到新数据库但证书有问题

  • 5

这是我第一次使用 TDE,所以希望我没有做任何可怕的错误。

我正在尝试将我的 TDE 数据库从一台服务器移动到另一台服务器。我在新服务器的主数据库上创建了一个主密钥。然后我使用以下命令从备份中恢复我的证书:

CREATE CERTIFICATE MyServerCert
FROM FILE = 'CertBackupFile'

当我最初创建它时,我没有私人加密密钥,所以我只是用密码加密它。

现在,当我尝试恢复 TDE 的备份时,出现以下错误

Msg 15507, Level 16, State 1, Line 2
A key required by this operation appears to be corrupted.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

我试过查看 create 语句,但看不到可以输入原始密码的位置。此外,当我查看原始服务器上的 sys.certificates 时,pvt_key_encryption_type_desc = ENCRYPTED_BY_MASTER_KEY 但在新服务器上显示 NO_PRIVATE_KEY。所以我假设我在创建时做错了什么。

谁能指出我正确的方向来解决这个问题?

sql-server-2008-r2 transparent-data-encryption
  • 1 个回答
  • 584 Views
Martin Hope
Kenneth Fisher
Asked: 2015-03-17 20:49:15 +0800 CST

unicode 字符模式匹配问题

  • 7

我正在编写一段在 unicode 字符上使用模式匹配的代码,但我遇到了一个奇怪的问题。有些角色有效,有些则无效。

DECLARE @Pattern nvarchar(50) = N'%[^a-z]%' -- Simple pattern
SELECT PatIndex(@Pattern, nchar(46797)), nchar(46797) -- Works
SELECT PatIndex(@Pattern, nchar(14843)), nchar(14843) -- Doesn't Work

该模式应该适用于任何不是 az 的字符,但由于某种原因它没有捕获某些字符。有谁知道为什么有些 unicode 字符会匹配而有些则不会?

sql-server sql-server-2014
  • 1 个回答
  • 1147 Views
Martin Hope
Kenneth Fisher
Asked: 2015-01-24 09:27:50 +0800 CST

对 sys.dm_io_virtual_file_stats num_of_reads/writes 列感到困惑

  • 3

我正在尝试使用 sys.dm_io_virtual_file_stats DMF 在我的许多服务器上生成所以 IO 等待信息。我遇到了 Paul Randall 的这篇文章:http ://www.sqlskills.com/blogs/paul/survey-tempdb-and-transaction-log-io-latencies/ 。在其中,他要求人们用这个查询的结果来回应:

SELECT
    [database_id],
    [file_id],
    [ReadLatency] =
        CASE WHEN [num_of_reads] = 0
            THEN 0 ELSE ([io_stall_read_ms] / [num_of_reads]) END,
    [WriteLatency] =
        CASE WHEN [num_of_writes] = 0
            THEN 0 ELSE ([io_stall_write_ms] / [num_of_writes]) END
FROM
    sys.dm_io_virtual_file_stats (NULL, NULL)
WHERE
    [file_id] = 2 OR [database_id] = 2;
GO

我的问题是他为什么要使用io_stall_read_ms / num_of_reads而不是io_stall_read_ms / num_of_bytes_read为了获得平均值。我认为 ms/byte 会比 ms/read 提供更多信息。这至少在一定程度上让我相信我不明白 num_of_reads/writes 列实际代表什么。

BOL 只是说

对文件发出的读取次数。

这对我帮助不大。我会很感激我能得到的任何澄清。

sql-server waits
  • 1 个回答
  • 1602 Views
Martin Hope
Kenneth Fisher
Asked: 2014-09-16 12:58:35 +0800 CST

您可以将 COUNT DISTINCT 与 OVER 子句一起使用吗?

  • 28

我正在尝试提高以下查询的性能:

        UPDATE  [#TempTable]
        SET     Received = r.Number
        FROM    [#TempTable] 
        INNER JOIN (SELECT  AgentID,
                            RuleID,
                            COUNT(DISTINCT (GroupId)) Number
                    FROM    [#TempTable]
                    WHERE   Passed = 1
                    GROUP BY AgentID,
                            RuleID
                   ) r ON r.RuleID = [#TempTable].RuleID AND
                          r.AgentID = [#TempTable].AgentID                            

目前使用我的测试数据大约需要一分钟。我对该查询所在的所有存储过程的更改输入有限,但我可能可以让他们修改这个查询。或者添加索引。我尝试添加以下索引:

CREATE CLUSTERED INDEX ix_test ON #TempTable(AgentID, RuleId, GroupId, Passed)

它实际上使查询花费的时间增加了一倍。我使用非聚集索引获得了相同的效果。

我尝试如下重写它,但没有任何效果。

        WITH r AS (SELECT  AgentID,
                            RuleID,
                            COUNT(DISTINCT (GroupId)) Number
                    FROM    [#TempTable]
                    WHERE   Passed = 1
                    GROUP BY AgentID,
                            RuleID
            ) 
        UPDATE  [#TempTable]
        SET     Received = r.Number
        FROM    [#TempTable] 
        INNER JOIN r 
            ON r.RuleID = [#TempTable].RuleID AND
               r.AgentID = [#TempTable].AgentID                            

接下来我尝试使用这样的窗口函数。

        UPDATE  [#TempTable]
        SET     Received = COUNT(DISTINCT (CASE WHEN Passed=1 THEN GroupId ELSE NULL END)) 
                    OVER (PARTITION BY AgentId, RuleId)
        FROM    [#TempTable] 

此时我开始收到错误

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'distinct'.

所以我有两个问题。首先你不能用 OVER 子句做一个 COUNT DISTINCT 还是我写错了?其次,任何人都可以提出我尚未尝试过的改进建议吗?仅供参考,这是一个 SQL Server 2008 R2 Enterprise 实例。

编辑:这是原始执行计划的链接。我还应该注意,我的大问题是这个查询运行了 30-50 次。

https://onedrive.live.com/redir?resid=4C359AF42063BD98%21772

EDIT2:这是评论中要求的语句所在的完整循环。我正在与定期与此一起工作的人核实循环的目的。

DECLARE @Counting INT              
SELECT  @Counting = 1              

--  BEGIN:  Cascading Rule check --           
WHILE @Counting <= 30              
    BEGIN      

        UPDATE  w1
        SET     Passed = 1
        FROM    [#TempTable] w1,
                [#TempTable] w3
        WHERE   w3.AgentID = w1.AgentID AND
                w3.RuleID = w1.CascadeRuleID AND
                w3.RulePassed = 1 AND
                w1.Passed = 0 AND
                w1.NotFlag = 0      

        UPDATE  w1
        SET     Passed = 1
        FROM    [#TempTable] w1,
                [#TempTable] w3
        WHERE   w3.AgentID = w1.AgentID AND
                w3.RuleID = w1.CascadeRuleID AND
                w3.RulePassed = 0 AND
                w1.Passed = 0 AND
                w1.NotFlag = 1        

        UPDATE  [#TempTable]
        SET     Received = r.Number
        FROM    [#TempTable] 
        INNER JOIN (SELECT  AgentID,
                            RuleID,
                            COUNT(DISTINCT (GroupID)) Number
                    FROM    [#TempTable]
                    WHERE   Passed = 1
                    GROUP BY AgentID,
                            RuleID
                   ) r ON r.RuleID = [#TempTable].RuleID AND
                          r.AgentID = [#TempTable].AgentID                            

        UPDATE  [#TempTable]
        SET     RulePassed = 1
        WHERE   TotalNeeded = Received              

        SELECT  @Counting = @Counting + 1              
    END
sql-server sql-server-2008-r2
  • 2 个回答
  • 38422 Views
Martin Hope
Kenneth Fisher
Asked: 2014-05-21 11:20:01 +0800 CST

为什么我的新索引/表没有在我指定的文件组上创建?

  • 4

来自@@Version 的结果

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) 
Sep 21 2011 22:45:45 
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

这是数据库定义

CREATE DATABASE [Scratch] ON  PRIMARY 
( NAME = N'Scratch_mdf', FILENAME = N'N:\MSSQL\TEST\Primary\Scratch_mdf.mdf' , SIZE = 17664KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%), 
 FILEGROUP [DATA]  DEFAULT 
( NAME = N'Scratch_dat1a', FILENAME = N'N:\MSSQL\TEST\Data\Scratch_dat1a.ndf' , SIZE = 14539584KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%), 
( NAME = N'Scratch_dat1b', FILENAME = N'N:\MSSQL\TEST\Data\Scratch_dat1b.ndf' , SIZE = 12016128KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%), 
 FILEGROUP [INDEX] 
( NAME = N'Scratch_idx1', FILENAME = N'N:\MSSQL\TEST\Index\Scratch_idx1.ndf' , SIZE = 92864KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%), 
( NAME = N'Scratch_idx2', FILENAME = N'N:\MSSQL\TEST\Index\Scratch_idx2.ndf' , SIZE = 84416KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%), 
( NAME = N'Scratch_idx3', FILENAME = N'N:\MSSQL\TEST\Index\Scratch_idx3.ndf' , SIZE = 84416KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%), 
( NAME = N'Scratch_idx4', FILENAME = N'N:\MSSQL\TEST\Index\Scratch_idx4.ndf' , SIZE = 92864KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%), 
 FILEGROUP [PM_G0] 
( NAME = N'PM_data0', FILENAME = N'N:\MSSQL\PDB1\Data\PM_data0.ndf' , SIZE = 768000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)
 LOG ON 
( NAME = N'Scratch_log1', FILENAME = N'N:\MSSQL\TEST\Log\Scratch_log1.ldf' , SIZE = 833024KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%) 
GO

ALTER DATABASE [Scratch] SET COMPATIBILITY_LEVEL = 100
GO

下面是创建表和添加聚簇索引的代码。在这两种情况下,我都指定了文件组 PM_G0,但是当我在文件组 DATA 上检查它时。

CREATE TABLE Scratch.dbo.STUPID_TEST (dummycol int) ON [PM_G0];
CREATE CLUSTERED INDEX ix_test ON stupid_test(dummycol) ON PM_G0; 
-- Tried the filegroup name with/without brackets just in case

我正在检查第一个堆的位置,然后使用此查询检查聚集索引:

SELECT o.name objectname, fg.name filegroupname, sdf.name as datafile,i.name indexname, partition_id, partition_number, [rows]
FROM sys.partitions p
INNER JOIN sys.objects o ON o.object_id=p.object_id
INNER JOIN sys.tables t ON o.object_id = t.object_id
INNER JOIN sys.indexes i ON i.object_id=p.object_id and p.index_id=i.index_id
INNER JOIN sys.filegroups fg ON fg.data_space_id = i.data_space_id
INNER JOIN sys.database_files sdf ON sdf.data_space_id=fg.data_space_id
WHERE o.name = 'STUPID_TEST'

有趣的测试。我将默认文件组更改为 [index]。确认 [index] 实际上是 sys.filegroups 中的默认索引,然后删除并重新创建我的聚集索引,它仍然转到 [DATA] 文件组。下面的代码

ALTER DATABASE Scratch MODIFY FILEGROUP [index] DEFAULT;
GO
DROP INDEX dbo.STUPID_TEST.IX_test;
CREATE CLUSTERED INDEX ix_test ON stupid_test(dummycol) ON [PM_G0];
GO
sql-server sql-server-2008
  • 1 个回答
  • 1236 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve