为什么这个SQL语句很慢?

2023-12-26

我有一个包含大约 100 万条记录的表(运行 SQL Server 2008 Web)。我有一个搜索例程,尝试匹配产品代码和产品描述。 但在某些情况下,速度非常慢。下面是(精简的)sql 语句:

WITH AllProducts AS (
  SELECT       p.*, Row_Number() OVER (ORDER BY ProductId) AS RowNumber
  FROM        Product AS p 
    WHERE p.IsEnabled=1 AND
    (
      p.BaseSku = 'KPK-3020QWC-C' -- this on its own is fast
      OR
      CONTAINS(p.FreeTextStrings, '"KPK-3020QWC*"') -- and this on its own is fast, but not both
    )
) SELECT * FROM AllProducts        
  WHERE RowNumber BETWEEN 1 AND 20;

请注意,如果我只是单独比较 [p.BaseSku = 'KPK-3020QWC-C'] 或 [CONTAINS(p.FreeTextStrings, '"KPK-3020QWC*"')] (但不是两者)其即时。如果我将它们比较在一起,需要很长时间(几分钟) - 并且只返回一行。

IsEnabled 和 BaseSku 已建立索引,FreeTextStrings 已建立 FTS 索引。

我记得这之前工作得很好。

有人可以阐明这一点并提出一些解决方案吗?

执行计划文件可在此处获取:http://wiki.webgear.co.nz/GetFile.aspx?File=Temp%5cSearch%20Test.sqlplan.zip http://wiki.webgear.co.nz/GetFile.aspx?File=Temp%5cSearch%20Test.sqlplan.zip


orSQL Server 上的速度是出了名的慢。至少可以说,这很令人恼火。

尝试将其分成两个查询union:

WITH AllProducts AS (
  select *, Row_Number() OVER (ORDER BY ProductId) AS RowNumber
  from (
  SELECT       p.*
  FROM        Product AS p 
    WHERE p.IsEnabled=1 AND
      p.BaseSku = 'KPK-3020QWC-C' 
  UNION
  SELECT       p.*
  FROM        Product AS p 
    WHERE p.IsEnabled=1 AND
      CONTAINS(p.FreeTextStrings, '"KPK-3020QWC*"')
  )
) SELECT * FROM AllProducts        
  WHERE RowNumber BETWEEN 1 AND 20;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个SQL语句很慢? 的相关文章

  • 对具有许多索引的表进行缓慢的批量插入

    我尝试将数百万条记录插入到具有 20 多个索引的表中 在上次运行中 每 100 000 行花费了 4 个多小时 并且查询在 3 5 天后被取消 您对如何加快速度有什么建议吗 我怀疑是索引太多的原因 如果你也这么认为 如何在操作前自动删除索引
  • 使用 Powershell SQL 将数据提取到 Excel

    我想使用 powershell 将数据从 SQL Server 提取到新的 excel 文件 对于小型数据集 我的代码可以工作 但某些表的行数超过 100 000 行 这将需要很长时间 我不在 SQl 服务器中使用该实用程序的原因是因为我想
  • 在sql server 2008中插入新记录时如何检查数据库中的值是否已存在

    我创建了一个存储过程 用于从表中选择值 如果该值已经存在 那么它将更新该值 但如果不存在 那么它将插入新值 我为此使用了存储过程 如下所示 Create PROCEDURE dbo sp Insert Tid int NULL Quid i
  • 如何将整行(在 SQL 中,而不是 PL/SQL 中)传递给存储函数?

    我遇到以下 非常简单 问题 我想编写一个 Oracle SQL 查询 大致如下 SELECT count MyFunc MyTable FROM MyTable GROUP BY MyFunc MyTable 在 PL SQL 中 可以使用
  • 将此 MySQL 查询转换为 PyGreSQL

    我正在开发一个 Ruby 应用程序 它使用 mysql 函数 XOR 和 BIT COUNT 不过 我现在需要在运行 PyGreSQL 的 Heroku 上运行该应用程序 我找不到任何可以帮助我的 PyGreSQL 文档 那么任何人都可以翻
  • PHP、PDO 和 SQLSRV 对一个 INSERT 语句执行多次

    我已经在 MySQL 和 Apache 服务器上使用 PDO 和 PHP 一段时间了 我最近的任务是将企业的旧 Web 应用程序转换为新设置 旧设置是标准 Linux Web 堆栈 Apache PHP MySQL Filezilla 新设
  • 在 SSIS 中使用合并任务的指南

    我有一个包含三个字段的表 其中一个是身份字段 我需要从具有其他两个字段的源中添加一些新记录 我正在使用SSIS 我认为我应该使用合并工具 因为其中一个源不在本地数据库中 但是 我对合并工具和正确的过程感到困惑 我有一个源 一个 Oracle
  • SQLite 条件 ORDER BY 中的 DESC

    我需要选择按以下逻辑排序的记录 但是当 DESC 处于条件中时 SQLite 会引发错误 ORDER BY CASE WHEN parentGUID IS NULL THEN datePosted DESC ELSE datePosted
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • oracle中的区间函数

    Query SELECT INTERVAL 300 month INTERVAL 54 2 year to month INTERVAL 11 12 10 1234567 hour to second FROM DUAL 上述查询的输出是
  • 尝试使用 sql 获取单行结果? [复制]

    这个问题在这里已经有答案了 我正在尝试显示所有员工 ID 我需要这样的结果 emp id 10 11 12 13 14 15 当尝试时 SELECT LISTAGG emp id WITHIN GROUP ORDER BY emp id A
  • 将 5 gig 文件导入表时出错

    我正在尝试批量插入表 use SalesDWH go BULK INSERT dbo npi FROM S tmp npi csv WITH FIELDTERMINATOR ROWTERMINATOR n lastrow 200 first
  • 关系代数 - 笛卡尔积与自然连接?

    我正在准备考试 但未能找到一个可靠的标准来确定笛卡尔积是否x要使用或者如果自然连接 X 是要使用的 我想出了一个粗略的指南 如果您需要投影与要连接的表中的属性同名的属性 则必须使用x并说明要投影的表名称 tableA colname1 ta
  • 将 SQL Server varBinary 数据转换为字符串 C#

    我需要帮助弄清楚如何转换来自SQL服务器表列设置为varBinary 最大 转换为字符串以便将其显示在标签中 这是在C 我正在使用数据读取器 我可以使用以下方式提取数据 var BinaryString reader 1 我知道该列包含之前
  • 搜索多个表 (SQL)

    我需要能够有一个 SQL 查询来使用简单的搜索来搜索我的数据库 这是我的表格现在的样子 Table artists id name Table albums id artistID name Table songs id albumID n
  • 在 Dockerfile 中切换到 root 用户

    我运行了这个命令 docker pull mcr microsoft com mssql server 2019 latest 然后我创建了一个 dockerfile 来使用此容器映像作为另一个容器的基础映像 escape FROM mcr
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • Access 2013 SQL 中的转换和透视

    如何使用 TRANSFORM 和 PIVOT 函数从第一个表获取第二个表 TABLE 01 Config ID ConfigField ConfigValue 11 Name Basic 11 Version 1 01 11 Owner J
  • 使用 MVC5、Ajax、C# 和 MSSQL Server 级联 DropdownList

    我对来自 Windows 窗体和三层架构的 MVC 非常陌生 我试图找出使用从数据库填充的级联下拉列表 DDL 我使用 MS SQL Server 2012 VS 2013 目前我正在研究用户调查问卷 用户可以从 DDL 的多个答案中进行选

随机推荐

  • 自定义 Tailwind CSS 时引用默认颜色

    我在尝试着extendTailwind CSS 的调色板使用它们tailwind config js文件 我的目标是创建一组主要颜色和次要颜色 供我在设计网站时使用 我想通过引用默认顺风主题中已有的颜色来做到这一点 基于文档 https t
  • 安卓下载管理器

    我想我有一个相当简单的问题 http www vogella com blog 2011 06 14 android downloadmanager example http www vogella com blog 2011 06 14
  • 什么时候需要在 Java 中使用 AtomicBoolean?

    我如何使用 AtomicBoolean 以及该类的用途是什么 当多个线程需要检查和更改布尔值时 例如 if initialized initialize initialized true 这不是线程安全的 您可以使用以下方法修复它Atomi
  • Active Directory COM 异常 - 发生操作错误 (0x80072020)

    我遇到间歇性 COM 异常 发生操作错误 0x80072020 如下所示 当我尝试使用该方法查询 Active Directory 时GroupPrincipal FindByIdentity http msdn microsoft com
  • React select onChange 不起作用

    JsFiddle https jsfiddle net 69z2wepo 9956 https jsfiddle net 69z2wepo 9956 我在渲染函数中返回一个选择元素react js code 但每当我改变select值 函数
  • Firebase on 和once 有何区别?

    i am facing problems with understanding more about on and once in firebase API Assume I have this DB structure When I li
  • 如何使用整个训练示例来估计 sklearn RandomForest 中的类概率

    我想使用 scikit learn RandomForestClassifier 来估计给定示例属于一组类的概率 当然是在事先训练之后 我知道我可以使用以下方法获得类别概率predict proba http scikit learn or
  • 48 位/6 字节长的时间戳格式是什么?

    我有一个文件的时间戳格式我不明白 我无权访问创建该文件的代码 并且它不是标准格式 因此我在十六进制编辑器中逐段进行查看 并且我发现了我无法找到的格式的时间戳查找有关的信息 这是一个 48 位数字 其中 12 位表示年份 从 0 开始 4 位
  • 参数和NULL

    我在使用 RPostgres 和 RPostgreSQL 将 NULL 作为 INSERT 参数查询传递时遇到问题 在 PostgreSQL 中 create table foo ival int tval text bval bytea
  • Angular:strictTemplates - 如何正确分配变量

    我在我的Sample html某处定义的
  • mysql innodb 事务并发

    我有3张桌子 Products 产品编号最大可销售产品数可以销售给个人的最大产品数 购买 user id产品编号数量 预订 产品编号 user id数量 希望你能理解这个结构 现在 当用户尝试购买产品时 我必须检查 max products
  • 防止 QDockWidget 自动调整大小行为

    Qt 5 5 0 在我的应用程序中 我有一个 QGraphicsView 作为主要小部件和一个 QDockWidget 作为属性 目标是让用户在图形视图中选择一个项目 并根据该项目显示该项目的适当属性 我通过使用属性管理器小部件来实现此目的
  • Gunicorn 工人创建僵尸进程

    这不是一个真正的问题 但我确实想了解发生了什么 以及为什么会创建这些僵尸进程 还想看看是否有针对这种事情的好的做法 现在我做kill HUP在主 Gunicorn 进程上 它会摆脱僵尸进程 我会自动kill HUP每天早上进行日志轮换 我想
  • Excel 求解器忽略 VBA 中的约束

    我正在尝试使用求解器找到简单投资组合的最大回报 在工作表中直接使用 Solver 可以正常工作 但在 VBA 中设置命令时则不然 相反 正如您从屏幕截图中看到的 它忽略了其中一个约束 T10 中计算的权重总和应 1 有趣的是 如果我将第三行
  • cx_Freeze 帮助:有没有办法不打开控制台?

    我正在尝试将 python 游戏 用 pygame 制作 转换为 Windows 的 exe 文件 我使用 cx Freeze 进行了操作 那里没有问题 问题是 当我启动 myGame exe 时 它 会打开正常的 Pygame 窗口和控制
  • 如何清空 BlockingCollection

    我有一个线程将项目添加到BlockingCollection 在我正在使用的另一个线程上foreach var item in myCollection GetConsumingEnumerable 如果出现问题 我想打破我的 foreac
  • Vimscript:列出的缓冲区数量

    在我的 vim 脚本中 我需要获取所有被视为列出 可列出的缓冲区的计数 即所有执行此操作的缓冲区 not具有未列出的 u 属性 推导该值的推荐方法是什么 你可以使用bufnr 获取最后一个缓冲区的编号 然后创建一个 列出从 1 到该数字并过
  • 使用指针嵌套 std::map

    我在地图内使用地图 并希望访问第二个地图中的特定成员 std map
  • 在Web Api中使用Postman授权属性认证

    我正在使用 RESTful 服务 并发现 Postman 是 GET POST 和测试 API 的最佳插件之一 我在邮递员中找到基本身份验证 无身份验证 DIgest Auth OAuth AWS 如何测试授权控制器和方法 我知道授权属性检
  • 为什么这个SQL语句很慢?

    我有一个包含大约 100 万条记录的表 运行 SQL Server 2008 Web 我有一个搜索例程 尝试匹配产品代码和产品描述 但在某些情况下 速度非常慢 下面是 精简的 sql 语句 WITH AllProducts AS SELEC