标签: sql-server

从存储过程中引用数据库?

我正在使用此 T-SQL 来获取索引统计信息(为简洁起见进行了编辑):

SET @db_id = DB_ID(N'TestDB');
SET @object_id = OBJECT_ID(N'TestDB.dbo.Users');
SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'LIMITED');
Run Code Online (Sandbox Code Playgroud)

我希望能够将它封装到一个存储过程中,并为存储过程所在的任何数据库调用它,但数据库名称是硬编码的,如何动态获取数据库名称?

T-SQL 有没有类似的东西:

SET @db_id = DB_ID(this);

sql-server t-sql

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

优化 SQL Server 中的简单查询

这应该是一个非常简单的查询,但老实说,我认为它的执行时间可以改进。

select idTag,MAX(pctimestamp) AS PCTIMESTAMP,getdate() AS NOW, datediff(SECOND,MAX(pctimestamp),getdate()) AS DELAY 
from ValuesTagsOPC
group by IdTag
Run Code Online (Sandbox Code Playgroud)

此查询从“ValuesTagsOPC”表返回 1386 行,该表包含大约 4000 万行,并具有以下结构,由创建脚本检索:

CREATE TABLE [dbo].[ValuesTagsOPC](
    [IdTag] [int] NOT NULL,
    [TTimeStamp] [datetime] NOT NULL,
    [PCTimeStamp] [datetime] NOT NULL,
    [Value] [nvarchar](50) NOT NULL,
    [Quality] [int] NOT NULL,
 CONSTRAINT [PK_ValuesTagsOPC] PRIMARY KEY CLUSTERED 
(
    [IdTag] ASC,
    [PCTimeStamp] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

很明显,它的主键上有一个聚集索引。SQL Server 的时间和 IO 统计信息如下(抱歉,它是西班牙语):

(1386 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server query-performance

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

64 位 SQL Server 上的 32 位 ODBC 驱动程序

我无法将 ODBC 64 位驱动程序与在 SQL Server 2012 64 位实例上运行的 SSMS 2012 一起使用。但是,我相信 32 位驱动程序可以工作。

我的问题是我可以使用 SSMS 2005 32 位在 SQL Server 2012 的 64 位实例上使用 ODBC 创建链接服务器吗?我尝试这样做,但是当我单击“确定”以创建链接服务器时,我收到了消息:

索引超出数组范围

我在做什么完全错误,或者有什么方法可以使用 32 位 ODBC 连接创建此链接服务器?

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

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

同步查询从 DMV 检索会话和锁

我有一个 SQL 脚本,当我想查看数据库中发生的事情时运行该脚本。该脚本有许多从 DMV 返回信息的查询,但我最常用的两个是“请求”(sys.dm_exec_requestssys.dm_exec_sessions等)和“锁”(sys.dm_tran_locks)。输出类似于 SQL Server 活动监视器,但它显示更多信息。

有时,请求会出现在 Requests 查询中,但它会在 Locks 查询运行之前完成。例如,Requests 查询可能显示 SPID 51 正在等待锁定资源,但 Locks 查询不包含 SPID 51 的任何锁定信息。(我知道来自的wait_typewait_resourcesys.dm_exec_requests。)

有没有办法确保这两个单独的查询显示数据库活动的连贯快照?

我预计商业数据库监控应用程序一定会遇到同样的问题。

我已经尝试在 SERIALIZABLE 并发中运行这些查询并向 DMV 连接添加锁定提示,但查询未获取锁定。无论如何,我不想在生产中这样做。

到目前为止,我最好的想法是:

  1. 从不同的会话同时运行这些查询。

  2. 在一个查询中加入请求和锁。考虑到我一次看到超过 100,000 个锁,这个连接会返回很多重复的请求和会话数据,但它可能会起作用。

我对扩展事件不够熟悉,不知道它们是否会更好地工作——也许是事件配对?

sql-server t-sql dmv

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

仅将 SQL Server 2012 用于商业智能功能,无数据库引擎

我想完全为商业智能功能实现 SQL Server 2012:SSIS、SSAS 和 SSRS 在它自己的服务器上。

我目前在另一台服务器上安装了 SQL Server 2008R2 数据库引擎。它由供应商维护,因此无法升级到 2012。

根据我在 SQL Server 20102 商业智能工具中的理解,您可以使用 2008R2 数据库作为数据库目标/源。理想情况下,我希望能够创建 2012 BI 项目:SSIS、SASS 和 SRSS,并将解决方案部署到 Sql Server 2012,但转换 2008R2 数据库中的数据。

这个设置可以吗?如果是这样,除了许可之外,还有什么缺点或潜在问题吗?

sql-server business-intelligence sql-server-2008-r2 sql-server-2012

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

INT IDENTITY 列上的 PK 分片

有简单的Int Identity我PK。

表有 220 万行。

删除了零行,从未禁用身份。

一次通过 .NET 插入一行,每次插入都检索SCOPE_IDENTITY().

20 与它的一些 FK 关系。

我有 98% 的碎片。

知道是什么原因造成的吗?

我知道修复是重建,今晚会这样做。

我想知道如何避免它。

自从填充以来,我已经添加了 3 列。
一些列几乎修改了每个值。
属性的长度没有太大变化。

表定义

/****** Object:  Table [dbo].[docSVsys]    Script Date: 02/13/2013 15:52:46 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[docSVsys](
    [sID] [int] IDENTITY(1,1) NOT NULL,
    [sParID] [int] NULL,
    [docID] [varchar](100) NOT NULL,
    [attBeg] [varchar](100) NULL,
    [attEnd] [varchar](100) NULL,
    [docDate] [smalldatetime] NULL,
    [addDate] [smalldatetime] NOT NULL,
    [mimeType] [varchar](40) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

MS-BIDS 中的高级列

因为我们遇到了与http://social.msdn.microsoft.com/Forums/en/sqlintegrationservices/thread/e51b775a-8601-491b-8ad4-a71b0f0d59ce 中相同的问题,所以我们有以下问题:那是从平面文件源我们 wmi 是文件的最后一行。

你能告诉我们在哪里可以找到高级列视图以将文本限定设置为 false 吗?提前致谢。

sql-server

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

在 SQL Server 数据库中查找字符串

我有一个应用程序,它记录了一个错误,如

Object <obj id> generated an exception.
Run Code Online (Sandbox Code Playgroud)

该应用程序将其所有信息存储在包含 100 多个表的 SQL Server 数据库中。

肯定在某个地方必须有一个包含这种类型的所有对象的表,我确定obj id那里是关键列。

我怎样才能找到这个对象?我是否必须创建 100 多个SELECT查询来查询每个表,或者可能有更方便的解决方案?

sql-server

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

主键会被添加为聚集索引吗?

我继承了一个数据库,其中没有在表上定义主键。也没有分配给表的聚集索引。

如果我执行一个更改表来分配主键,这会导致 SQL Server 也创建聚集索引吗?如果是这样,由于数据在硬盘上重新定位,我应该期望数据库速度变慢吗?

index sql-server-2008 database-design sql-server

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

为插入和删除优化审计表

我正在尝试确定为审计目的设计表格的最佳方式。基本上,我在一张表中为许多用户记录了几个最后的事件。每个用户的记录数有限制。新记录来了,旧记录走了。

像这样的东西:

CREATE TABLE Audit
(
  UserId INT NOT NULL,
  EventId INT NOT NULL,
  CreationDate DATETIME NOT NULL,
  UpdateDate DATETIME NULL,
  -- Other data fields
)
Run Code Online (Sandbox Code Playgroud)

问题是如何处理索引。我正在考虑在(UserId, EventId). 但是由于用户活动是独立发生的,这意味着在表中间插入并在表中间删除。恐怕不好。

另一个想法是添加一个人工AuditId字段只是为了让新记录的数量增加。像这样:

CREATE TABLE Audit
(
  Id INT, -- Becomes the clustered index
  -- The same as above
)
Run Code Online (Sandbox Code Playgroud)

这样,新的审计条目将被附加到末尾,但删除仍将发生在表的中间。它可能比第一个选项更好,但我不确定。

该表将被频繁使用,基本上每个用户活动都会被记录(1 次插入),并且最早的活动会在同一个事务中被删除(1 次删除)。这需要快速。好吧,我希望它在理想情况下是即时的,并且在性能方面不明显。

我还需要能够快速检索特定用户的记录集。它可能会被非聚集索引覆盖。

我正在寻求设计此表以获得最佳性能的建议。

编辑:我想我错过了一些重要的事情要提。

我试图追踪的不是瞬时的,而是一段时间内的。系统中有几个地方我需要这个。考虑用户正在做的某种活动可能会跨越某个时间段。如果满足某些条件,则重新使用(刷新、更新)现有活动。我只想删除旧的废弃活动。例如,在 2 周内,一个用户可能已经发布了 50 个活动,但对于另一个用户来说,产生的活动可能需要一年多的时间。这就是为什么我不希望所有用户一起使用一般有序的日志。

也不清楚我应该如何按日期时间进行聚类(如建议的那样)。我是在初始创建事件还是在更新事件上执行此操作?

performance sql-server index-tuning performance-tuning

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