标签: sql-server-2005

我应该刷新查询计划缓存吗

请让我解释一下我的问题和情况:

我有一个 Web 应用程序 - MVC3、MSSQL Server 2005、LinqToSQL。它一直运行良好,直到一个晴朗的早晨,我将很多行推送到一个经常使用的表中,从那时起我就遇到了查询超时。为了解决这个问题,我运行了 Database Tuning Advisor 并添加了一些索引和统计信息。我还创建了一个维护计划来每天重建索引。这些添加后,应用程序一直表现不稳定;它会快速工作几个小时,然后它会再次开始超时。接下来,生活迫使我清理表格,现在其中的行数比以前更少,但超时仍在发生。所以,我删除了我创建的所有索引,现在网站更加稳定,但有时我仍然会看到一些超时。

我一直在试图弄清楚如何修复这些查询,当我对其进行分析并将查询直接粘贴到 SQL Management Studio 时,它会在 1 秒内返回结果,但是当我从我的应用程序运行此查询时,大约需要 25 秒. 然后在它第一次运行后,下次它会像在服务器上一样快!

我开始做一些研究,看起来当我使用所有这些索引时,我的查询计划搞砸了,现在它们正在产生问题。

我的问题是:

  1. 我是否应该刷新我的查询计划缓存(大约 22000 个查询 - 其中很多只使用过一次)并且
  2. 如果我这样做,对 SQL 都在重建时会产生什么影响?

index sql-server-2005 sql-server execution-plan linq

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

无法重命名表,因为它是为复制而发布的

我需要重命名我的数据库中的一些表 - SQL Server 2005,如下:

EXEC sp_rename 'dbo.TableName', 'Tmp_TableName', 'OBJECT'
Run Code Online (Sandbox Code Playgroud)

但我不能这样做 - 我得到了这个例外 -

无法重命名表,因为它是为复制而发布的

这个数据库没有复制 - 它在 5 年前被删除 - 我们刚刚尝试过并在一周后将其删除。所以我想它应该是某个地方的一面旗帜。

请帮我以某种方式删除此标志。

sql-server-2005 sql-server

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

将登录名转移到另一台服务器

我将数据库从 SQL Server 2005 移到 SQL Server 2012。有什么办法可以恢复新服务器上的所有登录信息?

sql-server-2005 sql-server sql-server-2012

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

从更新到意图独占的PAGELOCK转换死锁

我们的一位客户经常遇到僵局。死锁大多在同一个UPDATE语句上。死锁遵循一种模式,其中两个 SPID 都已获取页上的更新 (U) 锁,并且都尝试将 U 页锁向上转换为意图排他 (IX) 锁。有时只涉及一页;有时几个。

我们使用跟踪标志 1222捕获了死锁跟踪。SQL Server 日志显示了许多具有以下模式的死锁(按自下而上的顺序):

waiter id=processe0dc2088 mode=U requestType=convert
waiter id=process2f9db2478 mode=U requestType=convert
waiter-list
owner id=processe0dc2088 mode=IX
owner id=process2f9db2478 mode=IX
owner-list
pagelock fileid=1 pageid=5794 dbid=2 objectname=tempdb.dbo.Item_Package_Site_Costs_Work id=lock1b22de480 mode=IX associatedObjectId=72057594131775488
resource-list
Run Code Online (Sandbox Code Playgroud)

两个进程都运行相同的 UPDATE 语句来在这个 tempdb 表上设置一个标志。此 tempdb 表包含需要在客户端调用之间保留的信息,直到客户端完成。该表有一个相当长的索引,以代表唯一进程 ID 的 GUID 开头。

我很难理解和模拟这种僵局。我用模拟数据尝试了各种数量的记录。

我的问题:

为什么这些进程获取U锁然后转换为IX? 我希望 DELETE 开始获取 IX 锁。

我怎样才能防止死锁?

导致死锁的语句如下。该流程刚刚完成了对单个商店中商品清单的成本查询。它试图指出发现了一个成本。

请注意,UPDATE 语句中有一个已弃用的 (NOLOCK)。这会是一个促成因素吗?

UPDATE tempdb..Item_Package_Site_Costs_Work
SET ItemPkgSiteCost_VINCostFound = 1,
    ItemPkgSiteCost_VendCost_Key = SiteCosts_VendCost_Key
FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server deadlock

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

在不同的服务器中创建数据库的辅助只读副本

我们有用户查询我们的产品数据库(主要是通过 MS-Access 的 ODBC)来创建一些海关报告。我们想将我们的数据复制到第二台服务器(复制/日志传送/???),因此生产数据库上的负载较少。Prod DB 中的许多表没有主键并且是 SQL Server 2005。我们的目标 DB 是 SQL Server 2012 Standard(尽管我们可以在必要时降级目标服务器)。

我们怎么能做到这一点?我们尝试过复制,但由于缺少主键而失败。我们也尝试过日志传送,但由于 SQL 版本不同,第二个 DB 无法上线。

谢谢,吉姆

sql-server-2005 sql-server sql-server-2012

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

主体“硬停机”的故障转移场景

我的公司有一对 SQL Server 2005 实例的故障转移对,它们为 UL 许可的警报/呼叫中心提供数据库可用性,其中正常运行时间和可用性对生命安全至关重要。

下面是来自其中一个关键业务应用程序的 connectionStrings 的示例行(为了我们的保护而进行了消毒):

<add name="MyCompany.MyApp.Properties.Settings.MyDbConnectionString"
 connectionString="Data Source=Principal-DB;Failover Partner=Mirror-DB;
 Initial Catalog=MyDb; Integrated Security=True; Persist Security Info=True;"
 providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

大约半小时前,这是我们认为的场景:

  1. DBA 在指定时间向所有用户报告 Principal-DB 服务器上的硬件维护需求,并建议他们在遇到数据库连接问题时关闭并重新启动客户端应用程序。
  2. DBA 从主体数据库故障转移到镜像数据库。客户端应用程序不受影响。
  3. DBA 关闭 Principal-DB 服务器。
  4. 某些客户端应用程序开始在池连接上超时(正如预期的那样)。遇到这些错误的用户按照 DBA 的建议关闭并重新启动。
  5. 由于无法从数据库接收响应,这些客户端应用程序现在无法完全启动。
  6. 欢闹随之而来。

我们的理论是,因为主要-DB不在状态,以响应连接请求在所有的,当它通常会迅速地拒绝这样的连接,如果它是在恢复状态,客户端应用程序结束了等待整个分配连接超时(默认为 20 秒)让主服务器响应,然后返回超时错误,而无需尝试连接到列出的故障转移伙伴。

快速修复是将更新推送到包含交换数据源和故障转移伙伴实例的 App.config 的客户端应用程序,因此 Mirror-DB 现在是应用程序首先尝试连接的服务器。当我们故障恢复到 Principal-DB 时,我们将不得不使用另一个应用程序更新来撤消此更改。

我需要一个更永久的修复。这不是故障转移对的预期行为,并且不允许再次发生。必须有一种方法来配置客户端应用程序,以便它在返回错误之前在这种情况下正确尝试连接到故障转移伙伴。

sql-server-2005 sql-server mirroring failover

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

有没有办法根据 SQL Server 版本执行 SQL 语句?

如果 SQL Server 是 2008 或更新版本,我想在表上创建计算索引,如果 SQL Server 是 2005 或更新版本,我想创建一个简单索引:

-- check for sql server version
if (select cast(left(cast(serverproperty('productversion') as varchar), 4) as decimal(5, 3))) >= 10 
        CREATE unique nonclustered index ix1_table
            ON table (column1, column2)
            WHERE column1 is not null and column2 is not null
        ELSE
            CREATE nonclustered index ix1_table
                ON table (column1, column2)
Run Code Online (Sandbox Code Playgroud)

问题是整个语句都被评估了,在 SQL Server 2005 上这会引发错误:

关键字“WHERE”附近的语法不正确。

是否可以根据 SQL Server 版本以某种方式创建不同的索引?

index sql-server-2005 sql-server sql-server-2008-r2

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

为什么针对 SQL Server 2005 中的空表而不是 SQL Server 2012 从 Union All 返回零长度空格

支持带有 SQL Server 2005 后端的现有 VB6 应用程序,我们正在将数据库服务器迁移到 SQL Server 2012。创建生产数据库的备份并将其恢复到两台服务器上的开发数据库中。除了服务器版本之外,数据库是相同的,并且兼容级别仍设置为 90 (SQL Server 2005)。

当我在 SQL Server 2005 上运行查询时,类似于下面的示例,返回一个字符串,其中任何空白字段都有额外的空格。如果我在 SQL Server 2012 上运行相同的查询,则不会返回额外的空格。据我所知,UNION ALL对没有记录和 char 数据类型的表执行似乎是一个问题,但我还是想问一下。

对于下面的例子中你需要创建一个表一个NOT NULLChar(2)列命名Unit6。将表留空,一旦创建就没有记录。

CREATE TABLE [dbo].[tblTest](
    [Unit6] [char](2) NOT NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

当我运行以下查询时,我收到两种不同的结果,具体取决于服务器版本:

SELECT 
   Unit5, Unit6,
   LEN(Unit6) as Len_Unit6, 
   '--|' + Unit6 + '|--' as Spanner
FROM
   (SELECT      
       '13' as Unit5,
       '' as Unit6
    UNION ALL
    SELECT      
        '',
        Unit6 
    FROM tblTest) as MyData
Run Code Online (Sandbox Code Playgroud)

SQL Server 2005 …

sql-server-2005 sql-server sql-server-2012

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

数据库所有者之一已被删除,并在 sql server 中更改了相应的属性

2013 年 12 月,一个名为 user1 的用户在 SQL 2008 上创建了一个数据库。今天,我们将从服务器中删除该用户(/所有者)。那么数据库的所有者属性将显示什么?

sql-server-2005 sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012

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

无法访问数据库的属性页

我正在停用数据库服务器并将数据库从一台服务器迁移到另一台服务器。我试图获取数据库的属性并收到一个 SQL 错误弹出窗口。

属性所有者不可用于数据库“[数据库名称]”。此对象可能不存在此属性,或者可能由于访问权限不足而无法检索。(Microsoft.SqlServer.Smo)

事实:

  • Server 2003 Standard with SP2
  • SQL Server 2005 标准版 - 9.0.1399
  • 我是系统管理员,所以应该不是权限问题
  • 让另一个系统管理员以相同的错误执行操作
  • DBCC CheckDB 没有列出任何错误
  • 能够备份没有错误
  • 使 DB 离线/在线无错误

我可以执行和报告的任何建议或测试?

sql-server-2005 sql-server corruption

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