我目前正在运行一个脚本,该脚本对 SQL Server 2005 数据库中的每个表执行 DBCC INDEXDEFRAG,一次一个表。由于空间限制和正常运行时间要求,不能使用 DBCC DBREINDEX 代替 INDEXDEFRAG。
我注意到对某些表进行碎片整理需要很长时间。例如,如果我检查“sys.dm_exec_requests”动态管理视图,我可以看到以下 INDEXDEFRAG 当前正在处理 table_id 为 829610394 的表的聚集索引:
DBCC INDEXDEFRAG (0, 829610394, 1)
我知道在碎片整理过程完成之前需要很长时间。撇开当前运行的脚本最终会对所有表进行碎片整理的事实不谈,在当前命令执行时,我在另一个表的聚集索引上手动运行另一个 DBCC INDEXDEFRAG 有什么危害吗?如果我这样做,实际上会同时对两个表进行碎片整理吗?
我知道在 SQL 管理工作室中,我可以右键单击表/触发器/键和script object as.... 给定对象的名称,有没有办法以编程方式执行此操作?
如果是这样,有没有办法找到与给定表关联的所有对象(主键、外键、触发器)并以编程方式编写所有这些对象?
我有一个数据库查询,它可能会导致一个很大的结果集。显示数据的客户端通过网络接收数据,因此我们的想法是通过仅从数据库中检索前 50 个结果并将它们发送到客户端来最小化传输的数据量。然后我将提供一种可能性,跳转到第二页以检索接下来的 50 个结果等(类似于 google 提供的内容)
问题是实现分页的有效方法是什么。我想确保 mssql 尽可能多地使用缓存,并且每次更改分页时都不会再次执行相同的缓存。
同时查询数据库的客户端较多。使用的sql引擎:MS SQL 2005
我的想法是:
但这真的是最有效的方法吗?或者您认为检索整个结果集并在将数据发送到客户端的代码中实现分页会更好吗?
谢谢你的提示!
问候, 托马斯
受管理层鼓励编写 SQL Server 存储过程的 C# 开发人员经常会产生这样的过程
create table #t1 (...);
insert into #t1 Select ... from table_a where ...;
insert into #t1 Select ... from table_b where ...;
update #t1 Set ... = ... where ...
Select * from #t1;
Run Code Online (Sandbox Code Playgroud)
单个语句相当简单,这种方法使它们产生正确的结果。
我的任务通常是将这些过程迁移到 Oracle。
让我们面对以下事实。
我从 Oracle dba 那里学到的一件事是尽可能避免使用临时表。甚至 SQL 服务器上的性能也受益于此类修改。
用联合替换单个刀片
在最简单的情况下,上面的可以转换成类似
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b …Run Code Online (Sandbox Code Playgroud) 另一个 SQL 服务器问题:我有一个简单的查询,它提供了自计数器重置以来 CPU 最密集的 SQL:
select top 10
sum(qs.total_worker_time) as total_cpu_time,
sum(qs.execution_count) as total_execution_count,
qs.plan_handle, st.text
from
sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.plan_handle) as st
group by qs.plan_handle, st.text
order by sum(qs.total_worker_time) desc
Run Code Online (Sandbox Code Playgroud)
问题1:究竟是什么plan_handle?它似乎不是计划的散列,就像在 Oracle 中一样。我问是因为我希望能够检测语句的计划发生变化的情况。
问题2:一旦有了plan_handle,我就对实际的计划感兴趣。所以我这样做,例如:
select * from sys.dm_exec_query_plan (0x060006001F176406B8413043000000000000000000000000)
Run Code Online (Sandbox Code Playgroud)
在 query_plan 列中,我得到一个链接,单击该链接时会显示一个 XML 文档。如果我将它作为whatever.sqlplan 保存在磁盘上,我可以在Windows 中双击它并在Management Studio 中正确显示。一定有办法避免这一步吗?!
问题 3:有没有办法将 XML 转换回文本格式,就像过去的 SET SHOWPLAN_TEXT 一样?我希望能够以图形方式查看它们,但也希望以某种有意义的方式自动比较它们。
谢谢!
我有一个供内部使用的键列,它只是一个递增的整数,但我想要第二个唯一的列,它是一个 UUID,但我不知道如何调用默认值的函数(以便 SQL服务器正在创建 UUID 而不是 java),有没有可以为此向我建议的文档?
在我的办公室,我们有一个非常难看的查询,但在生产和开发环境中运行得很好(分别为 20 秒和 4 秒)。然而,在我们的测试环境中,它需要 4 小时以上。SQL2005(+最新补丁)正在生产和开发中运行。SQL2008R2 正在测试中运行。
我查看了查询计划,它表明 SQL2008R2 正在使用 TempDB,通过表假脱机(懒惰假脱机)来存储从链接服务器返回的行。下一步是显示嵌套循环(左反半连接)占用了 96.3% 的查询。两个运营商之间的界限是 5,398MB!
SQL 2005 的查询计划显示没有使用 tempdb,也没有使用 Left Anti Semi Join。
下面是经过消毒的代码和执行计划,上面是 2005 计划,下面是 2008R2。
是什么导致了急剧放缓和变化?我期待看到不同的执行计划,所以这不会打扰我。查询时间的显着减慢让我感到困扰。
我是否必须查看底层硬件,因为2008R2版本使用的是tempdb,我必须看看如何优化它的使用?
有没有更好的方法来编写查询?
谢谢您的帮助。
INSERT INTO Table1_GroupLock (iGroupID, dLockedDate)
SELECT
Table1.iGroupID,
GETDATE()
FROM Table1
WHERE
NOT EXISTS (
SELECT 1
FROM LinkedServer.Database.Table2 Alias2
WHERE
(
Alias2.FirstName + Alias2.LastName = dbo.fnRemoveNonLetter(Table1.FullName)
AND NOT dbo.fnRemoveNonLetter(Table1.FullName) IS NULL
AND NOT Alias2.FirstName IS NULL
AND NOT Alias2.LastName IS NULL
) OR (
Alias2.FamilyName = dbo.fnRemoveNonLetter(Table1.FamilyName)
AND Alias2.Child1Name …Run Code Online (Sandbox Code Playgroud) 我遇到了一个死锁场景,死锁的唯一参与者似乎是一个表和一个从该表中删除的存储过程。我根据对其中几个死锁时的 sql 错误日志的分析得出了这个结论,并使用下面的 MSDN 文章作为破译错误日志中的跟踪的指南。
下面定义了表 DEXTable 和存储过程 ClearDEXTableRows。还有另一个存储过程 InsertDEXTableRow 将行插入 DEXTable,但是根据 sql 错误日志中的条目,该过程似乎没有涉及死锁。
DEXTable 中有大约 830 万行,并且趋于稳定增长。受访者表也很大,并且趋于稳定增长。
它是从具有频繁快速连续调用 ClearDEXTableRows 和 InsertDEXTableRow 的页面的高流量网站访问的。
在过去的 10 天内,每天发生 0 到 9 次死锁。
我已经为 1222(使用 DBCC TRACEON 1222)启用了 sql 跟踪,并且最近启用了标志 1204。在检测和结束死锁上有对这些标志的输出的很好的描述
只有这个存储过程 ClearDEXTableRows 是导致死锁的原因是否有意义?
如果是这样,任何人都可以很好地解释这种情况是如何发生的并推荐一种解决方法吗?
我怀疑 DELETE 语句导致 DEXTable 的 PK 争用需要经常重建。
如果没有,我应该启用哪些额外的跟踪来深入挖掘死锁的原因?(我想在这里学习)
-- Table definition
CREATE TABLE [dbo].[DEXTable](
[ExportID] [int] NOT NULL,
[RespondentID] [int] NOT NULL,
[Exported] [datetime] NOT NULL,
CONSTRAINT [PK_DEXTable] PRIMARY KEY CLUSTERED …Run Code Online (Sandbox Code Playgroud) 我们使用的是 SQL 2005 Express Edition。我们要从 LDF 文件中读取数据以恢复一些已删除的记录。
我们尝试使用 ApexSQL 的试用版,这对我们有很大帮助。我们不是去寻找第三方软件,而是试图弄清楚如何自己读取日志文件。
我们如何从 LDF 文件中读取和恢复数据?
在阅读这篇关于 SQL Server 中的计划缓存的文章时,我发现了一个我不知道的花絮:
...为了重用,批处理引用的对象不需要名称解析。例如,Sales.SalesOrderDetail 不需要名称解析,而 SalesOrderDetail 则需要,因为在多个架构中可能存在名为 SalesOrderDetail 的表。通常,由两部分组成的对象名称(即 schema.object)为计划重用提供了更多机会。
我正在寻找关于使用两部分对象名称的重要性的一些说明,因为“通常,两部分对象名称为计划重用提供了更多机会。”,但它首先说这是必要的。
更具体地说,我处理的大多数存储过程都在 dbo 模式中,并且只引用 dbo 对象,而没有指定 dbo 前缀。即使所有内容都使用默认模式,这些是否无法重用缓存的查询计划?
sql-server-2005 ×10
sql-server ×3
performance ×2
backup ×1
dbcc ×1
deadlock ×1
index ×1
logs ×1
migration ×1
oracle ×1
primary-key ×1
recovery ×1
restore ×1
upsert ×1