我有一个大型(约 6700 万行)名称-值表,该表在DataValue列上具有全文索引。
如果我尝试运行以下命令:
ALTER TABLE VisitorData ADD NumericValue bit DEFAULT 0 NOT NULL;
Run Code Online (Sandbox Code Playgroud)
它运行了 1 小时 10 分钟,但仍然无法在VisitorData包含约 6700 万行的表上完成。
以下是有关该表的更多详细信息:
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) 在Microsoft SQL Server 2005中,缩小在线数据库的日志文件是否可以,否则会导致服务中断?
我听说它说您不想使用动态 SQL。你能给我一些具体的或现实生活中的例子吗?
就个人而言,我在我的数据库中多次使用它进行编码。我认为这是可以的,因为它的灵活性。
我的猜测是关于 SQL 注入或性能。还要别的吗?
我们的一款产品同时支持 Oracle 和 SQL Server 作为数据库后端。我们有一位客户希望从 Oracle 后端切换到 Microsoft SQL Server,这对我们来说不是典型的过渡。
将整个 Oracle Schema 中的所有数据获取到 SQL Server 数据库中的最简单方法是什么?
模式只包含普通的旧表,没有什么花哨的。可能有一两个存储过程,我们手动迁移不会有问题。
我可以使用 Oracle 的 SQLDeveloper 将表数据导出为CREATE和INSERT语句,但这些与 SQL Server 上使用的语法不匹配,我不希望手动修复语法错误。
我最近对 100,000 条记录执行了更新查询。我意识到我在查询运行时犯了一个错误,并迅速拔掉了网络电缆。
是否更新查询
我的任务是为我的一位客户发送一份小型月度报告。该报告以前在实例上手动运行,输出复制到电子表格并作为附件发送给客户。
我正在寻找一个更永久的解决方案,所以我打算使用 sp_send_dbmail存储过程来运行查询并将其作为附件发送。
一切正常,但消息的格式。最初我尝试将输出附加为带有 a 的 CSV 文件,@query_result_seperator = ','但结果无处不在!
当我正常运行报告时,输出在 SQL 中看起来不错。但是将其作为 CSV 发送或仅在消息正文中发送则不然。
我认为如果我将输出导出为 HTML 并作为附件/或 XML 发送它可能会更好,但我不知道如何执行此操作。
有没有人有什么建议?
提前致谢!
我遇到了一个查询的性能问题,我似乎无法理解。
我从游标定义中提取了查询。
此查询需要几秒钟才能执行
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
我有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
在我们的一个数据库中,我们有一个由多个线程密集并发访问的表。线程确实通过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 中有几种假脱机。我感兴趣的两个是Table Spool s 和Index spools,在修改查询之外。
只读查询,特别是在嵌套循环连接的内侧,可以使用表或索引假脱机来潜在地减少 I/O 并提高查询性能。这些线轴可以是Eager或Lazy。就像你我一样。
我的问题是:
sql-server ×10
alter-table ×1
cursors ×1
deadlock ×1
dynamic-sql ×1
index ×1
merge ×1
migration ×1
network ×1
optimization ×1
oracle ×1
parallelism ×1
performance ×1
syntax ×1
xml ×1