标签: sql-server-2008

如何在 SQL Server DDL 中使用事务?

我有一个登录表,所有插入都由一个存储过程完成。

CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(1, 1) NOT NULL,
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log PRIMARY KEY CLUSTERED  (LogRefnr)
)
go


Create procedure DBO.LogInsert ( @Query varchar(255), @time datetime, @duration int, @SessinID int) as
begin
    Insert into LogTable ( LogRefnr, LogQuery, logQueryDuration, LogSessionID)
    Values  (@Query, @time, @duration, @SessinID);
end;
GO
Run Code Online (Sandbox Code Playgroud)

目前该表中大约有 45500000 行,我想将日志记录定向到不同的表。

我的想法是使用以下脚本

begin Transaction

exec sp_rename LogTable, LogTableOld;

CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(46000000, 1) NOT NULL, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 transaction ddl

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

用于监视 SQL Server 数据库状态的最佳查询是什么?

我希望能够运行查询以获取有关数据库状态的关键信息。即,我希望查询能够判断数据库是否处于良好状态。

这是我为此检查继承的查询:

SELECT name AS [SuspectDB],
  DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
  DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
  DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency],
  has_dbaccess(name) AS [HasDBAccess]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
   OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
   OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
   OR (has_dbaccess(name) = 0)
Run Code Online (Sandbox Code Playgroud)

如果该查询返回任何结果,则假定数据库处于可疑或潜在的不良状态。

有一个更好的方法吗?

sql-server-2008 sql-server

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

什么时候应该使用扩展事件而不是 SQL Profiler/perfmon?

扩展事件似乎是一种更好的技术,对服务器的压力更小,但 SQL Profiler/perfmon 具有更好的工具。此外,扩展事件似乎具有更陡峭的学习曲线。每个应该在什么上下文中使用?是否值得通过陡峭的学习曲线来利用扩展事件?

sql-server-2008 sql-server profiler perfmon extended-events

21
推荐指数
1
解决办法
4408
查看次数

盲目添加缺失的索引可以吗?

我经常使用 SSMS 来测试我的慢速存储过程是否缺少索引。每当我看到“缺少索引(影响 xxx)”时,我的下意识反应就是创建新索引。据我所知,这每次都会导致更快的查询。

为什么我不应该继续这样做?

index sql-server-2008 sql-server ssms

21
推荐指数
2
解决办法
4524
查看次数

SQL:如果不是 CPU 或 IO,什么会降低 INSERT 的速度?

我们有一个写大量产品的数据库。我们刚刚购买了一台带有 SSD 的新服务器机器来提供帮助。令我们惊讶的是,插入速度并不比存储速度慢得多的旧机器快。在基准测试期间,我们注意到 SQL Server 进程表现出的 IO 率非常低。

例如,我运行了在此页面上找到的脚本,只是在循环中添加了 BEGIN TRAN 和 COMMIT。我最多只能看到磁盘使用率达到 7Mb/s,而 CPU 几乎没有达到 5%。服务器安装了 64Gb 并使用了 10 个。第一次调用的总运行时间为 2 分 15 秒,后续调用大约需要 1 分钟。数据库正在简单恢复并且在测试期间处于空闲状态。我在每次通话之间放下了桌子。

为什么这么简单的脚本这么慢?硬件几乎没有被使用。专用磁盘基准测试工具和 SQLIO 均表明 SSD 以高达 500Mb/s 的读取和写入速度正确执行。我知道随机写入比顺序写入慢,但我希望像这样的简单插入,对没有聚集索引的表,要快得多。

最终我们的场景要复杂得多,但我觉得我需要先了解一个简单的案例。简而言之,我们的应用程序删除旧数据,然后使用 SqlBulkCopy 将新数据复制到临时表,执行一些过滤,最后根据情况使用 MERGE 和/或 INSERT INTO 将数据复制到最终表。

--> 编辑 1:我按照 Martin Smith 链接的程序进行操作,得到以下结果:

[Wait Type]  [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO          5008              46735                 46587        148
LOGBUFFER           901               5994                  5977         17
PAGELATCH_UP        40                866                   865          1 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2008 sql-server

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

跟踪存储过程的使用

除了使用 SQL Server Profiler 之外,还有什么方法可以跟踪正在使用的存储过程,或者至少是上次执行它们的时间?

sql-server-2008 sql-server statistics

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

有人在生产中使用 HierarchyId 吗?它可靠吗?

是否有人在实际生产中使用 HierarchyId 使用合理大小的表,超过几千行?它可靠/性能好吗?到目前为止,我还没有发现任何与供应商无关的人推荐它,并且 Paul Nielsen在这里建议不要使用它。

您在实际生产系统中使用 HierarchyId 的经验是什么?

当您选择 HierarchyId 而不是其替代品时,您使用了哪些标准?

sql-server-2008 sql-server hierarchy

21
推荐指数
2
解决办法
8549
查看次数

当我选择一个持久化的计算列时,为什么 SQL Server 会“计算标量”?

SELECT这段代码中的三个语句

USE [tempdb];
GO

SET NOCOUNT ON;

CREATE TABLE dbo.persist_test (
      id            INT NOT NULL
    , id5           AS (id * 5)
    , id5p          AS (id * 5) PERSISTED
);

INSERT INTO dbo.persist_test (id)
VALUES (1), (2), (3);

SELECT id
FROM dbo.persist_test;

SELECT id5
FROM dbo.persist_test;

SELECT id5p
FROM dbo.persist_test;

DROP TABLE dbo.persist_test;
Run Code Online (Sandbox Code Playgroud)

生成这个计划:

执行计划

为什么SELECT选择持久值的 final生成计算标量运算符?

sql-server-2008 sql-server execution-plan

21
推荐指数
1
解决办法
7769
查看次数

“找不到存储过程”,即使已在 MS SQL Server Management Studio 中创建存储过程

testtable在数据库testbase中创建了一个具有以下结构的表:

product_no (int, not null)
product_name (varchar(30), not null)
price (money, null)
expire_date (date, null)
expire_time (time(7), null)
Run Code Online (Sandbox Code Playgroud)

我使用了 Microsoft SQL Server 2008 Management Studio。

我创建了一个存储过程testtable_pricesmaller如下

use testbase
go
create procedure testtable_pricesmaller
    @pricelimit money
as
select * from testtable where price = @pricelimit;
go
Run Code Online (Sandbox Code Playgroud)

并且能够查看Object ExplorerMicrosoft SQL Server Management Studio上的存储过程。(它在下面的树结构中列出Object Explorer

Databases
    + testbase
        + Tables
            + dbo.testtable
        + Programmability
            + Stored Procedures
                + dbo.testtable_pricesmaller
Run Code Online (Sandbox Code Playgroud)

当我收到以下错误时,我觉得很奇怪:

Could not find the …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 stored-procedures ssms

21
推荐指数
4
解决办法
17万
查看次数

ROLLBACK 是快速操作吗?

RDBMS 系统是否针对COMMIT操作进行了优化?ROLLBACK操作慢/快多少?为什么?

rdbms performance sql-server-2008 transaction rollback

20
推荐指数
5
解决办法
6982
查看次数