FIX: 有些具有左边的外部联接和一个 IS NULL 筛选的查询运行得更慢安装 SQL Server 2000 SP3 修复程序后

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 830887
本文已归档。它按“原样”提供,并且不再更新。
错误 #: SHILOH_BUGS (470434)
症状
查询可能较慢对运行 Microsoft SQL Server 2000 SP3 修复程序生成 8.00.0776 或更高版本相比,查询针对 SQL Server 2000 修复程序生成 8.00.0776 之前, 该运行如果满足下列条件,则:
  • 查询涉及两个表的左的的外部联接。在下面的示例中表格 1 是左的表和表 2 是右表。
  • 在右表 (表 2) 的列上存在一个 IS NULL 的筛选器条件。
  • 联接的列具有不同的数据类型。一列的 varchar/char 类型,并且类型 nvarchar/nchar 的是另一列。
  • 很少的查询结果行满足该外部联接的 ON 条件。
例如对于包含下列连接和 $ 筛选器条件的查询可能运行得更慢:
t1 left outer join t2 on t1.c1 = t2.c1 where t2.c1 is null --t1.c1 is of type nvarchar and t2.c1 is of type varchar
原因
出现此问题的原因是 SQL Server 优化程序低估满足该连接之后的 IS NULL 筛选器条件的行数。
替代方法
要变通解决此问题,请确保同一数据类型的联接列。
解决方案

服务包信息

若要解决此问题,获得最新的 service pack,对于 Microsoft SQL Server 2000。有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
290211如何获取最新的 SQL Server 2000 服务包

修补程序信息

此修补程序的英文版具有文件属性 (或更高版本) 下表中列出。其格式为协调通用时间 (UTC) 列出日期和时间对这些文件。当您查看文件信息时,将转换为本地时间。若要 UTC 与本地时间之间的时差使用控制面板中的日期和时间工具中的 时区 选项卡。
   Date         Time   Version            Size    File name   --------------------------------------------------------------------   31-May-2003  16:45  2000.80.818.0      78,400  Console.exe         28-Oct-2003  02:21  2000.80.873.0     315,968  Custtask.dll        02-Oct-2003  18:59  2000.80.867.0      33,340  Dbmslpcn.dll        25-Apr-2003  00:12                    786,432  Distmdl.ldf   25-Apr-2003  00:12                  2,359,296  Distmdl.mdf   29-Jan-2003  23:55                        180  Drop_repl_hotfix.sql   12-Sep-2003  01:26  2000.80.859.0   1,905,216  Dtspkg.dll          26-Aug-2003  18:16  2000.80.854.0     528,960  Dtspump.dll         23-Jun-2003  20:40  2000.80.837.0   1,557,052  Dtsui.dll           23-Jun-2003  20:40  2000.80.837.0     639,552  Dtswiz.dll          24-Apr-2003  00:51                    747,927  Instdist.sql   02-May-2003  23:56                      1,581  Inst_repl_hotfix.sql   08-Feb-2003  04:40  2000.80.765.0      90,692  Msgprox.dll         01-Apr-2003  00:07                      1,873  Odsole.sql   04-Apr-2003  23:46  2000.80.800.0      62,024  Odsole70.dll        07-May-2003  18:41  2000.80.819.0      25,144  Opends60.dll        02-Apr-2003  19:48  2000.80.796.0      57,904  Osql.exe            02-Apr-2003  21:15  2000.80.797.0     279,104  Pfutil80.dll        04-Aug-2003  16:17                    550,780  Procsyst.sql   11-Sep-2003  22:37                     12,305  Qfe469315.sql   22-May-2003  20:57                     19,195  Qfe469571.sql   05-Sep-2003  23:36                  1,090,932  Replmerg.sql   06-Sep-2003  05:18  2000.80.858.0     221,768  Replprov.dll        06-Sep-2003  05:18  2000.80.858.0     307,784  Replrec.dll         05-Sep-2003  22:00                  1,087,150  Replsys.sql   13-Aug-2003  14:28                    986,603  Repltran.sql   21-Oct-2003  22:08  2000.80.871.0      57,916  Semnt.dll           29-Jul-2003  18:13  2000.80.819.0     492,096  Semobj.dll          31-May-2003  16:27  2000.80.818.0     172,032  Semobj.rll   05-Aug-2003  19:06                    127,884  Sp3_serv_uni.sql   31-May-2003  23:01  2000.80.818.0   4,215,360  Sqldmo.dll          07-Apr-2003  15:44                     25,172  Sqldumper.exe       19-Mar-2003  16:20  2000.80.789.0      28,672  Sqlevn70.rll   27-Sep-2003  02:42  2000.80.865.0     180,792  Sqlmap70.dll        03-Sep-2003  00:56  2000.80.857.0     188,992  Sqlmmc.dll          02-Sep-2003  21:03  2000.80.857.0     479,232  Sqlmmc.rll   21-Oct-2003  22:08  2000.80.871.0     401,984  Sqlqry.dll          08-Feb-2003  04:40  2000.80.765.0      57,920  Sqlrepss.dll        28-Oct-2003  02:21  2000.80.873.0   7,606,353  Sqlservr.exe        25-Jul-2003  19:44  2000.80.845.0     590,396  Sqlsort.dll         08-Feb-2003  04:40  2000.80.765.0      45,644  Sqlvdi.dll          02-Oct-2003  18:59  2000.80.867.0      33,340  Ssmslpcn.dll        31-May-2003  23:01  2000.80.818.0      82,492  Ssnetlib.dll        31-May-2003  23:01  2000.80.818.0      25,148  Ssnmpn70.dll        28-Oct-2003  02:21  2000.80.873.0     123,456  Stardds.dll         31-May-2003  23:01  2000.80.818.0     158,240  Svrnetcn.dll        31-May-2003  16:59  2000.80.818.0      76,416  Svrnetcn.exe        30-Apr-2003  21:52  2000.80.816.0      45,132  Ums.dll             01-Jul-2003  22:19  2000.80.834.0      98,816  Xpweb70.dll      
注意由于存在文件依赖性最新的修补程序或功能,它包含这些文件可能还包含其他文件。
状态
Microsoft 已经确认这是本文"适用于"一节中列出的 Microsoft 产品中的问题。

Microsoft SQL Server 2000 Service Pack 4 中,第一次已得到纠正此问题。
更多信息
您安装本文中描述的修复程序后,您必须确保该跟踪标志 9209 启动 SQL Server 时已打开。对于生效的此修补程序必须具有跟踪标志 9209 启动 SQL Server 时打开。这样做,请按照下列步骤操作:
  1. 启动 SQL Server 企业管理器。
  2. 用鼠标右键单击 SQL Server 的实例,然后单击 属性
  3. 单击 常规 选项卡,然后单击 $ 启动参数
  4. 启动参数 对话框中键入 -T9209参数 框中单击 添加,然后单击 确定
  5. SQL Server 属性 对话框中单击 确定
  6. 重新启动 SQL Server。

数据类型 (在此例,varchar/字符 列与一个 nvarchar/nchar 列进行比较时) 的转换,在查询中的列可能有负面影响查询的性能,最好避免如果可以执行此操作。如果您使用数据类型转换,SQL Server 可能不能准确地产生基数估计值。此外可能会 SQL Server 限制从使用适当的索引。数据类型转换有关的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
271566使用不同的数据类型的常量和列之间的 PRB: SQL Server 比较

属性

文章 ID:830887 - 上次审阅时间:01/17/2015 05:26:56 - 修订版本: 5.3

Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 标准版, Microsoft SQL Server 2000 Enterprise Edition, Microsoft SQL Server 2000 Personal Edition, Microsoft SQL Server 2000 Workgroup Edition, Microsoft SQL Server 2000 Desktop Engine (Windows), Microsoft SQL Server 2000 Enterprise Edition 64-bit

  • kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbqfe kbsqlserv2000presp4fix kbfix kbbug KB830887 KbMtzh
反馈