2

设置

  • 并行阈值成本:5
  • 最大并行度:4
  • 处理器数量:8
  • SQL Server 2008 10.0.2.2757
  • 我有一个包含许多连接、许多记录的查询。
  • 设计是明星。(带有 fks 到参考表的中央表)
  • 中央表在相关日期列上进行分区。
  • 分区架构按天拆分
  • 数据在分区模式中被很好地分割 - 通过比较分配给分区模式的文件组中的文件大小来判断
  • 涉及的查询在分区列上设置了谓词。例如( cs.dte >= @min_date 和 cs.dte < @max_date )
  • 日期参数的值是隔天 @ 午夜所以,2010-02-01, 2010-02-02
  • 估计的查询计划显示没有并行性

a) 这个问题是关于 Sql Server 2008 数据库引擎的。当 OLTP 引擎中的查询正在运行时,我希望看到/获得在使用 Progress End 事件分析 SSAS 查询时获得的那种洞察力——在这种情况下,人们会看到类似“完成读取 PartititionXYZ”的内容。

b) 如果估计的查询计划或实际的查询计划显示没有并行处理,这是否意味着所有分区都将被/被检查/读取?* 我在这里想说的是 - 只是 b/c 我在查询计划中看不到并行性,这并不能保证查询不会触及多个分区 - 对吧?或者 - 并行度和访问的 # 个分区之间是否存在稳固的关系?

c) 建议?我需要提供更多信息吗?

d)我如何判断查询是否正在并行处理而无需查看@实际查询计划?* 如果它有助于确定正在使用的分区,我真的只对此感兴趣。


11 月 10 日添加

试试这个:

  • 创建应该命中 1、3 和所有分区的查询
  • 打开一个 SSMS 查询窗口,然后运行SET SHOWPLAN_XML ON
  • 在该窗口中一个一个地运行每个查询
  • 每次运行都会踢出一大块 XML
  • 比较这些 XML 结果(我使用文本比较工具“CompareIt”,但任何类似的工具都可以)

您应该看到执行计划明显不同。在我的“3”和“All”查询中,有一段标记为“ConstantScan”的文本在表中有(分别)3和所有分区的条目,而“1 partition”查询不存在该部分. 我用它来推断是的,SQL 确实按照它所说的去做,也就是说:只读取它认为需要的表中的尽可能多的内容,以便解决查询。

4

2 回答 2

1

在这里得到了一个很好的答案:http ://www.sqlservercentral.com/Forums/Topic1064946-391-1.aspx#bm1065048

于 2011-03-01T15:00:16.373 回答
0

a) 我不知道有任何方法可以在查询仍在运行时确定查询的进展情况。锁定和锁定系统视图可能有些挑剔,但我对此表示怀疑。(唉,我对 SSAS 不够熟悉,无法在两者之间进行比较。)

b) SQL 在处理单个表中的多个分区时可能会使用并行性,在这种情况下,您将在查询计划中看到并行处理“令牌”。但是,如果出于某种原因未调用并行性但必须读取多个分区,则将在不使用并行性的情况下读取它们。

d) 另一件可能无法完成的事情。在非常受控的情况下,您可以使用系统监视器 (Perfmon) 来跟踪 CPU 使用情况,或者在执行查询期间跟踪磁盘读取。如果服务器正在执行其他工作,或者数据驻留在内存中(缓冲区缓存),这将无济于事,因此可能用途有限。

c) 你真正想弄清楚的是什么?用户在一段时间内访问了哪些分区(如果有)?SQL 是否生成“智能”查询计划?如果没有数据、结构和查询的详细信息,就很难提出建议。

于 2010-10-29T18:16:02.623 回答