运行DBCC CHECKDB (dbname) WITH NO_INFOMSGS, ALL_ERRORMSGS结果出现此错误:
表错误:对象 ID 813245952、索引 ID 1、分区 ID 72057594073972736、分配单元 ID 72057594083213312(类型行内数据)的多个 IAM 页包含相同间隔的分配。IAM 页面 (1:4611577) 和 (1:2040821)。CHECKDB 在表“tablename”(对象 ID 813245952)中发现 1 个分配错误和 0 个一致性错误。CHECKDB 在数据库“dbname”中发现 1 个分配错误和 0 个一致性错误。Repair_allow_data_loss 是 DBCC CHECKDB (dbname) 发现的错误的最低修复级别。
有没有人以前遇到过这个问题并有修复的解决方案?
注意:- 我还没有运行该语句repair_allow_data_loss。
我在创建 tempDB 文件时遇到以下 sql server 错误。有任何想法吗?
连接已断开且无法恢复。客户端驱动程序尝试恢复连接一次或多次,但所有尝试均失败。增加 ConnectRetryCount 的值可增加恢复尝试的次数。(微软 SQL Server,错误:0)
我在 GP 表上有一个触发器,用于记录关键字段何时更改以及谁更改了它。下面是触发器的示例。
CREATE TRIGGER [dbo].[TRACKAPP_UPDATE] ON [dbo].[Table]
AFTER UPDATE
AS
DECLARE @MDFUSRID char(15)
DECLARE @SOPNUMBE char(32)
DECLARE @DOCSTATUS INT
BEGIN
BEGIN
IF UPDATE(DOCSTATUS)
BEGIN
SELECT @MDFUSRID = SESSION_USER
SELECT @SOPNUMBE = SOPNUMBE FROM inserted
SELECT @DOCSTATUS = DOCSTATUS FROM INSERTED
Run Code Online (Sandbox Code Playgroud)
在 99% 的情况下,这会返回更改该字段的用户的正确名称。如果任何 ERP 人员更改了某个字段(包括我自己),用户就会显示 dbo。我一直认为这是一个访问问题。然而,我们发现一些用户也以 dbo 而不是他们的名字返回。
您对我应该从哪里开始寻找有什么建议吗?
从SQL Server 2008 开始的From 子句文档简要提到了 3 个连接提示及其基本机制:
然而,似乎没有太多关于何时可能需要使用它们的信息。
似乎它们可以与散列、循环和合并结合使用,这些已经被理解为这个问题的目的。
文档中的相关部分:
对于 SQL 数据仓库和并行数据仓库,这些联接提示适用于两个分布不兼容的列上的 INNER 联接。它们可以通过限制查询处理期间发生的数据移动量来提高查询性能。SQL 数据仓库和并行数据仓库的允许连接提示如下:
REDUCE
减少要为联接右侧的表移动的行数,以使两个分布不兼容的表兼容。REDUCE 提示也称为半连接提示。REPLICATE
将连接左侧表的连接列中的值复制到所有节点。右侧的表连接到这些列的复制版本。REDISTRIBUTE
强制将两个数据源分布在 JOIN 子句中指定的列上。对于分布式表,Parallel Data Warehouse 会执行shuffle move。对于复制表,并行数据仓库将执行修剪移动。要了解这些移动类型,请参阅并行数据仓库产品文档中“了解查询计划”主题中的“DMS 查询计划操作”部分。当查询计划使用广播移动来解决分发不兼容的连接时,此提示可以提高性能。
join sql-server hints sql-server-pdw azure-sql-data-warehouse
由于语法和回滚事务,我的最终更新语句应该出错,预期的错误应该类似于:
消息 207,级别 16,状态 1,第 45 行无效的列名称“FakeTest1”
我很好奇当允许执行引用不存在的列的子查询时,为什么 SQL Server 更新列中的每一行。
我正在创建一个包含两列的临时表,FakeID并且FakeVarchar.
SELECT [FakeID], [FakeVarchar]
INTO [#T]
FROM [CTE];
Run Code Online (Sandbox Code Playgroud)
当我的UPDATE语句使用此WHERE子句在 中指定列 [ID] 时SELECT SUBQUERY,它会更新整个表,而不是在解析命令时出错。
WHERE [FakeTableDestination].[ID] IN
(
SELECT [ID]
FROM [#T]
);
Run Code Online (Sandbox Code Playgroud)
应该在子查询中以使其正确运行的列将是FakeID. 此语句显然有效,并且按预期更新。
WHERE [FakeTableDestination].[ID] IN
(
SELECT [FakeID]
FROM [#T]
);
Run Code Online (Sandbox Code Playgroud)
当我用任何其他列名替换 FakeID / ID 时,它会按预期失败。
WHERE [FakeTableDestination].[ID] IN
(
SELECT [NotActuallyAColumnInThisTableEither]
FROM [#T]
);
Run Code Online (Sandbox Code Playgroud)
IF OBJECT_ID('dbo.FakeTableSource', 'U') IS NOT …Run Code Online (Sandbox Code Playgroud) IN过滤器可以处理的内容有没有限制?例如:
SELECT Name
FROM People
WHERE Job IN (All the values goes here)
Run Code Online (Sandbox Code Playgroud)
IN 的Microsoft 文档说:
“在括号内显式包含大量值(以逗号分隔的数千个值),在 IN 子句中会消耗资源并返回错误 8623 或 8632。要解决此问题,请将 IN 列表中的项目存储在一个表,并在 IN 子句中使用 SELECT 子查询。”
但是否有任何确切或近似的数字
数以千计的值
我正在寻找一些帮助。我有一个针对相当大的表(200 万条记录)运行的查询。
我一直在努力让索引有效地工作。还有一些针对此表的其他查询,但这是迄今为止最常见的查询。我很难让它在 1 秒内执行,并且经常看到它使用分析器在 3 到 5 秒内运行。
它可能会尽可能快,但我希望得到一些输入来确认/拒绝。
请注意:开发人员根本不会更改查询或架构。只能在数据库中进行优化,不能更改架构。
桌子:
CREATE TABLE [dbo].[Notifications](
[ntID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[NotificationID] [int] NOT NULL,
[NotificationType] [nvarchar](50) NOT NULL,
[UserName] [nvarchar](50) NULL,
[CreatedBy] [nvarchar](50) NULL,
[CreatedOn] [datetime] NULL,
[Status] [nvarchar](50) NOT NULL,
[Result] [nvarchar](50) NULL,
[Extension] [nvarchar](50) NULL,
[ShiftRate] [nvarchar](255) NULL,
[ResponseMinutes] [int] NULL,
[ResponseWindow] [datetime] NULL,
[caNotificationID] [int] NULL,
[AwardedBy] [nvarchar](50) NULL,
[AwardedOn] [datetime] NULL,
[CancelledBy] [nvarchar](50) NULL,
[CancelledOn] [datetime] NULL,
[CancelledReasonID] [int] NULL,
[CancelledReasonText] [nvarchar](255) NULL, …Run Code Online (Sandbox Code Playgroud) index sql-server index-tuning nonclustered-index sql-server-2016
我们的客户安装 CU25 后,存储过程 sp_pkeys 出现问题。如果主键有多个列,它现在可能会返回错误的顺序。
可以在代码本身中找到它。这是 2017 款 CU25 变体:
create procedure sys.sp_pkeys
(
@table_name sysname,
@table_owner sysname = null,
@table_qualifier sysname = null
)
as
declare @table_id int
-- quotename() returns up to 258 chars
declare @full_table_name nvarchar(517) -- 258 + 1 + 258
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin -- If qualifier doesn't match current database
raiserror (15250, -1,-1)
return
end
end
if @table_owner is null
begin -- If unqualified table name
select …Run Code Online (Sandbox Code Playgroud) 我们正在为一位客户运行 SQL Server 2019 CU12。不久前,我们开始遇到有线死锁,即单个进程在访问表变量时自身陷入死锁。
死锁报告示例
<deadlock>
<victim-list>
<victimProcess id="process2ae9f9f7468" />
</victim-list>
<process-list>
<process id="process2ae9f9f7468" taskpriority="0" logused="0" waitresource="OBJECT: 2:-1194094756:0 " waittime="110" ownerId="6978622122" transactionname="GetInitializedIMA" lasttranstarted="2021-09-15T21:46:44.243" XDES="0x2b4d9477be8" lockMode="Sch-S" schedulerid="3" kpid="10868" status="suspended" spid="102" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2021-09-15T21:46:44.113" lastbatchcompleted="2021-09-15T21:46:44.113" lastattention="2021-09-15T21:46:15.777" clientapp=".Net SqlClient Data Provider" hostname="removed" hostpid="15900" loginname="removed" isolationlevel="read committed (2)" xactid="6978622078" currentdb="15" currentdbname="MigrationSubjects" lockTimeout="4294967295" clientoption1="673187936" clientoption2="128056">
<executionStack>
<frame procname="unknown" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">unknown</frame>
</executionStack>
<inputbuf>
(@Ids [SubjectRegistry.Consolidation.IdTable] READONLY)
DELETE [reg].[HistoricalCompanyInfo] FROM [reg].[HistoricalCompanyInfo] t
INNER JOIN @Ids ids ON ids.Id = t.HistoricalCompanyInfoId
</inputbuf>
</process>
</process-list>
<resource-list>
<objectlock …Run Code Online (Sandbox Code Playgroud) 我有一个包含大量数据(近 1500 万)且结构如下的表。
create table test
(a int,--> /* There is a normal index on this column */
b int,
<other columns>)
Run Code Online (Sandbox Code Playgroud)
有一个从此表中进行选择的查询,其中 where 子句中的条件之一是:
where a!=1 or (a=1 and b!=0) /* The original condition */
Run Code Online (Sandbox Code Playgroud)
查询非常慢,我认为这种糟糕的性能大部分可能是由于逻辑运算符使用不当造成的。我已经改变了条件,如下所示:
where not (a=1 and b=0) /* The edited version*/
Run Code Online (Sandbox Code Playgroud)
并且性能发生了巨大的变化!我需要确定的是这两个条件完全相同,这样我就不会错过任何数据。我想知道您是否可以帮助我解决这个问题并告诉我您是否有更好的选择来治疗这种情况。
如果您知道任何有关逻辑运算的正确使用以及/顺序优化器处理它们的方式的文章,请分享链接。
提前致谢
sql-server ×10
t-sql ×2
connectivity ×1
corruption ×1
deadlock ×1
hints ×1
index ×1
index-tuning ×1
join ×1
permissions ×1
query ×1
security ×1
tempdb ×1
trigger ×1
update ×1