如何判断正在访问* IF * AND * WHAT *分区 - sql server 2008 db engine

时间:2010-10-29 17:26:51

标签: sql-server sql-server-2008 database-partitioning

设置

  • 并行度的门槛成本: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”和“所有”查询中,有一大块文本被标记为“ConstantScan”,其中包含(分别)3和表中所有分区的条目,并且该部分不存在于“1分区”查询中。我使用它来推断确实是,SQL正在做它所说的将会做的事情,即:只读取它认为需要的表以便重新调用查询。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

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

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

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

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