标签: sql-server-2008

为什么 io_stall_writes_ms 对于 tempdb 如此之高?

我们在同一个磁盘驱动器上有用户和系统数据文件。( io_stall_write_ms / ( 1.0 + num_of_writes ) ) 对于用户文件低于 2,但 tempdb 文件通常超过 400。我在几台服务器上看到了这一点,我很好奇是否存在写入 tempdb 需要更长时间的原因比一个普通的数据库数据文件。

SELECT DISTINCT UPPER(LEFT(mf.physical_name, 1)) AS Directory,
( io_stall_write_ms / ( 1.0 + num_of_writes ) ) as result, 
io_stall_write_ms, num_of_writes, 
fs.database_id, 
fs.[file_id]
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
INNER JOIN sys.master_files AS mf ON fs.database_id = mf.database_id
AND fs.[file_id] = mf.[file_id]
Run Code Online (Sandbox Code Playgroud)

谢谢,

sql-server-2008 sql-server

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

处理使用 insert-exec 块调用的存储过程中的异常

我有一个在 insert-exec 块中调用的存储过程:

insert into @t
    exec('test')
Run Code Online (Sandbox Code Playgroud)

如何处理存储过程中生成的异常并继续处理?

下面的代码说明了这个问题。我想要做的是根据内部exec()调用的成功或失败返回0或-1 :

alter procedure test -- or create
as
begin try
    declare @retval int;
    -- This code assumes that PrintMax exists already so this generates an error
    exec('create procedure PrintMax as begin print ''hello world'' end;')
    set @retval = 0;
    select @retval;
    return(@retval);
end try
begin catch
    -- if @@TRANCOUNT > 0 commit;
    print ERROR_MESSAGE();
    set @retval = -1;
    select @retval;
    return(@retval);
end catch;
go

declare @t table (i int); …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

新服务器上的性能更差

我们一直在使用专用服务器(单四核,6 GB RAM)并且正在迁移到新的专用服务器(2x 六核,32 GB RAM)。两者都是Windows Server 2008、SQL Server 2008。新服务器上的性能比旧的、速度较慢的服务器稍差。

在测试中,我们的 ASP.NET 应用程序运行速度慢了 10 - 20%。使用 STATISTICS IO 和 STATISTICS TIME 运行单个昂贵的查询显示在新服务器上花费的时间增加了 10 - 20%。SQL 查询配置文件在昂贵的查询中显示更高的 CPU 使用率。

新服务器上的任务管理器显示 sqlserver.exe 正在消耗 22 GB 的 RAM,但 CPU 值始终保持很低。

我已经更新了所有统计信息、重建或重新组织的索引等。考虑到我已经完成的测试数量,此时执行计划应该存储在新服务器上。如果缺少任何索引(我认为没有),它们会同等影响旧服务器和新服务器。新的具有旧的相同数据的恢复备份。

我原以为新服务器上的性能会更好,但更令人担忧的是负载。如果旧服务器即使在负载下也能表现得更好,那么当这个新的、稍微差一点的服务器必须承担那个负载时会发生什么?

我还能在这里错过什么?

编辑:MAXDOP 设置为 6。

旧服务器在相同的物理驱动器 (RAID 10) 上具有操作系统、数据库和 tempdb。总共 4 个 15k 3 Gb/s 3.5 英寸 SAS。新服务器具有三个驱动器组:RAID 1 上的操作系统、RAID 10 上的数据库、RAID 5 上的 tempdb。总共 9 个 15K 6 Gb/s 2.5 英寸 SAS。

旧服务器有 1 x Intel Xeon E5620 2.40 GHz 四核 …

performance sql-server-2008 sql-server

11
推荐指数
1
解决办法
1918
查看次数

如何允许执行存储过程但不允许写入?

我想在我的 SQL Server 2012 实例上设置一个“阅读”用户。我想让他有权执行任何存储过程、函数或直接 SQL 语句,这些语句从所有表和视图中检索数据,但不能更新或插入(即读取任何内容,不写入任何内容)。

我是否可以在不按名称专门授予每个函数或存储过程的权限的情况下进行设置,而是授予他对任何函数或存储过程的执行权,而只是剥夺修改表的权利?

如果我改为运行 SQL Server 2008,会有什么变化吗?

澄清和补充:

  1. 如果存储过程更改数据,用户应该收到错误消息(拒绝修改或完全拒绝访问存储过程)。
  2. 如果潜在的解决方案涉及拒绝权限,我可以不授予某些权限而不是拒绝吗?
  3. 是否可以在一个语句中对数据库中的所有表、视图等(现在和将来存在的)应用拒绝?

sql-server-2008 sql-server permissions sql-server-2012

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

查找导致缺少索引 DMV 的查询

如何找到导致建议创建特定索引的缺失索引 DMV 的查询?

谢谢你。

index sql-server-2008 sql-server sql-server-2008-r2 dmv

11
推荐指数
1
解决办法
5704
查看次数

错误:无法生成 SSPI 上下文

当有人尝试连接到 SQL Server 实例时,会显示错误:

不可能生成 SSPI 上下文。

昨天我们停电了(不知道这个用英语怎么说),我不得不关闭我们的服务器。

寻找答案,我发现了这个:

SQL Server 2008 连接问题:无法生成 SSPI 上下文

但这对我没有帮助,因为直到昨天它们都工作正常。我不想改变任何东西。但如果有必要,我会改变它。

Obs:我现在无法重新启动服务器。


编辑:自从我回答以来,我们没有任何错误。

sql-server-2008 authentication sql-server errors connectivity

11
推荐指数
2
解决办法
12万
查看次数

使用 ORDER BY 从不同表中选择 TOP 1 时如何设置索引视图

我正在努力在以下场景中设置索引视图,以便在没有两个聚集索引扫描的情况下执行以下查询。每当我为此查询创建索引视图然后使用它时,它似乎忽略了我放在它上面的任何索引:

    -- +++ THE QUERY THAT I WANT TO IMPROVE PERFORMANCE-WISE +++

    SELECT TOP 1 *
    FROM    dbo.TB_test1 t1
            INNER JOIN dbo.TB_test2 t2 ON t1.PK_ID1 = t2.FK_ID1
    ORDER BY t1.somethingelse1
           ,t2.somethingelse2;


    GO
Run Code Online (Sandbox Code Playgroud)

表设置如下:

  • 两张桌子
  • 它们通过上面的查询通过内部连接连接起来
  • 并通过上面的查询从第一个表中的一列和第二个表中的一列排序;仅选择 TOP 1
  • (在下面的脚本中也有一些行来生成测试数据,以防万一它有助于重现问题)

    -- +++ TABLE SETUP +++
    
    CREATE TABLE [dbo].[TB_test1]
        (
         [PK_ID1] [INT] IDENTITY(1, 1)  NOT NULL
        ,[something1] VARCHAR(40) NOT NULL
        ,[somethingelse1] BIGINT NOT NULL
            CONSTRAINT [PK_TB_test1] PRIMARY KEY CLUSTERED ( [PK_ID1] ASC )
        );
    
    GO
    
    create TABLE [dbo].[TB_test2]
        (
         [PK_ID2] [INT] IDENTITY(1, …
    Run Code Online (Sandbox Code Playgroud)

index sql-server-2008 sql-server materialized-view index-tuning

11
推荐指数
1
解决办法
1245
查看次数

可以默认配置/使用 sp_executesql 吗?

我正在查看一个对 SQL Server 使用高度动态 sql 查询的应用程序。查看以非常奇怪和复杂的方式构建的查询,但这是一个不同的故事,我告诉它是为了给我无法(太愚蠢)自己找出问题的充分理由......我看不到查询用sp_executesql.

但是当我跟踪时,我可以看到很多查询都包含在sp_executesql. 整个应用程序解决方案甚至根本不包含该命令sp_executesql

所以我想知道是否有一种我还不知道的配置强制软件默认使用 sp_executesql 包装查询?

什么可能导致这种行为?

sql-server-2008 sql-server dynamic-sql

11
推荐指数
2
解决办法
2690
查看次数

是否可以根据 SQL Server 版本选择 RAISERROR 或 THROW?

这是我现在的代码:

BEGIN TRY
INSERT INTO TABLE (F1,F2,F3) 
VALUES ('1','2','3')
END TRY
BEGIN CATCH
;THROW
END CATCH
Run Code Online (Sandbox Code Playgroud)

效果很好,除非它在装有 SQL 2008 的机器上运行。我想让 CATCH 块检查 SQL 版本并运行 THROW(如果它等于或高于 2012 年),如果是 2008 年则运行 RAISERROR。我一直遇到语法错误,我想知道是否有可能。即使像这样简单的事情也不适合我。

BEGIN CATCH
IF ((SELECT SERVERPROPERTY('productversion')) >= 11) ;THROW
END CATCH
Run Code Online (Sandbox Code Playgroud)

任何建议表示赞赏。

sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012 sql-server-2014

11
推荐指数
1
解决办法
925
查看次数

SQLServer 升级顾问 2014 挂起

我尝试针对 SQL Server 2008 服务器运行 SQL Server Upgrade Advisor 2014。

连接到 2008 服务器时一切正常,我可以选择要分析的数据库。

在此处输入图片说明

但是一旦启动,它就会永远运行,什么也不做(停留在分析规则:0/112步骤)。

在此处输入图片说明

发生了什么,我该如何解决?

SQL Server 2008 和 2014 都是 Express 版本并安装在我的笔记本电脑上。不幸的是,这是我发现运行升级顾问的唯一方法(在真正的生产/开发数据库上运行它有太多限制)。

SQL 2008 实例根据需要使用 SP3 。

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)   Sep 21 2011 22:45:45   Copyright (c) 1988-2008 Microsoft Corporation  Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) 
Run Code Online (Sandbox Code Playgroud)

当 Advisor 被冻结时,我们可以看到 4 个休眠查询(没有活动查询):

SELECT name,
       cmptlevel
FROM
  (SELECT name,
          dbid,
          cmptlevel,
          DATABASEPROPERTYEX(name, N'UserAccess') AS 'UserAccess',
          DATABASEPROPERTYEX(name, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server upgrade sql-server-2014

11
推荐指数
1
解决办法
447
查看次数