我有一个新的 SQL Server 2012 实例,并且正在从 SQL Server 2000 迁移数据库。数据库中的一些存储过程我正在移动引用另一个数据库回到该 2000 服务器上。处理这个问题的最佳方法是什么?
链接服务器会有帮助吗?我在创建测试链接时遇到问题。有些人推荐使用 ODBC,其他人似乎使用 SQL Server 10 客户端驱动程序 (SQLNCLI10)。使用 SQL Server 10 客户端驱动程序对我来说似乎更好,在 SQL Server 2012 实例上安装它有问题吗?
在查看我正在使用的应用程序的数据库结构时,我认识到它在同一 SQL Server 实例上使用 3 个不同的数据库来处理不同的事情。
第一个包含很少更改的主要数据。
第二个包含高流量和容量的事件日志,最后一个是旧事件日志的存档数据库。
我想知道这种结构的好处是什么,因为数据库运行在同一个实例上,数据库文件位于同一个磁盘上。因此,我不希望由此带来任何性能改进。
我想,也许我忽略了一些东西,有人可以指出我没有想到的好处。
更新:
在维护和安全方面提出了一些好的观点。但我仍然想知道是否有可能获得性能改进。
一个更普遍的问题是:一个表的性能是否会受到同一数据库中其他大表的影响(由于碎片或其他原因),或者这些影响可能可以忽略不计。
我开始解决tempdb我们在 SQL Server 2005 企业版上遇到的问题。开发人员收到tempdb空间不足的错误。从技术上讲,错误是:
访问数据库 'dbname' 中的表 'dbo.inserted' 中的版本化行时,事务中止。未找到请求的版本化行。您的 tempdb 可能空间不足。请参考 BOL 如何配置 tempdb 进行版本控制
我查看了数据库配置sys.databases,发现了以下设置:
snapshot_isolation_state: 0
snapshot_isolation_state_desc: OFF
is_read_committed_snapshot_on: 1
Run Code Online (Sandbox Code Playgroud)
我在BOL 中查找了这意味着什么,主要信息如下:
snapshot_isolation_state允许快照隔离事务的状态,由 ALLOW_SNAPSHOT_ISOLATION 选项设置:
0 = 快照隔离状态为关闭(默认)。不允许快照隔离。
1 = 快照隔离状态开启。允许快照隔离。
2 = 快照隔离状态正在转换为关闭状态。所有事务都有其修改版本。无法使用快照隔离启动新事务。数据库保持转换为 OFF 状态,直到运行 ALTER DATABASE 时处于活动状态的所有事务都可以完成。
3 = 快照隔离状态正在转换为 ON 状态。新的交易有他们的修改版本。在快照隔离状态变为 1 (ON) 之前,事务无法使用快照隔离。数据库将保持转换到 ON 状态,直到可以完成运行 ALTER DATABASE 时处于活动状态的所有更新事务。
snapshot_isolation_state_desc允许快照隔离事务的状态描述,由 ALLOW_SNAPSHOT_ISOLATION 选项设置:
- 离开
- 在
- IN_TRANSITION_TO_ON
- IN_TRANSITION_TO_OFF
is_read_committed_snapshot_on1 = READ_COMMITTED_SNAPSHOT 选项为 ON。read-committed 隔离级别下的读操作基于快照扫描,不获取锁。
0 …
我什至不确定这个问题是否有必要,但我很想知道每个人的想法。我在同一台服务器上有两个数据库,dbFoo、dbBar。dbFoo 有下表,请注意这是一个简单的例子,语法可能不正确,因为我很匆忙,对潜在问题的答案更感兴趣,然后是代码......
CREATE TABLE dbo.CodeNumbers(
CodeNumbersID INT IDENTITY (1,1) NOT NULL PRIMARY KEY,
CodeValue VARCHAR(30) NOT NULL
IsUsed BIT NOT NULL DEFAULT(0)
);
Run Code Online (Sandbox Code Playgroud)
dbo.CodeNumbers使用每月提供的 CSV 填充,您选择的导入方法已经写入以将它们放入那里。我们从来没有得到重复的代码。
为了论证,让我们假设表中有 10,000,000 行。导入时都遵循以下格式:
1, 'ajdirjfisofklrlfo039402', 0 all the way till
10000000, 'fkeiir9489', 0
Run Code Online (Sandbox Code Playgroud)
现在在 dbBar 我有 2 个存储过程,第一个应该访问 dbFoo 中第一个未使用的代码,将它返回到一个 out 变量中并将其标记为已使用。所以我有类似的东西:
CREATE PROCEDURE GetNextUseableCode
@CodeOut VARCHAR(30) OUTPUT,
@CID INT OUTPUT
AS
SELECT @CID = CodeNumbersID, @CodeOut = CodeValue
FROM dbFoo.dbo.CodeNumbers
WHERE IsUsed = 0
UPDATE dbFoo.dbo.CodeNumbers
SET IsUsed = 1
WHERE CodeNumbersID …Run Code Online (Sandbox Code Playgroud) 我们正在构建一个新的 BizTalk 群集,其中包含两个 BizTalk 应用程序服务器和两个 SQL Server。从 BizTalk AppServer #1 上的 SSMS(与 #2 类似),我们有两个场景:
当前- 我们的基础架构团队刚刚重建了 2012/R2 Windows。它无法连接到特定的 SQL Server,但可以连接到其他 SQL Server。令人困惑的部分是,任何其他机器似乎都能够很好地连接到同一个 SQL Server,并且还可以针对它运行查询。
昨天- (我们从昨天开始重建盒子,所以不能回去......只是想描述问题。)它似乎偶尔连接。当它连接时,我尝试了一些查询,创建了一个测试数据库和表,并尝试了以下内容:
代码:
declare @MaxLoops int = 100
declare @LoopCounter int = 0
while (@LoopCounter < @MaxLoops)
begin
set @LoopCounter = @LoopCounter + 1
--select SYSDATETIME(), * from NealTest.dbo.NealTest
waitfor delay '00:00:01'
print @LoopCounter
print SYSDATETIME()
end
Run Code Online (Sandbox Code Playgroud)
我编写脚本的初衷是查看在它“滚动”后我们是否会丢失连接,换句话说,我可以设置它并增加它@MaxLoops并让它运行一个小时左右。(也可以添加 try/catch 以帮助它继续查看它们是否是偶发的连接问题。)
脚本(Select注释掉了语句)给出了一个
传输级错误
所以我们开始一次突出显示一两行。声明工作正常,我可以在声明后打印值。当我们将其降低@MaxLoops到 5 时,它实际上运行了。我们增加到 15 它失败了Transport-level …
我们有一个 SQL Server 2012 Enterprise 设置,具有大量 RAM (256 GB),此时数据库相当小(大约 17 GB)。现在,由于各种编码问题,我们遇到了性能问题,希望通过一些代码审查和优化来解决。与此同时,有一种尝试通过为tempDBLUN获得更快的磁盘来提高性能,例如使用 FusionIO PCIe 闪存卡。
我担心的是,鉴于 SQL Server 仍然有足够的 RAM 可以利用,我们不会看到添加更快的磁盘带来任何真正的性能改进。我认为大多数tempDB操作将发生在 RAM 中,或者发生在磁盘上但最终缓存在 RAM 中(在主机、HBA 或 SAN 上)。
有谁知道当 SQL Server 2012tempDB有足够的 RAM 可供使用时,它是否仍会等待磁盘操作上的 IO 阻塞,或者tempDB我们看到的磁盘活动是否只是为了提供持久性或持久性?
我正在使用 SQL Server 2014 设置一个 OLAP 数据库。核心事实表有大约 40,000,000 行、225 列,平均行大小为 181 字节。我一直在玩聚簇列存储索引,但运气不佳。一般来说,我发现使用新技术时查询性能要慢 4 倍以上。
一个特殊的例子 - 使用 int32 主键选择单行现在需要 12 秒......这是对行存储表的亚秒操作(当然它在 PK 上有一个唯一索引,这不允许与聚集列存储索引)。
我试图找出我做错了什么 - 从 MS 文档中听起来这是完成这项任务的理想技术;也许我错过了一些东西。
我正在 Windows 8.1 64 位上运行 SQL 2014 Enterprise,具有 128GB RAM 和 SSD 用于数据存储。此应用程序的数据是只读的。
最近我遇到了一个问题,来自一个域的用户无法登录 SQL Server 并收到此错误:
错误:17806,严重性:20,状态:2。SSPI
握手失败,错误代码为 0x8009030c,同时建立具有集成安全性的连接;连接已关闭。[客户:xxxxxx]错误:18452,严重性:14,状态:1
。用户登录失败”。用户未与受信任的 SQL Server 连接相关联。[客户:xxxxxx]
我们有两个域,比如说 A 和 B。我的 SQL Server 在域 B 中运行。在正常情况下,两个域用户都能够连接。但是前几天,域A的所有用户都无法连接到域B中运行的SQL Server。但是域B的用户却能够成功连接。用户联系 SQL Server DBA 团队调查问题。
当我检查时,即使我无法使用 SSMS 并使用域 A 的凭据远程连接到 SQL Server。但是,当我尝试使用域 A 的凭据对服务器进行 RDP 时,它工作正常,并且在远程访问 SQL Server 后也开始工作美好的。所以在我看来,当我对服务器进行 RDP 时,某些东西得到了刷新并且我的登录远程开始正常工作。我确信实际问题与 AD 和 kerberos 身份验证有关,但无法证明。
我在网上研究了这个问题,并找到了两个解决方案来解决它。一是修复故障 DC,二是重新启动运行 SQL Server 的服务器。我采用了第二种方式,因为 Windows 管理员不接受这是 DC 问题。我从 SQL 端检查了所有内容,最近没有任何变化。还发现在运行 SQL Server 的服务器上记录以下事件后,此问题开始发生:
日志名称:系统
来源:NETLOGON
日期:xxxxxxxx
事件 ID:5719 任务
类别:无
级别:错误
关键字:经典
用户:不适用
计算机:xxxxxxxxxx
描述:这台计算机无法与域控制器建立安全会话domain xxxxxx 由于以下原因: 当前没有可用于为登录请求提供服务的登录服务器。这可能会导致身份验证问题。确保此计算机已连接到网络。如果问题仍然存在,请联系您的域管理员。附加信息 如果此计算机是指定域的域控制器,它会设置与指定域中的主域控制器模拟器的安全会话。否则,此计算机将与指定域中的任何域控制器建立安全会话。
我的问题是:
好的,所以我有一个运行非常缓慢的报告存储过程。客户抱怨报告无法运行,所以我开始调查问题在存储过程中的确切位置,我发现这部分占用了 99.8% 的时间。
DECLARE @xmlTemp TABLE (
CompanyID INT,
StoreID INT,
StartDate DATETIME,
DateStaID INT,
EndDate DATETIME,
DateEndID INT,
LastUpdate DATETIME)
INSERT INTO @xmlTemp
VALUES (50,
2,
'3/3/2013',
0,
'3/3/2013',
0,
'3/3/2013')
SELECT DISTINCT T.CompanyID,
CompanyName,
Z.StoreID,
StoreName,
CashedOutBy,
TransactionID,
RegisterID,
BusinessDate,
CashedOut,
Total - Isnull((SELECT Sum(DISTINCT PaymentAmount)
FROM vPullDrawerPayments
WHERE CompanyID = T.CompanyID
AND StoreID = T.StoreID
AND TransactionID = T.TransactionID
AND Isnull(PaymentType, 1) <> 1), 0) AS PaymentAmount,
'Cash' AS PaymentDesc,
CASE
WHEN Z.EndDate >= Z.LastUpdate THEN 1 …Run Code Online (Sandbox Code Playgroud) 我在实时服务器 (SQL Server 2008 R2) 上创建了一个非聚集索引,但结果却没有提供我所希望的性能优势。所以我想再次删除索引。
不幸的是,我无法锁定正在使用的索引。它可能总是会被使用。重新启动 SQL Server 并不是一个真正的选择。
过去我想重建索引时也遇到过同样的问题,我不得不通过重新组织来解决这个问题(有时效率很低)。
有没有办法告诉 SQL Server 停止使用索引?或者是否可以运行一个查询来尝试获取索引的排他锁,无限期等待,然后删除索引?还有其他选择吗?或者我是否只需要等到出现某种中断,然后希望我记得在一切恢复联机之前将其删除?
sql-server ×9
performance ×2
columnstore ×1
errors ×1
index ×1
locking ×1
olap ×1
t-sql ×1
tempdb ×1
view ×1