小编mar*_*c_s的帖子

从 SQL Server 2012 到 SQL Server 2000 服务器的链接服务器

我有一个新的 SQL Server 2012 实例,并且正在从 SQL Server 2000 迁移数据库。数据库中的一些存储过程我正在移动引用另一个数据库回到该 2000 服务器上。处理这个问题的最佳方法是什么?

链接服务器会有帮助吗?我在创建测试链接时遇到问题。有些人推荐使用 ODBC,其他人似乎使用 SQL Server 10 客户端驱动程序 (SQLNCLI10)。使用 SQL Server 10 客户端驱动程序对我来说似乎更好,在 SQL Server 2012 实例上安装它有问题吗?

sql-server sql-server-2000 linked-server sql-server-2012

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

为什么要为高流量/容量表使用单独的数据库?

在查看我正在使用的应用程序的数据库结构时,我认识到它在同一 SQL Server 实例上使用 3 个不同的数据库来处理不同的事情。

第一个包含很少更改的主要数据。

第二个包含高流量和容量的事件日志,最后一个是旧事件日志的存档数据库。

我想知道这种结构的好处是什么,因为数据库运行在同一个实例上,数据库文件位于同一个磁盘上。因此,我不希望由此带来任何性能改进。

我想,也许我忽略了一些东西,有人可以指出我没有想到的好处。

更新:
在维护和安全方面提出了一些好的观点。但我仍然想知道是否有可能获得性能改进。

一个更普遍的问题是:一个表的性能是否会受到同一数据库中其他大表的影响(由于碎片或其他原因),或者这些影响可能可以忽略不计。

performance database-design sql-server

6
推荐指数
2
解决办法
5654
查看次数

这些快照隔离级别配置如何在 SQL Server 2005 实例上进行交互?

我开始解决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_on

1 = READ_COMMITTED_SNAPSHOT 选项为 ON。read-committed 隔离级别下的读操作基于快照扫描,不获取锁。

0 …

sql-server-2005 sql-server isolation-level

6
推荐指数
1
解决办法
5562
查看次数

如何避免跨数据库 proc 调用的竞争条件?和其他问题

我什至不确定这个问题是否有必要,但我很想知道每个人的想法。我在同一台服务器上有两个数据库,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)

sql-server stored-procedures t-sql sql-server-2012

6
推荐指数
1
解决办法
2285
查看次数

“从服务器接收结果时发生传输级错误”的疑难案例 SQL Server

我们正在构建一个新的 BizTalk 群集,其中包含两个 BizTalk 应用程序服务器和两个 SQL Server。从 BizTalk AppServer #1 上的 SSMS(与 #2 类似),我们有两个场景:

  1. 当前- 我们的基础架构团队刚刚重建了 2012/R2 Windows。它无法连接到特定的 SQL Server,但可以连接到其他 SQL Server。令人困惑的部分是,任何其他机器似乎都能够很好地连接到同一个 SQL Server,并且还可以针对它运行查询。

  2. 昨天- (我们从昨天开始重建盒子,所以不能回去......只是想描述问题。)它似乎偶尔连接。当它连接时,我尝试了一些查询,创建了一个测试数据库和表,并尝试了以下内容:

代码:

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 errors

6
推荐指数
1
解决办法
2316
查看次数

如果您有大量未使用的内存,tempDB 磁盘性能是否重要?

我们有一个 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我们看到的磁盘活动是否只是为了提供持久性或持久性?

performance sql-server-2012 tempdb

6
推荐指数
1
解决办法
439
查看次数

聚集列存储索引性能 SQL Server 2014

我正在使用 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 olap columnstore

6
推荐指数
1
解决办法
1045
查看次数

SQL Server 和 SSPI 握手失败错误

最近我遇到了一个问题,来自一个域的用户无法登录 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 由于以下原因: 当前没有可用于为登录请求提供服务的登录服务器。这可能会导致身份验证问题。确保此计算机已连接到网络。如果问题仍然存在,请联系您的域管理员。

附加信息 如果此计算机是指定域的域控制器,它会设置与指定域中的主域控制器模拟器的安全会话。否则,此计算机将与指定域中的任何域控制器建立安全会话。

我的问题是:

  1. 如何证明这是域控制器问题?
  2. 服务器重启如何解决这个问题? …

authentication sql-server windows-server

6
推荐指数
1
解决办法
5241
查看次数

加入到@Table 变量运行效率低下

好的,所以我有一个运行非常缓慢的报告存储过程。客户抱怨报告无法运行,所以我开始调查问题在存储过程中的确切位置,我发现这部分占用了 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 sql-server stored-procedures view

5
推荐指数
1
解决办法
5530
查看次数

如何禁用或删除索引

我在实时服务器 (SQL Server 2008 R2) 上创建了一个非聚集索引,但结果却没有提供我所希望的性能优势。所以我想再次删除索引。

不幸的是,我无法锁定正在使用的索引。它可能总是会被使用。重新启动 SQL Server 并不是一个真正的选择。

过去我想重建索引时也遇到过同样的问题,我不得不通过重新组织来解决这个问题(有时效率很低)。

有没有办法告诉 SQL Server 停止使用索引?或者是否可以运行一个查询来尝试获取索引的排他锁,无限期等待,然后删除索引?还有其他选择吗?或者我是否只需要等到出现某种中断,然后希望我记得在一切恢复联机之前将其删除?

index sql-server sql-server-2008-r2 locking

5
推荐指数
1
解决办法
5068
查看次数