sql - SQL TOP 5000比普通查询快,结果行小于 5000?

  显示原文与译文双语对照的内容
0 0

我注意到一些奇怪的行为:

运行此查询:

SELECT TOP 5000  t1.f1,t1.f2,t1.f3 
FROM t1
JOIN t2 on t1.f1 = t2.f1
WHERE t2.f1 IS NOT NULL AND (t1.f5 != t2.f3)

导致3447行2 秒。

运行这一行:

SELECT t1.f1,t1.f2,t1.f3 
FROM t1
JOIN t2 on t1.f1 = t2.f1
WHERE t2.f1 IS NOT NULL AND (t1.f5 != t2.f3)

永远运行,直到我住手( 至少120分钟,了) 。

tABLE t1t2存储大约500k的记录。

我总是觉得。 TOP语句没什么大不了的如果总行数飞机下面连绵这个数字,但是,似乎存在一个非常明显的区别。 这正常( 如果是这样,为什么) 或者它只侥幸?

EDIT :

按照要求:

t1:

CREATE TABLE [dbo].[t1](
    [f1] [int] NOT NULL,
    [f2] [varchar](10) NULL,
    [f3] [varchar](4) NULL,
    [f4] [int] NOT NULL,
    [f5] [varchar](max) NULL,
 CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED 
(
    [f1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

f2:

CREATE TABLE [dbo].[t2](
    [f1] [nchar](10) NOT NULL,
    [f2] [nchar](10) NOT NULL,
    [f3] [varchar](max) NOT NULL,
    [f4] [nchar](10) NULL,
    [f5] [date] NULL,
    [f6] [date] NULL,
    [f7] [nchar](1) NULL,
 CONSTRAINT [PK_t2] PRIMARY KEY CLUSTERED 
(
    [f1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Execution计划:

与顶部: Execution with top

无顶: Exec w/o top

这个我得看得出结论认为, sorting( wHY是它在搞鬼- 1 ) 会导致延迟。。。 你说是不是?

ediT2: 按照要求,执行计划和循环选项没有顶部: enter image description here

时间:原作者:7个回答

0 0

sql查询可以按多种方法进行优化。 两种常用方法是" 最快" 第一行和最后一行" 最快" 。 即是否最小化快点离开任何结果或时间来得到完整的结果集。

我猜想这两个版本就是被优化方式不同。 你可以检查此选项,因为Aaron可以看出,通过查看执行计划。 我通常打赌慢速版本使用嵌套循环联接。 可以解决此问题与优化器提示,例如:

<your query>
option (MERGE JOIN, HASH JOIN)

还有其他可能性。 也许这些表正在被更新,然后就有了完整的表表锁定时运行第二个查询。 你​可​以​用 sp_who2.

原作者:
...