需要有关递归 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) 我在两台 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)
我还尝试在订阅者上创建拉订阅。向导说它们已成功创建,并且相应的分发代理正确显示在分发服务器上的复制监视器中,但复制从未发生。代理一直显示快照不可用的消息,即使它可用。
任何人都可以帮忙吗?
当我插入表使用INSTEAD OF触发器,@@Identity,IDENT_CURRENT('Table')并SCOPE_IDENTITY()返回null。如何获取插入行的最后一个标识?
我们一直想知道 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,这似乎不正确?
提前致谢
这是主键中指定的排序顺序的衍生问题,但排序是在 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) 正如SQLDenis 解释的DATETIME那样INT,SQL Server 在内部存储为两个值。
DATE类型(SQL Server 2008+)存储为单个 是否正确(按逻辑扩展)INT?
首先,我必须承认我对事务日志的概念感到困惑。我的意思是 - 我确实理解它是发生在数据库上的所有事务的日志,但是当谈到将它正确地放入某些任务的上下文中时,我显然缺少一些东西。因此,对于将要回答这个问题的任何人 - 请随意扩展事务日志背后的理论。
主要问题是 - 我有需要镜像的 SQL Server 2008 和 2 GB 数据库(有 12 GB 事务日志)。如果我没有镜像该数据库,我认为我可以切换到简单模式或在备份后截断日志。但在这种情况下 - 如果我希望控制该事务日志,我该怎么办?据我了解 - 如果我希望能够轻松镜像数据库(只需进行完整备份),我需要保留整个事务日志。
有没有办法解决?理想情况下,我希望可以进行备份,每次将 MDF 和 LDF 都保存在 1 个文件中,并且在备份完成后,数据库上的事务日志 (LDF) 减少到 0。这种情况下的问题是增量备份 - 如果我的第一次备份截断的日志,我认为如果我想稍后进行镜像,第二个备份需要引用第一个(即我会坚持保留一堆文件而不是一个文件)。
那么 - 任何人都可以在这个主题上启发我吗?我知道我试图在这里填补很多漏洞,我提出的“解决方案”可能不是最好的,但如果有人能推动我在事务日志上朝着正确的方向前进,它们如何影响镜像和最佳解决方案,我将不胜感激与那两个练习。
我在 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 脚本文件时,如何让 SQLCMD 只输出它遇到的任何错误或警告?
我基本上不希望输出基于信息的消息。
过去我使用过两种方法来解决参数嗅探问题:
1) 使用WITH RECOMPILE
2) 将参数值重新分配给局部变量并使用这些值代替参数
据我了解,这两者的最终结果是相同的 - 创建并使用针对当前查询/参数优化的新执行计划。
如果这是真的,这两种方法之间有什么区别吗,或者它们本质上是一样的?一个比另一个更可取吗?
sql-server ×10
cte ×1
identity ×1
mirroring ×1
performance ×1
recursive ×1
replication ×1
sorting ×1
sqlcmd ×1
t-sql ×1
trigger ×1