标签: sql-server

为什么简单的 ALTER TABLE 命令在带有全文索引的表上花费这么长时间?

我有一个大型(约 6700 万行)名称-值表,该表在DataValue列上具有全文索引。

如果我尝试运行以下命令:

ALTER TABLE VisitorData ADD NumericValue bit DEFAULT 0 NOT NULL;
Run Code Online (Sandbox Code Playgroud)

它运行了 1 小时 10 分钟,但仍然无法在VisitorData包含约 6700 万行的表上完成。

  1. 为什么这需要这么长时间而没有完成?
  2. 我该怎么办?

以下是有关该表的更多详细信息:

CREATE TABLE [dbo].[VisitorData](
            [VisitorID] [int] NOT NULL,
            [DataName] [varchar](80) NOT NULL,
            [DataValue] [nvarchar](3800) NOT NULL,
            [EncryptedDataValue] [varbinary](max) NULL,
            [VisitorDataID] [int] IDENTITY(1,1) NOT NULL, 
CONSTRAINT [PK_VisitorData_VisitorDataID] PRIMARY KEY CLUSTERED (
            [VisitorDataID] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY], 
CONSTRAINT [UNQ_VisitorData_VisitorId_DataName] …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server alter-table

15
推荐指数
2
解决办法
5万
查看次数

缩小事务日志是否可以在实时数据库上执行?

在Microsoft SQL Server 2005中,缩小在线数据库的日志文件是否可以,否则会导致服务中断?

sql-server-2005 sql-server

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

为什么要在存储过程中避免使用动态 SQL?

我听说它说您不想使用动态 SQL。你能给我一些具体的或现实生活中的例子吗?

就个人而言,我在我的数据库中多次使用它进行编码。我认为这是可以的,因为它的灵活性。

我的猜测是关于 SQL 注入或性能。还要别的吗?

sql-server stored-procedures dynamic-sql

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

将数据从 Oracle 移动到 SQL Server 的最简单方法是什么?

我们的一款产品同时支持 Oracle 和 SQL Server 作为数据库后端。我们有一位客户希望从 Oracle 后端切换到 Microsoft SQL Server,这对我们来说不是典型的过渡。

将整个 Oracle Schema 中的所有数据获取到 SQL Server 数据库中的最简单方法是什么?

模式只包含普通的旧表,没有什么花哨的。可能有一两个存储过程,我们手动迁移不会有问题。

我可以使用 Oracle 的 SQLDeveloper 将表数据导出为CREATEINSERT语句,但这些与 SQL Server 上使用的语法不匹配,我不希望手动修复语法错误。

oracle sql-server migration syntax

15
推荐指数
2
解决办法
9万
查看次数

断开网络会停止查询吗?

我最近对 ​​100,000 条记录执行了更新查询。我意识到我在查询运行时犯了一个错误,并迅速拔掉了网络电缆。

是否更新查询

  1. 停止处理并完全回滚?
  2. 继续处理完成并提交?
  3. 停止处理并只保留部分目标行更新?

sql-server network

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

sp_send_dbmail 存储过程随附件发送

我的任务是为我的一位客户发送一份小型月度报告。该报告以前在实例上手动运行,输出复制到电子表格并作为附件发送给客户。

我正在寻找一个更永久的解决方案,所以我打算使用 sp_send_dbmail存储过程来运行查询并将其作为附件发送。

一切正常,但消息的格式。最初我尝试将输出附加为带有 a 的 CSV 文件,@query_result_seperator = ','但结果无处不在!

当我正常运行报告时,输出在 SQL 中看起来不错。但是将其作为 CSV 发送或仅在消息正文中发送则不然。

我认为如果我将输出导出为 HTML 并作为附件/或 XML 发送它可能会更好,但我不知道如何执行此操作。

有没有人有什么建议?

提前致谢!

xml sql-server stored-procedures database-mail

15
推荐指数
2
解决办法
7万
查看次数

sp_cursoropen 和并行性

我遇到了一个查询的性能问题,我似乎无法理解。

我从游标定义中提取了查询。

此查询需要几秒钟才能执行

SELECT A.JOBTYPE
FROM PRODROUTEJOB A
WHERE ((A.DATAAREAID=N'IW')
AND ((A.CALCTIMEHOURS<>0)
AND (A.JOBTYPE<>3)))
AND EXISTS (SELECT 'X'
FROM PRODROUTE B
WHERE ((B.DATAAREAID=N'IW')
AND (((((B.PRODID=A.PRODID)
AND ((B.PROPERTYID=N'PR1526157') OR (B.PRODID=N'PR1526157')))
AND (B.OPRNUM=A.OPRNUM))
AND (B.OPRPRIORITY=A.OPRPRIORITY))
AND (B.OPRID=N'GRIJZEN')))
AND NOT EXISTS (SELECT 'X'
FROM ADUSHOPFLOORROUTE C
WHERE ((C.DATAAREAID=N'IW')
AND ((((((C.WRKCTRID=A.WRKCTRID)
AND (C.PRODID=B.PRODID))
AND (C.OPRID=B.OPRID))
AND (C.JOBTYPE=A.JOBTYPE))
AND (C.FROMDATE>{TS '1900-01-01 00:00:00.000'}))
AND ((C.TODATE={TS '1900-01-01 00:00:00.000'}))))))
GROUP BY A.JOBTYPE
ORDER BY A.JOBTYPE
Run Code Online (Sandbox Code Playgroud)

实际的执行计划是这样的。

在此处输入图片说明

注意到服务器范围的设置被设置为 MaxDOP 1,我尝试使用 maxdop 设置。

添加OPTION (MAXDOP 0)到查询或更改服务器设置会导致更好的性能和此查询计划。

在此处输入图片说明

但是,有问题的应用程序(Dynamics AX)不会执行这样的查询,它使用游标。 …

performance sql-server parallelism cursors microsoft-dynamics query-performance

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

不可查找的持久计算列上的索引

我有Address一个名为 的表,它有一个名为 的持久计算列Hashkey。该列是确定性的,但不精确。它有一个不可查找的唯一索引。如果我运行这个查询,返回主键:

SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Run Code Online (Sandbox Code Playgroud)

我得到这个计划:

基本计划

如果我强制索引,我会得到更糟糕的计划:

力指数

如果我尝试同时强制索引和查找,则会出现错误:

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

这仅仅是因为它不精确吗?我以为坚持就无所谓了?

有没有办法在不使其成为非计算列的情况下使该索引可查找?

有没有人有任何有关此信息的链接?

我无法发布实际的表创建,但这里有一个具有相同问题的测试表:

drop TABLE [dbo].[Test]

CREATE TABLE [dbo].[Test]
  (
     [test]        [VARCHAR](100) NULL,
     [TestGeocode] [geography] NULL,
     [Hashkey] AS CAST(
                        ( hashbytes
                            ('SHA', 
                                ( RIGHT(REPLICATE(' ', (100)) + isnull([test], ''), ( 100 )) ) 
                                + RIGHT(REPLICATE(' ', (100)) + isnull([TestGeocode].[ToString](), ''), ( 100 ))
                            ) 
                        ) AS BINARY(20)                                                                                                        
                      ) PERSISTED
    CONSTRAINT [UK_Test_HashKey] UNIQUE NONCLUSTERED([Hashkey])
  )    
GO    
DECLARE @Hashkey …
Run Code Online (Sandbox Code Playgroud)

index sql-server optimization sql-server-2012 computed-column

15
推荐指数
2
解决办法
532
查看次数

MERGE 死锁预防

在我们的一个数据库中,我们有一个由多个线程密集并发访问的表。线程确实通过MERGE. 还有一些线程偶尔会删除行,因此表数据非常不稳定。执行 upsert 的线程有时会陷入死锁。该问题看起来与问题中描述的问题相似。不过,不同之处在于,在我们的例子中,每个线程都只更新或插入一行

简化设置如下。该表是堆,上面有两个唯一的非聚集索引

CREATE TABLE [Cache]
(
    [UID] uniqueidentifier NOT NULL CONSTRAINT DF_Cache_UID DEFAULT (newid()),
    [ItemKey] varchar(200) NOT NULL,
    [FileName] nvarchar(255) NOT NULL,
    [Expires] datetime2(2) NOT NULL,
    CONSTRAINT [PK_Cache] PRIMARY KEY NONCLUSTERED ([UID])
)
GO
CREATE UNIQUE INDEX IX_Cache ON [Cache] ([ItemKey]);
GO
Run Code Online (Sandbox Code Playgroud)

典型的查询是

DECLARE
    @itemKey varchar(200) = 'Item_0F3C43A6A6A14255B2EA977EA730EDF2',
    @fileName nvarchar(255) = 'File_0F3C43A6A6A14255B2EA977EA730EDF2.dat';

MERGE INTO [Cache] WITH (HOLDLOCK) T
USING (
    VALUES (@itemKey, @fileName, dateadd(minute, 10, sysdatetime()))
) S(ItemKey, FileName, Expires)
ON …
Run Code Online (Sandbox Code Playgroud)

sql-server deadlock execution-plan merge

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

哪些成本因素会影响优化器选择不同类型的线轴?

线轴

在 SQL Server 中有几种假脱机。我感兴趣的两个是Table Spool s 和Index spools在修改查询之外

只读查询,特别是在嵌套循环连接的内侧,可以使用表或索引假脱机来潜在地减少 I/O 并提高查询性能。这些线轴可以是EagerLazy。就像你我一样。

我的问题是:

  • 哪些因素影响选择表与索引假脱机
  • 哪些因素会影响 Eager 和 Lazy Spools 之间的选择

sql-server execution-plan

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