当前位置: 首页 > 面试题库 >

SQL语句-如何通过索引提高速度

蒋奕
2023-03-14
问题内容

我有一个脚本,该脚本必须查看超过250万条记录,以查找是否有未读电子邮件的成员。我想知道可以采取什么措施来提高其速度。目前,运行脚本最多可能需要8秒钟的时间:

SELECT TOP(1) MemberMailID
FROM MemberMail
WHERE ToReadFlag = 0
AND ToMemberID = 102
AND ToDeletedFlag = 0
AND FromDeletedFlag = 0
AND OnHold = 0
AND ToArchivedFlag = 0

如何使用索引使其更快?


问题答案:

该索引可能会有所帮助,但是请记住,这里没有免费的午餐(必须维护索引,因此这会影响您的插入/更新/删除工作量):

CREATE NONCLUSTERED INDEX unread_emails
  ON dbo.MemberMail(ToMemberID)
  INCLUDE (MemberMailID)
  WHERE ToReadFlag = 0
  AND ToDeletedFlag = 0
  AND FromDeletedFlag = 0
  AND OnHold = 0
  AND ToArchivedFlag = 0;

现在,您的查询可以说:

SELECT TOP (1) MemberMailID
  FROM dbo.MemberMail -- dbo prefix
    WITH (INDEX (unread_emails)) -- in case you need to force, though you should not
WHERE ToMemberID = 102
AND ToReadFlag = 0
AND ToDeletedFlag = 0
AND FromDeletedFlag = 0
AND OnHold = 0
AND ToArchivedFlag = 0
ORDER BY ToMemberID; -- ORDER BY is important!

如果您根据查询更改其中一些标志的值,则可以尝试将这些列添加到索引键而不是过滤器中,例如,假设有时您要检查OnHold = 0,有时OnHold = 1

CREATE NONCLUSTERED INDEX unread_emails
  ON dbo.MemberMail(ToMemberID, OnHold)
  INCLUDE (MemberMailID)
  WHERE ToReadFlag = 0
  AND ToDeletedFlag = 0
  AND FromDeletedFlag = 0
  AND ToArchivedFlag = 0;

您可能还想尝试使用MemberMailID键而不是INCLUDE。例如:

CREATE NONCLUSTERED INDEX unread_emails
  ON dbo.MemberMail(ToMemberID, MemberMailID)
  WHERE ToReadFlag = 0
  AND ToDeletedFlag = 0
  AND FromDeletedFlag = 0
  AND OnHold = 0
  AND ToArchivedFlag = 0;

这些差异可能对您的数据和使用模式无关紧要,但是您将能够比我们所能猜测的更容易地测试差异。



 类似资料:
  • 问题内容: 在不知道原因的情况下,脚本执行期间的测试速度非常慢。 这是我的脚本: 有什么建议可以使测试更快吗? 问题答案: 一个使脚本/程序更快的简单步骤是: 删除所有 ImplicitWait 实例为: 您正在广泛使用 WebDriverWait 即 显式等待 根据 显式和隐式等待 的文档: 警告 :请勿混合使用隐式和显式等待。这样做可能导致无法预测的等待时间。例如,将隐式等待设置为10秒,将显

  • 本文向大家介绍为什么索引能提高查询速度?相关面试题,主要包含被问及为什么索引能提高查询速度?时的应答技巧和注意事项,需要的朋友参考一下 以下内容整理自: 地址: https://juejin.im/post/5b55b842f265da0f9e589e79 作者 :Java3y 先从 MySQL 的基本存储结构说起 MySQL的基本存储结构是页(记录都存在页里边): 各个数据页可以组成一个双向链表

  • 问题内容: 我有一个类似以下的查询: 为了避免多次重复相同的表达式:我想定义一个CTE,并在select,where和group by表达式中使用查询该表 不幸的是,这不起作用,因为在创建 还有什么其他方法可以使我不重复这么多次? 问题答案: 使用,可用于定义别名字段,然后引用它们: 该仅仅是一个别名,不管你喜欢,你可以将其命名。

  • 本文向大家介绍如何提高javascript加载速度,包括了如何提高javascript加载速度的使用技巧和注意事项,需要的朋友参考一下 方法如下: 1、将所有<script>标签放在尽可能接近<body>标签底部的位置,以保证页面在脚本运行之前完成解析尽量减少对整个页面下载的影响 2、限制页面的<script>总数也可以改善性能。每当页面解析碰到一个<script>标签时, 紧接着有一段时间用于代

  • 我使用的是PostgreSQL v9。6.6. 我正在运行以下SQL: 这将导致以下错误,因为列的索引不是唯一的。我不能添加索引,因为有一些存量数据不是唯一的。 错误:不存在与冲突规范匹配的唯一或排除约束 问:有没有办法在没有索引的情况下执行upsert语句? 谢谢

  • 问题内容: 可以说在employee表中,我在表的列上创建了一个索引(idx_name)。 我是否需要在select子句中明确指定索引名称,否则它将自动用于加速查询。 如果需要在select子句中指定,在select查询中使用index的语法是什么? 问题答案: 如果要测试索引以查看其是否有效,请使用以下语法: WITH语句将强制使用索引。