标签: sql-server

递归 CTE 性能

需要有关递归 CTE 性能的帮助。低于 CTE 的运行速度非常慢,因为它试图以递归方式提取分层数据。表很大,每个根 ID 最多有 3 个递归 itemid。可能有大约 200000 个或更多的 root id。我知道递归 CTE 对于庞大的数据集来说很慢,因为对于锚点中的每个 rootid,它都会递归地进行 itemid。

架构:

Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime)
Run Code Online (Sandbox Code Playgroud)

上表有超过 100 万行。

CTE 查询:

; With rootcte as

( select itemid from RootItem where rootid is null

union all

  select r.itemid as RootId , i.itemid from RootItem i join rootcte r
    on i.rootid = r.itemid
)
Run Code Online (Sandbox Code Playgroud)

我们无法修改表架构并使用层次结构。我也试过 while 循环,但这也很慢。

有没有其他方法可以优化此查询?

 ; With rootcte as

( select itemid from …
Run Code Online (Sandbox Code Playgroud)

performance sql-server cte sql-server-2008-r2 recursive

8
推荐指数
1
解决办法
4842
查看次数

从 SQL Server 2000 到 2008 的事务复制

我在两台 SQL Server 2000 服务器上有旧数据库,我试图使用事务复制将它们复制到 SQL Server 2008 R2 数据库。

2008 服务器不在同一个局域网中,所以我在互联网上进行复制。我创建了别名,以便每个服务器都可以按名称(复制所需)或多或少地按照 MohammedU(和其他人)的描述连接到其他服务器:http : //social.msdn.microsoft.com/forums/en-US/ sqlreplication/thread/9a8cf6b1-a449-4748-b3c2-1c13e2bfcc5b/

唯一的区别是我使用客户端网络实用程序而不是配置管理器在 SS2000 机器上创建别名。这似乎工作正常。

我设置了一台 SS2000 服务器,称为分发服务器,作为两者的分发服务器。我已经成功地在 Distributor 上创建了发布,并使用推送订阅将它们复制到 SS 2008 服务器,称之为订阅服务器。

我现在已经在第二台 SS2000 服务器上设置了发布,将其命名为 Publisher。我以同样的方式为他们创建了推送订阅。这些订阅不起作用。

在分发服务器上的复制监视器中,发布服务器上发布的分发代理具有以下错误消息:

Error message: The process could not connect to Subscriber 'SUBSCRIBER'
Error details: Login failed for user 'SUBSCRIBER\Guest.' 
(Source: SUBSCRIBER (Data source); Error number: 18456)
Run Code Online (Sandbox Code Playgroud)

我还尝试在订阅者上创建拉订阅。向导说它们已成功创建,并且相应的分发代理正确显示在分发服务器上的复制监视器中,但复制从未发生。代理一直显示快照不可用的消息,即使它可用。

任何人都可以帮忙吗?

replication sql-server-2008 sql-server sql-server-2000

8
推荐指数
1
解决办法
1169
查看次数

如何在使用而不是触发器时插入最后一个标识行

当我插入表使用INSTEAD OF触发器,@@IdentityIDENT_CURRENT('Table')SCOPE_IDENTITY()返回null。如何获取插入行的最后一个标识?

trigger sql-server-2008 sql-server t-sql identity

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

为什么 SQL Server 2005 上的页面预期寿命为 0(零)

我们一直想知道 SQL Server 的页面预期寿命。所以我们使用 Perform 来查看计数器。该值为零且永不更改。我认为一定有一些错误,所以我检查了 SQL Server DMV 查询

SELECT [object_name],[counter_name],[cntr_value]
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Manager%'
AND [counter_name] = 'Page life expectancy'
Run Code Online (Sandbox Code Playgroud)

这也整天返回零。

为了让这更有趣,我们检查了“缓冲区缓存命中率”计数器,它的平均值约为 99-100。

那么当“缓冲区缓存命中率”为 100 时,页面预期寿命如何为零?

我们缺少什么?如果它始终为零,那对我来说意味着缓冲区缓存中没有任何内容,如果缓冲区缓存命中率是 100,这似乎不正确?

提前致谢

sql-server-2005 sql-server page-life-expectancy

8
推荐指数
1
解决办法
1292
查看次数

存储顺序与结果顺序

这是主键中指定的排序顺序的衍生问题,但排序是在 SELECT 上执行的

@Catcall关于存储顺序(聚集索引)和输出顺序的主题

很多人认为聚集索引可以保证输出的排序顺序。但这不是它的作用。它保证了磁盘上的存储顺序。 例如,请参阅此博客文章

我已经阅读了 Hugo Kornelis 的博客文章,并了解到索引并不能保证 sql server 以特定顺序读取记录。然而,我很难接受我不能为我的场景假设这一点?

CREATE TABLE [dbo].[SensorValues](
  [DeviceId] [int] NOT NULL,
  [SensorId] [int] NOT NULL,
  [SensorValue] [int] NOT NULL,
  [Date] [int] NOT NULL,
CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED 
(
  [DeviceId] ASC,
  [SensorId] ASC,
  [Date] DESC
) WITH (
    FILLFACTOR=75,
    DATA_COMPRESSION = PAGE,
    PAD_INDEX = OFF,
    STATISTICS_NORECOMPUTE = OFF,
    SORT_IN_TEMPDB = OFF,
    IGNORE_DUP_KEY = OFF,
    ONLINE = OFF,
    ALLOW_ROW_LOCKS = ON,
    ALLOW_PAGE_LOCKS = ON)
  ON …
Run Code Online (Sandbox Code Playgroud)

sql-server clustered-index execution-plan sorting

8
推荐指数
1
解决办法
4773
查看次数

SQL Server 的日期值是否存储为单个整数?

正如SQLDenis 解释的DATETIME那样INT,SQL Server 在内部存储为两个值。

DATE类型(SQL Server 2008+)存储为单个 是否正确(按逻辑扩展)INT

sql-server

8
推荐指数
1
解决办法
1426
查看次数

事务日志和镜像 - 寻找可能的最愚蠢的解释

首先,我必须承认我对事务日志的概念感到困惑。我的意思是 - 我确实理解它是发生在数据库上的所有事务的日志,但是当谈到将它正确地放入某些任务的上下文中时,我显然缺少一些东西。因此,对于将要回答这个问题的任何人 - 请随意扩展事务日志背后的理论。

主要问题是 - 我有需要镜像的 SQL Server 2008 和 2 GB 数据库(有 12 GB 事务日志)。如果我没有镜像该数据库,我认为我可以切换到简单模式或在备份后截断日志。但在这种情况下 - 如果我希望控制该事务日志,我该怎么办?据我了解 - 如果我希望能够轻松镜像数据库(只需进行完整备份),我需要保留整个事务日志。

有没有办法解决?理想情况下,我希望可以进行备份,每次将 MDF 和 LDF 都保存在 1 个文件中,并且在备份完成后,数据库上的事务日志 (LDF) 减少到 0。这种情况下的问题是增量备份 - 如果我的第一次备份截断的日志,我认为如果我想稍后进行镜像,第二个备份需要引用第一个(即我会坚持保留一堆文件而不是一个文件)。

那么 - 任何人都可以在这个主题上启发我吗?我知道我试图在这里填补很多漏洞,我提出的“解决方案”可能不是最好的,但如果有人能推动我在事务日志上朝着正确的方向前进,它们如何影响镜像和最佳解决方案,我将不胜感激与那两个练习。

sql-server mirroring transaction-log

8
推荐指数
1
解决办法
4149
查看次数

逻辑读取与扫描计数

我在 SQL Server 2008 中将一个小表(1,000 行)与一个大表(8M 行)连接起来。连接使用大表上的非聚集覆盖索引,连接可以产生三种可能的查询计划。我试图找出哪个计划更好,但我也想概括这些知识,以便下次我可以更好地了解在查看 SQL I/O 统计信息时使用什么启发式方法。

计划 #1 是一个循环连接,并为大表发出统计信息,如下所示:

Scan count 2582, logical reads 35686, physical reads 1041, read-ahead reads 23052
Run Code Online (Sandbox Code Playgroud)

计划 #2 是一个合并连接并发出如下统计信息:

Scan count 1, logical reads 59034, physical reads 49, read-ahead reads 59004
Run Code Online (Sandbox Code Playgroud)

计划 #3 是一个散列连接并发出如下统计信息:

Scan count 3, logical reads 59011, physical reads 5, read-ahead reads 59010
Run Code Online (Sandbox Code Playgroud)

覆盖索引按 排序(ID, Date)。查询返回大约 50% 的 ID 的数据,并且对于每个 ID,返回最近 3 个月数据的连续块,通常大约为每个 ID 的 1/4 或行。该查询返回索引中大约 1/8 的总行数。换句话说,查询是稀疏的,但始终如此。

我的假设是,计划 #1 对这种工作负载很糟糕,因为将磁盘磁头移动 2,500 次(甚至 1,041 次)比顺序磁盘扫描要昂贵得多。我还假设#3 …

sql-server-2008 sql-server

8
推荐指数
1
解决办法
6060
查看次数

如何让 SQLCMD 只输出错误和警告?

在执行 SQL 脚本文件时,如何让 SQLCMD 只输出它遇到的任何错误或警告?

我基本上不希望输出基于信息的消息。

sql-server sql-server-2008-r2 sqlcmd

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

参数嗅探解决方法

过去我使用过两种方法来解决参数嗅探问题:

1) 使用WITH RECOMPILE
2) 将参数值重新分配给局部变量并使用这些值代替参数

据我了解,这两者的最终结果是相同的 - 创建并使用针对当前查询/参数优化的新执行计划。

如果这是真的,这两种方法之间有什么区别吗,或者它们本质上是一样的?一个比另一个更可取吗?

sql-server parameter-sniffing

8
推荐指数
1
解决办法
561
查看次数