在 SQL Server 中,你们使用扩展属性做什么?一些文章和博客建议将它们用于数据库及其对象的自我记录,但我看不到它被正确使用......大多数人都忽略了这一点吗?
Windows 2008R2 Enterprise 上的 SQL Server 2008 R2 标准版(64 位)
即使在大量使用情况下 - CPU 超过 80% 数分钟
专用 SQL Server
将服务帐户设置为在内存中锁定
这是正常的吗?
我可以测试什么?
我可以让 SQL Server 使用更多内存吗?
我们有两个数据库表ErrorLog,Audit并且在过去几年中都变得相当大。所以为了减少数据库的大小,我必须编写一个脚本来清除这两个表中所有超过 6 个月的行。
这就是我想出的:
ALTER DATABASE StudioWebTest SET RECOVERY SIMPLE;
DELETE FROM [Audit] WHERE AuditDate < DATEADD(M, -6, GETDATE());
DELETE FROM [ErrorLog] WHERE ErrorDate < DATEADD(M, -6, GETDATE());
ALTER DATABASE StudioWebTest SET RECOVERY FULL;
Run Code Online (Sandbox Code Playgroud)
在我的开发机器 (SQL Server 2008 R2) 上,无论是否更改恢复模式,数据库大小都会增长 2-3 倍。但是,如果我立即使用收缩命令进行跟踪,它会将数据库的大小减少到原始大小的一半(在删除记录之前)。
但是,如果我推迟几天进行收缩,收缩几乎没有那么有效,因为虽然数据库大小减少了,但它仍然几乎是原来大小的两倍(在删除记录之前)。不太了解 SQL Server 如何使用它分配的空间,我认为这与使用已释放的额外空间有关。
除了一件事,这一切都可以。当我们在使用 SQL Server 2005 的生产测试环境中运行它时,shrink 命令不会将数据库的大小减少到原始大小的一半。
作为替代方案,我也尝试使用TRUNCATE代替,DELETE但这似乎没有太大区别。语句完成后数据库仍然大量增长,我仍然必须缩小它以获得相同的结果。我们还没有在生产测试机器上尝试过这个,但是因为shrink 命令似乎没有削减它,所以这是否会产生任何改进似乎值得怀疑。
无论如何,我只是想知道是否有人可以解释为什么尽管更改了错误恢复设置,数据库还是增长了这么多?如何防止这种情况发生?或者,如果这不是解决此问题的最佳方法,则可能建议减少数据库大小的替代方法。
更新:
我只是使用TRUNCATE它进行了更多测试,现在似乎没有增加大小(也许是我想象的)。我仍然需要缩小数据库以查看整体大小的减少。我可能会在生产测试服务器上尝试这个。归根结底,只要规模缩小到一定程度,我的经理就会很高兴。
我目前正在开发一个项目,该项目从平面文件 (csv) 中批量导入数据,大约 18 个不同的文件通过一些存储过程链接到特定的表。
我按照数据加载性能指南中的建议进行了操作。
数据库处于BulkLogged恢复模式以最小化日志记录,当在包含 600000 行的文件上执行以下存储过程时,我收到错误
消息 9002,级别 17,状态 4,过程 SP_Import__DeclarationClearanceHistory_FromCSV,第 34 行
数据库的事务日志已满。要找出无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列
(出于测试目的,我在开始导入之前进行了完整备份)。
看着log_reuse_wait_desc我看到以下内容:
log_reuse_wait_desc检查点。所有其他导入成功导入。
欢迎任何解决此问题的意见。
PROCEDURE [dbo].[SP_Import_DeclarationClearanceHistory_FromCSV]
@FilePath [nvarchar](1000)
AS
BEGIN
-- Creating a Temproary Table for importing the data from csv file.
DBCC TRACEON(610)
CREATE TABLE #DeclarationClearanceHistory
(
[ItemID] [int] IDENTITY(1, 1) NOT NULL ,
[CMSDeclarationID] [bigint] NOT NULL ,
[StatusCode] [nvarchar](10) NOT NULL ,
[SubStatus] [nvarchar](10) NULL ,
[DepartmentCode] [nvarchar](10) …Run Code Online (Sandbox Code Playgroud) 我刚刚在 1MM 行表上创建了一个聚集索引(打开了页和行锁定)。我现在尝试运行查询,但出现此错误:
“SQL Server 数据库引擎的实例此时无法获取LOCK资源。当活动用户较少时重新运行您的语句。请数据库管理员检查此实例的锁和内存配置,或检查长时间运行交易。”
我稍后需要调整页/行锁定设置,但同时我需要删除索引,因为我有用户查询表。我试图放弃它,但我收到了同样的错误。有什么建议可以永久删除索引吗?谢谢你。
编辑 1:基于下面的 Remus 回答,我运行了以下脚本以启用锁的动态内存分配。
EXEC sp_CONFIGURE 'show advanced options', 1 RECONFIGURE
EXEC sp_configure 'locks', 0 RECONFIGURE
Run Code Online (Sandbox Code Playgroud)
然后,我重新启动了服务器。
有人可以向我解释 collationsql_slovak_cp1250_ci_as与collation 之间的区别Slovak_CI_AS吗?
我有一个 db 设置为sql_slovak_cp1250_ci_as并且共享主机仅支持Slovak_CI_AS. 应该不会有问题吧?
非常感谢。
问题:如何让我的可用性组注册为ag-ewgtest.sql.company.com我的服务器认为自己的给定server.company.com。
设置:我的 SQL Server 2012 可用性组位于多个子网上,类似于这篇 MSDN 博客文章 中的描述。当我进入故障转移群集管理器时,它显示名称解析尚不可用:

然后我右键单击“名称:ag-ewgtest”并选择属性。我勾选了“发布 PTR 记录”,它显示全名是ag-ewgtest.company.com.

我的问题是我只被允许更新 DNS 区域sql.company.com。如果我将 DNS 名称更改为 ,ag-ewgtest.sql.company.com则全名变为ag-ewgtest.sql.company.com.company.com.
我尝试将我的 NIC 更新为:

但并没有什么不同。如何更改我的可用性组尝试注册的子域?
我正在查看我们的数据库并注意到在特定表上我们有以下索引:
表:
Col1 INT IDENTITY(1,1) Primary Key
Col2 INT
...
about 15 more columns
....
ColN VARCHAR(50)
....
another 10 more columns
Run Code Online (Sandbox Code Playgroud)
除了标准的主键聚集索引之外Col1,我们还有以下索引:
create nonclustered index [iTable-Col1] ON [dbo].[Table1]
(
Col1
)
include ( ColN )
Run Code Online (Sandbox Code Playgroud)
我们定期搜索Col1并且只想检索ColN. 该索引确实得到使用,因为它是包含满足查询所需的所有数据的最小索引。
我的问题是,这个索引对 SQL Server 有什么好处吗?我们最好放弃它并只在聚集索引上进行搜索吗?
我唯一的想法是这个索引比聚集索引(25mb vs 300mb)小得多,这可能会使搜索和/或缓存更快。
如果有任何区别,服务器是 SQL Server 2012。
我正在尝试编写一个存储过程,该过程将从临时表中获取新值,将它们合并到一个实际表中,为我提供插入行的 ID,以及与其值匹配的已经存在的行。
现在,从我所看到的来看,MERGE 函数似乎不支持我想要做的事情,除非我做错了(完全有可能,我不是 SQL 专家——.NET)。不管怎样,我今天晚上才真正了解了MERGE,一开始我似乎应该使用它,但它似乎没有我需要的功能,因为我无法获得以前存在的ID,我需要其余的存储过程。我的主要重点是看看我是否可以让它工作,但另一个问题是我需要确保代码处理对将通过 MERGE 运行的存储过程的潜在并发调用。我知道我现在没有锁定在那里,但我只是想让它在这一点上工作。那么,我所拥有的......
DECLARE @Metadata TABLE
(
MetadataId INT PRIMARY KEY IDENTITY(1,1),
MetadataTypeId INT,
MetadataTypeValueId INT
)
INSERT INTO @Metadata
VALUES
(1,23),(2,32),(2,33),(2,43),(1,24),(3,33),(1,20)
--Original Table Data
SELECT * FROM @Metadata
DECLARE @MergeMetadata TABLE
(
MetadataId INT,
MetadataTypeId INT,
MetadataTypeValueId INT
)
INSERT INTO @MergeMetadata (MetadataTypeId, MetadataTypeValueId)
VALUES
(2,32),(2,35),(3,34),(4,1),(1,23)
--Metadata that needs added and/or ID'd if exists
SELECT * FROM @MergeMetadata
DECLARE @FinalMetadata TABLE
(
MetadataId INT,
MetadataTypeId INT,
MetadataTypeValueId INT
)
INSERT INTO @FinalMetadata (MetadataId, …Run Code Online (Sandbox Code Playgroud) 除了使用COLUMN[1]/@value下面的元素索引,是否可以通过指定属性名称来检索列值,例如:COLUMN[@name=”Prod_ID”]/@value?
当我尝试时,我收到此错误:
消息 2389,级别 16,状态 1,第 41 行
XQuery [value()]:“value()”需要单例(或空序列),找到类型为“xdt:untypedAtomic *”的操作数
我的代码:
DECLARE @xml AS XML = '<DATA>
<ROW RowNumber="1">
<COLUMN Name="ProdID" Value="1234" />
<COLUMN Name="AppID" Value="20144" />
<COLUMN Name="ConsentDesc" Value="My Description" />
<COLUMN Name="ConsentVer" Value="" />
<COLUMN Name="ConsentAcceptance" Value="6789" />
<COLUMN Name="ConsentType" Value="TermsAndConditions" />
<COLUMN Name="CreatedDate" Value="8/22/2014 3:04:29 PM" />
</ROW>
</DATA>'
SELECT
m.c.value('@RowNumber', 'varchar(50)') AS RowNumber ,
m.c.value('COLUMN[1]/@Value', 'varchar(50)') AS [ProdID] ,
m.c.value('COLUMN[2]/@Value', 'varchar(50)') AS [AppID] ,
m.c.value('COLUMN[3]/@Value', 'varchar(50)') AS [ConsentDesc.] ,
m.c.value('COLUMN[4]/@Value', 'varchar(50)') …Run Code Online (Sandbox Code Playgroud) sql-server ×9
bulk ×1
collation ×1
concurrency ×1
dns ×1
hardware ×1
import ×1
index ×1
index-tuning ×1
memory ×1
merge ×1
optimization ×1
xml ×1