Questions tagged «xml»

“可扩展标记语言”的缩写。用于传输结构化数据的文本标记语言。

2
使用XML阅读器优化计划
从此处执行查询以将死锁事件从默认扩展事件会话中拉出 SELECT CAST ( REPLACE ( REPLACE ( XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraph FROM (SELECT CAST (target_data AS XML) AS TargetData FROM sys.dm_xe_session_targets st JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address WHERE [name] = 'system_health') AS Data CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent) …

1
XML索引的性能非常奇怪
我的问题基于此:https : //stackoverflow.com/q/35575990/5089204 为了给出答案,我做了以下测试场景。 测试场景 首先,我创建一个测试表并用100.000行填充它。一个随机数(0到1000)应导致每个随机数约100行。此数字放入varchar列中,并作为XML中的值。 然后,我像OP那样进行呼叫,需要使用.exist()和.nodes()进行第二次调用,但是第二步的优势不大,但是两者都需要5到6秒钟。实际上,我进行了两次调用:第二次以交换顺序进行,搜索参数略有变化,并使用“ // item”而不是完整路径,以避免通过缓存的结果或计划产生误报。 然后创建一个XML索引并执行相同的调用 现在-真正让我惊讶的是!- .nodes具有完整路径的速度比以前(9秒)要慢得多,但是.exist()降低到半秒,而具有完整路径的时间甚至可以降低到约0.10秒。(同时.nodes()具有短的路径比较好,但仍远远落后于.exist()) 问题: 我自己的测试简而言之:XML索引会极大地破坏数据库。它们可以极大地加快处理速度(例如,编辑2),但也会降低查询速度。我想了解它们的工作原理...什么时候应该创建XML索引?为什么.nodes()有了索引会比没有索引更糟糕?如何避免负面影响? CREATE TABLE #testTbl(ID INT IDENTITY PRIMARY KEY, SomeData VARCHAR(100),XmlColumn XML); GO DECLARE @RndNumber VARCHAR(100)=(SELECT CAST(CAST(RAND()*1000 AS INT) AS VARCHAR(100))); INSERT INTO #testTbl VALUES('Data_' + @RndNumber, '<error application="application" host="host" type="exception" message="message" > <serverVariables> <item name="name1"> <value string="text" …

2
LOB_DATA,慢速表扫描和一些I / O问题
我有一个相当大的表,其中一列是XML数据,XML条目的平均大小约为15 KB。所有其他列都是常规int,bigints,GUID等。要获得一些具体数字,我们假设该表有100万行,大小约为15 GB。 我注意到的是,如果我要选择所有列,则从此表选择数据的速度确实很慢。当我做 SELECT TOP 1000 * FROM TABLE 从磁盘读取数据大约需要20-25秒-即使我没有对结果施加任何顺序。我使用冷缓存(即之后DBCC DROPCLEANBUFFERS)运行查询。以下是IO统计信息: 扫描计数1,逻辑读取364,物理读取24,预读7191,lob逻辑读7924,lob物理读1690,lob预读3968。 它捕获约15 MB的数据。执行计划按预期显示了聚集索引扫描。 除了查询外,磁盘上没有任何IO。我还检查了聚簇索引碎片是否接近0%。这是消费级的SATA驱动器,但是我仍然认为SQL Server能够以超过100-150 MB / min的速度扫描表。 XML字段的存在会导致大多数表数据位于LOB_DATA页上(实际上,约90%的表页都是LOB_DATA)。 我想我的问题是-我是否正确地认为LOB_DATA页会导致缓慢的扫描,不仅是因为它们的大小,还因为当表中有很多LOB_DATA页时,SQL Server无法有效地扫描聚集索引吗? 更广泛地讲-具有这样的表结构/数据模式是否合理?使用Filestream的建议通常会指出更大的字段大小,所以我真的不想走那条路。我还没有真正找到有关此特定情况的任何好信息。 我一直在考虑XML压缩,但是它需要在客户端或SQLCLR上完成,并且需要在系统中进行大量工作。 我尝试了压缩,并且由于XML是高度冗余的,因此我可以(在ac#应用程序中)将XML从20KB压缩到〜2.5KB并将其存储在VARBINARY列中,从而避免使用LOB数据页。在我的测试中,SELECT的速度提高了20倍。

4
FOR XML无法序列化数据,因为它包含字符(0x0000)
我有一个大查询(如有必要,我将在此处发布),并且出现此错误: 消息6841,级别16,状态1,第1行 FOR XML无法序列化节点'NoName'的数据,因为它包含XML不允许的字符(0x0000)。要使用FOR XML检索此数据,请将其转换为二进制,varbinary或图像数据类型,然后使用BINARY BASE64指令。 我使用的唯一部分FOR XML是在这里: WHERE (CodFuncionario = Results.CodFuncionario) FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia] 但是,什么是node noname?以及如何寻找该值:(0x0000) 这是子查询之一(我只有FOR XML): SELECT [CodFuncionario], STUFF ( ( SELECT ' / ' + CAST ( [DescFuncao] + '-' + [DescTempoExperiencia] AS VARCHAR(MAX) )... FROM [Linked_Server].db.dbo.tblFuncionarioExperiencia T0 INNER …

2
将VARCHAR转换为VARBINARY
我一直将昂贵的运行查询及其查询计划记录在一个表中,以使我们能够监视性能趋势并确定需要优化的领域。 但是,到了查询计划占用太多空间的地步(因为我们针对每个查询存储整个计划)。 因此,我试图通过将QueryPlanHash和QueryPlan提取到另一个表来规范化现有数据。 CREATE TABLE QueryPlans ( QueryPlanHash VARBINARY(25), QueryPlan XML, CONSTRAINT PK_QueryPlans PRIMARY KEY ( QueryPlanHash ) ); 因为query_plan_hashin 的定义sys.dm_exec_query_stats是一个二进制字段(并且我将定期插入新数据),所以我VARBINARY在新表中使用了该数据类型。 但是,下面的插入失败... INSERT INTO QueryPlans ( QueryPlanHash, QueryPlan ) SELECT queryplanhash, queryplan FROM ( SELECT p.value('(./@QueryPlanHash)[1]', 'varchar(20)') queryplanhash, QueryPlan, ROW_NUMBER() OVER (PARTITION BY p.value('(./@QueryPlanHash)[1]', 'varchar(20)') ORDER BY DateRecorded) rownum FROM …

3
插入时SQL Server更改XML结构
我正在将一些XML数据插入SQL Server中的XML列,但是在插入数据后,SQL Server已对其进行了更改。这是我插入的数据 <xsl:value-of select="name/n/given" /> <xsl:text> </xsl:text> <xsl:value-of select="name/n/family" /> 当我读回它时,它看起来像这样 <xsl:value-of select="name/n/given" /> <xsl:text /> <xsl:value-of select="name/n/family" /> 注意第二行。这是一个问题,因为它更改了XSLT转换输出的方式。第一个示例将在给定名称和姓氏之间创建一个空格,而第二个示例将不创建任何空格,因此它将类似于JohnJohnsen,而第一个示例将类似于John Johnsen。 有什么办法可以解决这个问题?
15 sql-server  xml 

3
使用XPath / XQuery连接同一XML元素的所有值
我有这样的XML值: <R> <I>A</I> <I>B</I> <I>C</I> ... </R> 我想连接所有I值并将它们作为单个字符串返回:ABC...。 现在我知道我可以切碎XML,将结果聚合为无节点XML,然后应用于.values('text()[1]', ...)结果: SELECT ( SELECT n.n.value('text()[1]', 'varchar(50)') AS [text()] FROM @MyXml.nodes('/R/I') AS n (n) FOR XML PATH (''), TYPE ).value('text()[1]', 'varchar(50)') ; 但是,我只想使用XPath / XQuery方法来做所有事情,就像这样: SELECT @MyXml. ? ( ? ); 有这种方法吗? 我正在朝这个方向寻找解决方案的原因是因为我的实际XML也包含其他元素,例如: <R> <I>A</I> <I>B</I> <I>C</I> ... <J>X</J> <J>Y</J> <J>Z</J> ... …

1
我如何尽快切碎此扩展事件XML?
我在SQL Server 2008 R2中创建了扩展事件会话。会话运行,并在事件发生时收集事件,完全符合您的期望。 如果在事件相对较少时切碎xml,则性能可以接受。当我有成千上万个事件时,将xml切碎是永远的。 我知道自己做错了事,只是对XML引擎的内部知识不足,无法理解。 这是我的扩展事件会话的定义: IF EXISTS ( SELECT 1 FROM sys.server_event_sessions dxs WHERE dxs.name = 'queries' ) BEGIN IF EXISTS ( SELECT 1 FROM sys.dm_xe_sessions dxs WHERE dxs.name = 'queries' ) BEGIN ALTER EVENT SESSION queries ON SERVER STATE = STOP; END DROP EVENT SESSION queries ON …

2
sp_send_dbmail存储过程带有附件发送
我的任务是向其中一位客户发送一份小型月度报告。该报告以前是在实例上手动运行的,输出已复制到电子表格中并作为附件发送给客户。 我正在寻找一个更永久的解决方案,因此我打算使用sp_send_dbmail存储过程来运行查询并将其作为附件发送。 一切正常,但消息格式正确。最初,我尝试将输出附加为带有CSV文件的CSV文件,@query_result_seperator = ','但结果无处不在! 当我正常运行报表时,在SQL中输出看起来不错。但是,将其作为CSV或仅在邮件正文中发送就没有了。 我认为如果将输出导出为HTML并以附件/或XML格式发送输出可能会更好,但是我不知道该怎么做。 有没有人有什么建议? 提前致谢!

1
当where子句对`value()`进行过滤时,为什么不使用二级选择索引?
设定: 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> …

4
如何在没有表的数据库中存储数据?
我在学校中学到的只是SQL,它将数据保存到表中。现在,我正在一个项目中,数据存储在XML文件中。此外,每个XML都包含对可视文件(JPEG)的引用。 XML本身包含一千多个坐标点,以及有关数据的其他信息。 我认为将这些信息存储在表中没有任何意义。此外,我也无法使用SQL存储JPEG文件。 什么是合适的解决方案,或者我的推理存在错误? 如您所见,我对数据库还很陌生。因此,欢迎提出任何建设性的建议,链接和建议。

3
SQL将XML从文件读入PostgreSQL数据库
如何编写SQL将XML文件读入PostgreSQL XML值? PostgreSQL具有本机XML数据类型,该XMLPARSE函数具有将文本字符串解析为该类型的功能。它还具有从文件系统读取数据的方法。在COPY声明中,等等。 但是我看不到编写本机PostgreSQL SQL语句以从文件系统条目中读取内容并使用其填充XML值的方法。我怎样才能做到这一点?
12 postgresql  xml 

4
何时使用XML数据类型
我负责在项目上创建数据库。我们的字段很少会具有值(每10,000条记录中有1个),我正在尝试找出将其存储在数据库中的最佳方法。 据我所知,我有3种选择: 在表格中为每个附加值添加一列 添加一个链接表,该表引用原始表,并且仅在需要存储值的位置才有记录 在原始表中使用XML数据类型,并在其中存储所有值。 还有其他我没有考虑的选择吗? 我正在尝试找出每种方法的利弊。据我所知,1是最简单的,2将占用最少的空间,但是我一直在努力寻找3的许多资源。


1
SQL Server查询计划XML:QueryPlanHash长度
更新:这绝对是一个错误。有关详细信息,请参见此连接项。 在测试对sp_BlitzCache的一些更改(完整披露,我是作者之一)时,我遇到了我认为是代码中的错误的地方。 一方面,我们要匹配查询计划哈希以获取查询成本。我们这样做是这样的: statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryHash, 3)) = xs:hexBinary(sql:column("b.QueryHash"))]/@StatementSubTreeCost)', 'float') 据我所知,这已经奏效了。但是,在一种奇怪的情况下,XML中的子字符串引发了一个NULL值,尽管成本很高,但该计划的成本却显示为0。 深入研究执行计划(全面披露,我在负责Paste The Plan的公司工作),我注意到一个问题哈希的“查询计划哈希”长为17个字符,其余为18个字符。以下示例: QueryPlanHash =“ 0x4410B0CA640CDA89” QueryPlanHash =“ 0x2262FEA4CE645569” QueryPlanHash =“ 0xED4F225CC0E97E5” –问题! QueryPlanHash =“ 0xBF878EEE6DB955EA” QueryPlanHash =“ 0x263B53BC8C14A452” QueryPlanHash =“ 0x89F5F146CF4B476F” QueryPlanHash =“ 0xEF47EA40805C8961” QueryPlanHash =“ 0xB7BE27D6E43677A5” QueryPlanHash =“ 0x815C54EC43A6A6E9” 查询计划哈希上市为BINARY 8-想必这应该是相同的长度,但到底是什么像我这样的人了解二进制值? 稍微玩一下XQuery,我发现通过将子字符串更改为从第二个位置开始,它会得出一个有效的(尽管不正确)哈希值。 WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p) SELECT QueryPlanCost = …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.