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-33638

Mark Sinkinson's questions

Martin Hope
Mark Sinkinson
Asked: 2018-02-14 05:17:37 +0800 CST

如果 Parallelism Exchange Event 死锁是无受害者的,这是一个问题吗?

  • 15

我们在生产环境中看到了很多这样的查询内并行线程死锁(SQL Server 2012 SP2 - 是的......我知道......),但是当查看通过扩展事件捕获的死锁 XML 时,受害者列表为空。

<victim-list />

死锁似乎在 4 个线程之间,两个与.WaitType="e_waitPipeNewRow"和两个与WaitType="e_waitPipeGetRow".

 <resource-list>
  <exchangeEvent id="Pipe13904cb620" WaitType="e_waitPipeNewRow" nodeId="19">
   <owner-list>
    <owner id="process4649868" />
   </owner-list>
   <waiter-list>
    <waiter id="process40eb498" />
   </waiter-list>
  </exchangeEvent>
  <exchangeEvent id="Pipe30670d480" WaitType="e_waitPipeNewRow" nodeId="21">
   <owner-list>
    <owner id="process368ecf8" />
   </owner-list>
   <waiter-list>
    <waiter id="process46a0cf8" />
   </waiter-list>
  </exchangeEvent>
  <exchangeEvent id="Pipe13904cb4e0" WaitType="e_waitPipeGetRow" nodeId="19">
   <owner-list>
    <owner id="process40eb498" />
   </owner-list>
   <waiter-list>
    <waiter id="process368ecf8" />
   </waiter-list>
  </exchangeEvent>
  <exchangeEvent id="Pipe4a106e060" WaitType="e_waitPipeGetRow" nodeId="21">
   <owner-list>
    <owner id="process46a0cf8" />
   </owner-list>
   <waiter-list>
    <waiter id="process4649868" />
   </waiter-list>
  </exchangeEvent>
 </resource-list>

所以:

  1. 受害者名单为空
  2. 运行查询的应用程序不会出错并完成查询
  3. 就我们所见,没有明显的问题,只是图被捕获了

因此,除了噪音还有什么需要担心的吗?

编辑:感谢 Paul 的回答,我可以看到问题可能发生的位置,并且似乎可以通过 tempdb 溢出自行解决。 在此处输入图像描述

sql-server deadlock
  • 2 个回答
  • 5168 Views
Martin Hope
Mark Sinkinson
Asked: 2016-04-12 00:42:22 +0800 CST

SQL Server 示例统计信息更新错过了升序键列上的最高 RANGE_HI_KEY

  • 12

我试图了解统计抽样的工作原理以及以下是否是抽样统计更新的预期行为。

我们有一个按日期分区的大表,有几十亿行。分区日期是之前的营业日期,因此是一个升序键。我们只将前一天的数据加载到该表中。

数据加载整夜运行,因此我们在 4 月 8 日星期五加载了 7 日的数据。

每次运行后,我们都会更新统计数据,但会抽取一个样本,而不是FULLSCAN.

也许我太天真了,但我希望 SQL Server 识别范围内的最高键和最低键,以确保它获得准确的范围样本。根据这篇文章:

对于第一个桶,下边界是生成直方图的列的最小值。

但是,它没有提到最后一个桶/最大值。

随着 8 日上午的采样统计更新,样本错过了表中的最高值(7 日)。

在此处输入图像描述

由于我们对前一天的数据进行了大量查询,这导致了不准确的基数估计和许多查询超时。

SQL Server 是否应该不识别该键的最高值并将其用作最大值RANGE_HI_KEY?或者这只是不使用更新的限制之一FULLSCAN?

版本 SQL Server 2012 SP2-CU7。我们目前无法升级,因为OPENQUERYSP3 中的行为发生了变化,即在 SQL Server 和 Oracle 之间的链接服务器查询中舍入数字。

sql-server sql-server-2012
  • 2 个回答
  • 611 Views
Martin Hope
Mark Sinkinson
Asked: 2015-04-03 05:59:43 +0800 CST

如何获取 RowsetID 对应的行?

  • 2

当对具有只读文件组的分区表运行查询时,我们会遇到以下错误:

表“dbo.my_table”(RowsetId 72057600379912192)的索引“ix_my_index”驻留在一个只读文件组(“MyFileGroup”)中,无法修改

我如何确定查询试图从 RowsetID 修改哪一行?

我知道sysrowsets曾经存在,但在 SQL Server 2012 中似乎不存在。

sql-server sql-server-2012
  • 1 个回答
  • 266 Views
Martin Hope
Mark Sinkinson
Asked: 2014-12-19 04:06:12 +0800 CST

表 <table_name> 中的计算列“IsWeekend”无法持久化,因为该列是不确定的

  • 3

我正在调整 SQL Server 2012 中的查询,该查询由于DATENAME()在列上使用函数检查数据是周末还是工作日时基数估计不正确而溢出到 tempdb。由于使用了该函数,该查询是 non-sargable 并且错误估计了行数(估计为 1700,实际为 38000)。

where 子句很简单:

WHERE DATENAME(WEEKDAY, vqc.DateRecorded) NOT IN ('Saturday', 'Sunday')

我希望使用持久计算列,然后对其进行索引:

ALTER TABLE <table_name> ADD IsWeekend AS DATENAME(WeekDay, DateRecorded) PERSISTED;

但是得到错误:

无法保留表中的计算列“IsWeekend”,因为该列是不确定的。

根据BOL,大量的 Date 函数不能持久化,因为它们是不确定的。

这是因为结果取决于服务器会话的 LANGUAGE 和 DATEFORMAT 设置。例如,表达式 CONVERT (datetime, '30 listopad 1996', 113) 的结果取决于 LANGUAGE 设置,因为字符串 '30 listopad 1996' 表示不同语言中的不同月份。同样,在表达式 DATEADD(mm,3,'2000-12-01') 中,数据库引擎根据 DATEFORMAT 设置解释字符串 '2000-12-01'。

使用发布在Stack OverflowMONTH()上的语句来解决此问题的函数有一种有趣的方法,但这不适用于由于和设置。CASEDATENAMESET DATEFIRSTLANGUAGE

除了在我的查询中加入日历表然后从那里过滤周末之外,还有没有办法确定日期是否是周末,以便可以将其保留然后编制索引?

还是我试图使情况过于复杂?

sql-server determinism
  • 1 个回答
  • 2335 Views
Martin Hope
Mark Sinkinson
Asked: 2014-05-17 05:52:07 +0800 CST

查询计划缓存因临时查询而膨胀,即使使用“针对临时工作负载进行优化”也是如此

  • 7

我一直注意到我们的查询计划缓存存在我认为不寻常的问题,缓存中的计划从未超过一天。

通过运行以下查询(由Kimberly Tripp提供),它表明大多数计划(6Gb 缓存计划中的 4.5Gb 或 ~50000 中的 44813 个)是使用计数为 1 的即席查询。

SELECT objtype AS [CacheType]
    , count_big(*) AS [Total Plans]
    , sum(cast(size_in_bytes as decimal(18,2)))/1024/1024 AS [Total MBs]
    , avg(usecounts) AS [Avg Use Count]
    , sum(cast((CASE WHEN usecounts = 1 THEN size_in_bytes ELSE 0 END) as decimal(18,2)))/1024/1024 AS [Total MBs - USE Count 1]
    , sum(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END) AS [Total Plans - USE Count 1]
FROM sys.dm_exec_cached_plans
GROUP BY objtype
ORDER BY [Total MBs - USE Count 1] DESC

我已经确定了问题查询(动态的EXEC,当然带有 ......),这相当可怕,但“修复”也很复杂,所以我正在研究可以立即做出的改进。

该实例已设置为使用 Optimize for Ad-hoc Workloads,但是CacheObjTypefromsys.dm_exec_cached_plans都是Compiled Plan而不是Compiled Plan Stub。

使用 Ad-hoc Workload 模式时,计划是否应该在它们大于 1之前不被编译计划存根?usecounts或者这不是它的工作原理?

在谈论 Adhoc 查询时,还有refcounts一个似乎没有人提及的领域。当类型为Compiled Plan Stub时,refcounts 始终为 1,当类型为Compiled Plan 时,refcounts 始终为2 。即使通过阅读BOL,我也不完全确定该字段的含义。有人可以澄清吗?

sql-server sql-server-2012
  • 1 个回答
  • 2532 Views
Martin Hope
Mark Sinkinson
Asked: 2014-04-24 06:31:56 +0800 CST

将 VARCHAR 转换为 VARBINARY

  • 19

我一直在一个表中记录昂贵的运行查询及其查询计划,以便我们监控性能趋势并确定需要优化的区域。

但是,查询计划占用了太多空间(因为我们针对每个查询存储整个计划)。

因此,我试图通过将 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 table
    CROSS APPLY QueryPlan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[@QueryPlanHash]') t(p)
) data
WHERE rownum = 1

....错误

Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.

问题是查询计划哈希已经是二进制格式,但是在 XML 查询计划中存储为 VARCHAR,例如

0x9473FBCCBC01AFE

并且 CONVERT to BINARY 给出完全不同的值

0x3078393437334642434342433031414645

我尝试将 XQuery 选择中的值定义更改为二进制,但随后它没有返回任何值。

如何0x9473FBCCBC01AFE从 XML 查询计划中提取 的值作为 aVARBINARY而不是 a VARCHAR?

sql-server sql-server-2012
  • 2 个回答
  • 192168 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