标签: sql-server-2008

加入到@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
查看次数

RESOURCE_SEMAPHORE_QUERY_COMPILER 在 Microsoft SQL Server 2008 Enterprise 中等待

Microsoft SQL Server 2008 Enterprise 上的碎片索引是否会导致 RESOURCE_SEMAPHORE_QUERY_COMPILER 等待?

由于 RESOURCE_SEMAPHORE_QUERY_COMPILER 等待,我们的一个应用程序在过去两周内出现了停机。我们通过重建索引来“修复”它们;这只是在黑暗中的一个镜头。

应用程序供应商已经“深入研究”并“找到了根本原因”,他们声称这是索引碎片,他们的建议是实施我们已经实施的解决方法:每周重建索引(在发布时就已就位)和每晚重组(新)。

我担心的是应用程序供应商只是拿走了我们的工作并声称它是他们自己的。当我们最初偶然发现此修复程序时,我们认为它是一种不太可能导致问题的临时解决方法(很难反对重建/重组索引)。这个问题是在我们最大的用户繁忙时间之后开始的,所以使用率和索引碎片下降了。我们刚刚清除了大量数据,因此碎片百分比会变得更容易(当我们遇到信号量问题时达到峰值约 22%),但百分比仍然显着下降。

我担心的是,我们正在对这种情况进行创可贴,我们再次遇到问题只是时间问题。如果查询需要很长时间,我可以理解,但对我来说,编译查询时出现内存问题似乎很奇怪。

随机位信息:

  • 两台应用服务器,并发用户约 130
  • 专用数据库服务器
    • Microsoft SQL Server 2008 企业版
    • 2 x 至强 E5-2650 @ 2.3 GHz
    • 64 GB 内存(不知道详情)
    • 千兆以太网 x 3
  • 数据库的数据文件是 199GB
  • 根据 sp_spaceused
    • database_size 为 37831736 KB
    • index_size 为 54547920 KB
  • 日志和数据文件是一个专用驱动器;两个驱动器都在 iSCSI SAN 上并且是 RAID10
  • 数据库中没有分区

如果我遗漏了一些重要的事情,我深表歉意;让我知道,我会尝试添加它。

编辑:

当我们每天重新组织时,我们正在重新编译统计信息,很明显,当我们重建索引时会完成,所以我将花一些时间研究我们的查询计划。我真的很感谢指导。

performance index sql-server-2008

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

使用 NORECOVERY 进行 RESTORE 需要多长时间

我处于不得不进行数据库恢复的不幸情况。

我的完整备份是在晚上 9.30 (157MB) 进行的,并且在上午 11 点和下午 3 点进行了增量备份。每个增量备份小于 30kb。现在是下午6点。

当我用 WITH RECOVERY 恢复完整备份时,用了不到一分钟。但是我无法应用这两个事务日志。

当我用 NORECOVERY 恢复完整备份时,也花了不到一分钟就说它成功了,但随后数据库仍处于正在恢复...状态。在过去的 40 分钟里一直是这样。任务管理器几乎没有显示任何活动。这是正常的吗?我应该流产吗?

sql-server-2008 sql-server

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

为什么 CDC 捕获由于缺少 dbo 主体而失败

我在针对我的一些测试数据库运行 CDC 更改捕获作业时遇到问题。

我收到的错误消息如下:

以用户身份执行:NT AUTHORITY\NETWORK SERVICE。无法作为数据库主体执行,因为主体“dbo”不存在,无法模拟此类主体,或者您没有权限。[SQLSTATE 42000](错误 15517)。

我怎样才能解决这个问题?

sql-server-2008 sql-server change-data-capture

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

我可以在不授予系统管理员权限的情况下委派 SQL 代理权限吗?

我想让用户能够管理 SQL 代理作业。根据文档页面,我可以通过在 msdb 上授予“适当的”角色来做到这一点。我已授予所有三个 SQLAgent% 角色,但用户在(作为测试)尝试重命名作业时收到此错误:

Only members of sysadmin role are allowed to update or delete jobs owned by a different login.
(Microsoft SQL Server, Error: 14525)
Run Code Online (Sandbox Code Playgroud)

这个问题是类似的,但没有解决 SQL 代理的答案。在 MS SQL 2K8 中,系统管理员角色是唯一的解决方案吗?

sql-server-2008 permissions sql-server-agent

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

索引顺序如何影响 SQL Server 中的性能?

我想知道索引的顺序如何影响性能(ASC、DESC)?如果有影响,为什么?我应该选择哪个顺序?

performance sql-server-2008 sql-server query-performance performance-tuning

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

空间查询结果的可视化工具

这个问题什么是将 sql 08 空间数据放到地图上的最简单方法?(以及许多其他文章)推荐 Craig Dunn 的 Geoquery,但所有下载链接似乎都已失效。

SQL Server Managament Studio 的空间结果选项卡将显示单个数据集,这篇 MSDN 文章SQL Server 2008中的空间数据支持提到了一种UNION ALL用于显示叠加在地图上的点数据的解决方法:

SELECT geog, name FROM Mondial.dbo.city WHERE geog IS NOT NULL 
UNION ALL 
SELECT geog, cntry_name FROM SpatialSamples.dbo.cntry00
Run Code Online (Sandbox Code Playgroud)

每当我尝试类似的事情时,我只会显示一个结果集。

SQL Server 2008 或 2012 中是否有内置的东西来做到这一点?

sql-server-2008 sql-server spatial

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

我们如何从触发器内部获取表名?

我需要将表名从触发器传递到过程。

ALTER TRIGGER [dbo].[Trg_ProjectCreation] 
   ON  [dbo].[Projects] 
   AFTER INSERT
AS 
BEGIN   
    SET NOCOUNT ON; 
 -- procedure call 
    exec Proc_Test @Tablename (not need to hardcode)
END
Run Code Online (Sandbox Code Playgroud)

我想知道有什么方法可以从触发器本身获取表名。我需要它是动态的,因为当表的名称更改时,我不想更改我的代码。

trigger sql-server-2008 t-sql

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

SQL Server 使用的总内存(64 位)

我对这个主题的了解表明 perf counter SQL Server:Memory Manager: Total Server Memory 只给你缓冲池内存。在名为 sys.dm_os_process_memor 的 DMV 中有一个名为 physical_memory_in_use 的列,它为您提供物理工作集。

但我不确定...

是否有 DMV 或性能计数器可以告诉我在 64 位 Windows 操作系统上运行的 64 位 SQL Server 2008 R2 和 SQL 2012 的 SQL Server 进程使用的总物理内存(缓冲池 + 非缓冲池,即 MemToLeave)?

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

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

我应该使用复合索引还是单列索引?

我的数据库表 ( Medicines) 中有以下列。

ID bigint, 
MedicineName nvarchar(50), 
BrandName nvarchar(50), 
MedicineCode nvarchar(20),
and price,quantity.
Run Code Online (Sandbox Code Playgroud)

我正在使用此查询创建存储过程:

create proc searchmedicine
@name nvarchar(50)=null,@brand nvarchar(50)=null, @code nvarchar(20)=null
as
select * from Medicines
where MedicineName= Case WHEN @name IS NOT NULL THEN @name ELSE MedicineName END
AND BrandName=Case WHEN @brand IS NOT NULL THEN @brand ELSE BrandName END
AND MedicineCode=Case WHEN @code IS NOT NULL THEN @code ELSE MedicineCode END
Run Code Online (Sandbox Code Playgroud)

现在我很困惑哪个非聚集索引更适合帮助优化查询:复合列还是单列?

index sql-server-2008 sql-server

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