代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

如何在我的SQL Server 2008查询中指定此SQL索引提示?

  •  4
  • Pure.Krome  · 技术社区  · 14 年前

    我不确定在查询中如何指定此SQL空间索引提示:-

    select whatever
    表1
    a.id=b.id上的内部联接表2 b
    其中@someboundingbox.stintersects(b.somegeographype)=1
    < /代码> 
    
    

    当我运行查询时,它没有使用空间提示。是的,我使用的是最新版本的SQL Server 2008 R2(v10.5.1600.1.)。

    为了通过强制提示比较查询速度,我尝试了…

    select whatever
    表1
    在a.id=b.id上具有(index(myspatilinedex))的内部联接表2b
    其中@someboundingbox.stintersects(b.somegeographype)=1
    < /代码> 
    
    

    这很有效,但效果很差。我想知道它是否在尝试使用我的提示来执行a.id=b.idjoin(我不想使用该提示,for)。

    有什么建议吗?

    更新:

    添加了查询计划。大部分成本是两个表之间的连接。过滤器(WHERE子句)占据第二个最昂贵的部分。

    我的问题是:

    SELECT Whatever
    FROM Table1 a
        INNER JOIN Table2 b ON a.Id = b.Id
    WHERE @SomeBoundingBox.STIntersects(b.SomeGeographyShape) = 1
    

    当我运行查询时,它没有使用空间提示。是的,我使用的是最新版本的SQL Server 2008 R2(v10.5.1600.1)

    为了通过强制提示比较查询速度,我尝试了…

    SELECT Whatever
    FROM Table1 a
        INNER JOIN Table2 b WITH (INDEX(MySpatialIndex)) ON a.Id = b.Id
    WHERE @SomeBoundingBox.STIntersects(b.SomeGeographyShape) = 1
    

    这很有效,但效果很差。我想知道它是不是想利用我的暗示a.Id = b.Id加入(我不想使用提示)。

    有什么建议吗?

    更新:

    添加了查询计划。大部分成本是两个表之间的连接。过滤器(WHERE子句)占据第二昂贵的部分。

    2 回复  |  直到 14 年前
        1
  •  0
  •   Flipster    14 年前

    我建议不要强加于人。有一个原因是,SQL Server选择的是执行计划,正如您所怀疑的,强制执行另一个计划几乎总是会导致性能下降。

    相反,您要做的是详细检查索引和查询执行计划,跟踪执行计划的每个节点(尤其是相对成本较高的节点),并查看您是否可以执行SQL Server希望您执行的操作,以便在不强制执行的情况下提取MySpatialIndex索引。通常,它只是索引中缺少的一个字段,这将导致执行计划按您希望的方式工作…不需要强制。

        2
  •  0
  •   zerkms    14 年前

    你为什么认为问题出在 ON 条款?你在使用函数 WHERE 部分应用于 b 桌子-这就是为什么你有 全扫描 超过你 a 表和部分扫描 表。