代码之家  ›  专栏  ›  技术社区  ›  OverflowingTheGlass

SQL Server 2012估计的行数与实际行数相差很大

  •  0
  • OverflowingTheGlass  · 技术社区  · 7 年前

    我有一个交叉连接两个表的查询。 TABLE_1 有15000行和 TABLE_2 有50000行。与此非常类似的查询在过去运行了大约10分钟。现在,它在相同的服务器情况下无限期地运行(即,没有其他任何东西在运行),非常相似的查询也无限期地运行。

    SELECT A.KEY_1
          ,A.FULL_TEXT_1
          ,B.FULL_TEXT_2
          ,B.KEY_2
          ,MDS_DB.MDQ.SIMILARITY(A.FULL_TEXT_1,B.FULL_TEXT_2, 2, 0, 0) AS confidence
    FROM #TABLE_1 A
    CROSS JOIN #TABLE_2 B
    WHERE MDS_DB.MDQ.SIMILARITY(A.FULL_TEXT_1,B.FULL_TEXT_2, 2, 0, 0) >= 0.9
    

    当我运行此查询的估计执行计划时 Nested Loops (Inner Join) 节点估计占执行的96%。估计行数为2.18亿行,即使交叉连接表会导致15000*50000=7.5亿行。当我加上 INSERT INTO #temp_table 在查询开始时,估计的执行计划将 Insert Into 97%,估计行数为2.18亿。实际上,相似度得分高于0.9的匹配应该少于100个。

    我已经读到,估计行数与实际行数之间的巨大差异可能会影响性能。我能做些什么来测试/修复这个问题?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    我已经读到,估计行数与实际行数之间的巨大差异可能会影响性能。我能做些什么来测试/修复这个问题?

    是的,这是真的。它特别影响涉及连接算法、聚合算法和索引的优化。

    但你的质疑并非如此。您的查询必须进行嵌套循环联接,而不使用索引。需要比较两个表中的所有值对。算法上几乎没有灵活性,(标准)索引也帮不上什么忙。

        2
  •  1
  •   juvian    7 年前

    要获得更好的性能,请使用 minScoreHint parameter 。这样可以防止对许多对进行完全相似性计算和提前退出。

    所以这应该运行得更快:

    SELECT A.KEY_1
          ,A.FULL_TEXT_1
          ,B.FULL_TEXT_2
          ,B.KEY_2
          ,MDS_DB.MDQ.SIMILARITY(A.FULL_TEXT_1,B.FULL_TEXT_2, 2, 0, 0, 0.9) AS confidence
    FROM #TABLE_1 A
    CROSS JOIN #TABLE_2 B
    WHERE MDS_DB.MDQ.SIMILARITY(A.FULL_TEXT_1,B.FULL_TEXT_2, 2, 0, 0, 0.9) >= 0.9
    

    文件中不清楚是否会包含0.9的结果。如果不是,则将0.9更改为0.89

        3
  •  0
  •   FrugalShaun    7 年前

    scsimon提供的链接将帮助您证明它是否是统计数据。自那以后,估计数有没有显著变化?

    平行性浮现在脑海中。如果查询是并行的,但现在不是(例如,如果服务器设置或统计信息已更改),则可能会导致性能显著降低。