AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-2103

Mikael Eriksson's questions

Martin Hope
Mikael Eriksson
Asked: 2018-05-05 04:49:47 +0800 CST

使新版本的 LDF 文件与旧版本的 MDF 文件一起工作

  • 7

是否可以将 LDF 文件的“较新版本”与 MDF 文件的较旧版本结合起来,并将更改记录在 LDF 中?让我们假设在这期间没有日志备份,因为我想这真的不可能。

脚步:

  1. 数据库处于完全恢复模式
  2. 进行完整备份
  3. 做一些改变
  4. 分离数据库
  5. 制作 LDF 文件的文件副本
  6. 从步骤 2 中的完整备份恢复
  7. 分离数据库
  8. 制作 MDF 文件的文件副本
  9. 丢弃备份(重要步骤)
  10. 删除数据库
  11. 以某种方式使 MDF 和 LDF 一起播放,并且步骤 3 中所做的更改仍然存在。

仅附加 MDF 和 LDF 会出现错误:

传递给日志扫描数据库“mic”的日志扫描编号 (38:195:41) 无效。

我也尝试了一系列

  1. 创建数据库
  2. 使数据库脱机
  3. 替换 MDF 和 LDF 文件
  4. 上线
  5. 做一个日志备份
  6. 删除数据库
  7. 仅使用附加 MDF 文件创建数据库
  8. 进行完整备份
  9. 恢复完整备份(norecovery)
  10. 从步骤 5 恢复日志备份

我清楚地记得,这在一段时间内工作得很好,但后来就不行了。

此备份集中的日志终止于 LSN 38000000021300001,这对于应用于数据库来说太早了。可以还原包含 LSN 39000000006500001 的更新日志备份。

sql-server
  • 1 个回答
  • 338 Views
Martin Hope
Mikael Eriksson
Asked: 2016-05-31 03:59:31 +0800 CST

奇怪的流聚合行为

  • 11

询问:

declare @X xml = '
<item ID = "0"/>
<item ID = "1"/>
<item/>
<item/>';

select I.X.value('@ID', 'int')
from @X.nodes('/item') as I(X);

结果:

-----------
0
1
NULL
NULL

执行计划:

在此处输入图像描述

顶部分支将 XML 分解为四行,底部分支获取属性的值ID。

让我感到奇怪的是从 Stream Aggregate 运算符返回的行数。来自 Filter 的两行是XML 中ID第一个和第二个节点的属性。itemStream Aggregate 返回四行,每个输入行一行,有效地将内部连接转换为外部连接。

这是 Stream Aggregate 在其他情况下也会做的事情,还是在执行 XML 查询时会发生一些奇怪的事情?

我在查询计划的 XML 版本中看不到任何提示,表明此流聚合的行为应该与我之前注意到的任何其他流聚合有任何不同。

sql-server execution-plan
  • 2 个回答
  • 1022 Views
Martin Hope
Mikael Eriksson
Asked: 2015-06-12 23:34:06 +0800 CST

为什么 where 子句过滤 `value()` 时没有使用二级选择索引?

  • 13

设置:

create table dbo.T
(
  ID int identity primary key,
  XMLDoc xml not null
);

insert into dbo.T(XMLDoc)
select (
       select N.Number
       for xml path(''), type
       )
from (
     select top(10000) row_number() over(order by (select null)) as Number
     from sys.columns as c1, sys.columns as c2
     ) as N;

每行的示例 XML:

<Number>314</Number>

查询的工作是计算T具有指定值 的行数<Number>。

有两种明显的方法可以做到这一点:

select count(*)
from dbo.T as T
where T.XMLDoc.value('/Number[1]', 'int') = 314;

select count(*)
from dbo.T as T
where T.XMLDoc.exist('/Number[. eq 314]') = 1;

事实证明,value()和exists()需要两个不同的路径定义才能使选择性 XML 索引起作用。

create selective xml index SIX_T on dbo.T(XMLDoc) for
(
  pathSQL = '/Number' as sql int singleton,
  pathXQUERY = '/Number' as xquery 'xs:double' singleton
);

sql版本适用于版本适用value()于.xqueryexist()

您可能认为这样的索引会给您一个很好的搜索计划,但选择性 XML 索引是作为系统表实现的,其主键是T系统表聚集键的主键。指定的路径是该表中的稀疏列。如果您想要定义路径的实际值的索引,您需要创建一个二级选择性索引,每个路径表达式一个。

create xml index SIX_T_pathSQL on dbo.T(XMLDoc)
  using xml index SIX_T for (pathSQL);

create xml index SIX_T_pathXQUERY on dbo.T(XMLDoc)
  using xml index SIX_T for (pathXQUERY);

的查询计划exist()在辅助 XML 索引中进行查找,然后在系统表中进行选择性 XML 索引的键查找(不知道为什么需要这样做),最后它进行查找T以确保确实存在行在那里。最后一部分是必要的,因为系统表和T.

在此处输入图像描述

查询计划value()不是很好。它T使用嵌套循环连接对内部表进行搜索以从稀疏列中获取值并最终过滤该值进行聚簇索引扫描。

在此处输入图像描述

是否应该使用选择性索引是在优化之前决定的,但是是否应该使用辅助选择性索引是优化器基于成本的决定。

为什么 where 子句过滤时不使用二级选择索引value()?

更新:

查询在语义上是不同的。如果您添加一行值

<Number>313</Number>
<Number>314</Number>` 

该exist()版本将计算 2 行,而values()查询将计算 1 行。但是使用singleton指令 SQL Server 将在此处指定的索引定义阻止您添加包含多个<Number>元素的行。

但是,这不允许我们在values()不指定的情况下使用该函数,[1]以保证编译器我们只会获得一个值。这[1]就是我们在value()计划中采用 Top N 排序的原因。

看起来我正在接近这里的答案......

sql-server sql-server-2012
  • 1 个回答
  • 730 Views
Martin Hope
Mikael Eriksson
Asked: 2014-05-21 23:35:15 +0800 CST

为什么执行语句的速度取决于网络连接?

  • 31

看起来执行 T-SQL 的速度取决于与服务器的网络连接延迟。我假设如果 SQL Server 没有什么可向客户端报告的,它会一直执行直到完成,但测试显示了另一个故事。

create procedure UselessLoop
  @I int
as
declare @D datetime = getdate()
while @I > 0 set @I -= 1
print datediff(millisecond, @D, getdate())

exec UselessLoop 100000

Server    Milliseconds
local     53
nearby    63
faraway   660

exec UselessLoop 1000000

Server    Milliseconds
local     546
nearby    640
faraway   6183

这些测试是使用 SSMS 从不同的计算机针对同一台服务器执行的。本地是从服务器执行的,附近是在同一个本地网络上,远处是从 500 公里外的另一个办公室执行,该办公室通过 1 千兆光纤连接。

显然,SQL Server 和客户端之间正在进行一些通信,这直接取决于执行的语句数。

我使用 Wireshark 查看传输的内容,我不能说我了解那么多,但它是一个 tcp.stream,在 22740 个数据包中交换了总共 26 MB。

换一个无用的功能怎么样?

create function dbo.UDFUselessLoop(@I int)
returns int
as
begin
  declare @D datetime = getdate()
  while @I > 0 set @I -= 1
  return datediff(millisecond, @D, getdate())
end

print dbo.UDFUselessLoop(1000000)

无论从何处执行,它都在 406 毫秒内执行。看起来循环中没有与客户端通信。

sql-server t-sql
  • 1 个回答
  • 1053 Views
Martin Hope
Mikael Eriksson
Asked: 2013-02-04 23:58:37 +0800 CST

迄今为止的演员阵容是可悲的,但这是个好主意吗?

  • 60

在 SQL Server 2008 中添加了日期数据类型。

将datetime列强制转换date为sargable并且可以使用datetime列上的索引。

select *
from T
where cast(DateTimeCol as date) = '20130101';

您拥有的另一个选择是使用范围。

select *
from T
where DateTimeCol >= '20130101' and
      DateTimeCol < '20130102'

这些查询是否同样好,还是应该优先考虑一个?

sql-server
  • 2 个回答
  • 9374 Views
Martin Hope
Mikael Eriksson
Asked: 2013-01-26 00:07:59 +0800 CST

查询计划“基数估计”中的警告

  • 19
create table T(ID int identity primary key)
insert into T default values
insert into T default values

go

select cast(ID as varchar(10)) as ID
from T
where ID = 1

上面的查询在查询计划中有警告。

<Warnings>
  <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" />
</Warnings>

为什么会有警告?

字段列表中的演员如何影响基数估计?

sql-server sql-server-2012
  • 1 个回答
  • 14492 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve