gpt4 book ai didi

sql-server - ms sql - 为什么 GO 影响我的选择(自由文本搜索)

转载 作者:行者123 更新时间:2023-12-02 23:22:00 25 4
gpt4 key购买 nike

我在管理工作室 GO 中遇到了非常奇怪的行为。
我正在关注full-Text Search tutorial我对 Adventure Works 运行以下查询

 SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;

当我使用 Go 运行它(在查询之前)和不使用 Go 运行它时,结果是不同的。我又玩了一些 - 复制了选择并添加了中间内容,结果仍然不同。从图中可以看出,同一个 select 写了两次,但结果却不同

enter image description here

有什么想法吗?

编辑:刚刚发现执行计划因为go而不同
------LINK----------

enter image description here

最佳答案

我可以重现这个

初始测试

假设 GO..SELECT..GO 模式和一些空行

Before     After    Rows
y n 6
y y 4
n y 4
n n 4

如果我改变事件的顺序...

Before     After    Rows
y n 6
y y 4
n n 4
n y 4

再来一次

Before     After    Rows
y y 4
n n 4
n y 4
y n 6

Before After Rows
y y 4
n n 4
y n 6
n y 4

@MartinSmith 回答后更新

如果我删除 WHERE,那么无论空行如何,四个查询都会得到相同的结果和相同的排名值。使用 WHERE 我得到与上面相同的结果。

马丁表明排名是任意的,但他的同一链接也指出

This explains why the same query can return different rank results over time as full-text indexed data is added, modified, and deleted, and as the smaller indexes are merged.

在这种情况下,数据是静态的,并且查询相同,除了空行。

更改查询文本

  • WHERE KEY_TBL.RANK > 0 = 相同的行数和排名值
  • 无 WHERE 子句 = 相同的行数和排名值
  • 将 CONTAINSTABLE 封装在 TOP 200000..ORDER BY RANK 中 = 相同的行数和排名值,无论在何处

使用原始WHERE KEY_TBL.RANK > 2

  • 将第一个 FT_TBL 别名的大小写更改为每次都不同(fT_TBL、Ft_TBL、FT_tBL、FT_TbL),这意味着不同的查询计划 = 相同的行数和排名值
  • 所有 FT_TBL 别名更改为 FT_TBl = 相同的行数和排名值
  • 所有 FT_TBl 别名更改回 FT_TBL = 基于空行 -> 不同行的不同排名值计数

对于最后一个查询(不同的排名值),我得到 4 个相同的执行计划。该过滤器在 JOIN 之前应用于 TVF。

  • 在 WHERE 之前的 ON 之后添加一个空行(保留前导和尾随空行)= 相同的行数和排名值
  • 在 FROM 之前添加一个空行 = 相同的行数和排名值
  • 在 JOIN 之后添加 3 个空格 = 相同的行数和排名值

添加DBCC DROPCLEANBUFFERS

  • 在顶部 4-4-6-4 行添加 DBCC DROPCLEANBUFFERS
  • 如果我在每个查询之前添加 DBCC DROPCLEANBUFFERS 也会相同
  • 在第一个查询之前或之后添加额外的空行(使用 DBCC)会产生更多行 (6-4-6-4)。错误地发现了这一点,但又回到了第一个观察结果:空行影响结果

Paul 发表评论后

注意尾随和前导的空行。

这确实失败了。第二个查询给出 4 行

GO

SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;

GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO

SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;

GO

每次我按shift+TAB删除整个查询以删除缩进后,这都会给出相同的结果

GO

SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;

GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO

SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;

GO

仍在寻找

好的,是时候搜索 MS Connect 了。新的:https://connect.microsoft.com/SQLServer/feedback/details/788691/blank-lines-before-and-after-full-text-query-change-results

关于sql-server - ms sql - 为什么 GO 影响我的选择(自由文本搜索),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16775671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com