【发布时间】:2021-01-29 15:36:41
【问题描述】:
我有一个包含营销电子邮件事件的表格,其中一个事件可能是我们发送了电子邮件,然后收件人单击或打开了它。每次点击和打开都是一个事件。我们有 2 年的数据,大约 1.5 亿行。
我从每个收件人电子邮件地址派生电子邮件域,并且我最近在该域列上放置了一个索引。这显着提高了性能,现在我将域和地址都包含在过滤器中。耗时 10 分钟,不到 10 秒。
至少,对于大多数域来说都是如此。有 740 万个唯一的电子邮件地址,其中几乎一半是 GMAIL。如果我查询 gmail 地址,它会非常慢,甚至可能比没有索引还要慢。至少前 50 个最常见的域需要至少一分钟的时间进行基本查询。下一个最常见的域有 40 万个电子邮件地址。
其中大部分是我们所说的“免费邮件”域,我有一长串潜在的免费邮件和其他非私有域(除了 gmail 等常见的电子邮件提供商,它还包括用户注册的“一次性”域for)-- 这个列表超过 5000 个。
我有两个问题/目标。首先,只是想出一种方法来更快地查询 Gmail(我可以有选择地将其应用于其他最常见的域)。我有一些想法,这可能很糟糕,比如用电子邮件地址的第一个字母创建一个列并在上面创建一个索引。 (我不是 DBA,我之前从未在 SQL Server 上创建过索引,所以不要以为我已经想到了一些显而易见的事情。
第二个目标是更普遍地将其用于 freemail 域表中的任何内容。大多数人不需要它,但它确保任何策略都保持最新,因为该免费邮件表会以某些自动方式和手动添加域进行更新。
一个示例查询和目标。
目标:总结特定用户在一段时间内的电子邮件参与度
select contact_email, month_year, event_type, count(event_type) as events
from event_table
where email_domain = 'domain' and contact_email = 'email address'
group by contact_email, month_year, event_type
每个评论者,关于执行计划的信息,将 gmail 与不常见的东西进行对比。我可以看到它们不同,不知道如何解释。
【问题讨论】:
-
如果您要过滤电子邮件,只需在
email上创建索引。 -
你能明确查询的目标是什么吗?
-
@GordonLinoff 有这么多不同的电子邮件地址,这仍然有效吗?我不确定是否有一个实际的上限才能真正使索引有价值。
-
@Vernou 我将在帖子中编辑并给出一个示例查询,但没有一个特定的目标或查询,我会出于各种目的进行类似的查询(根据 where 条件)。
-
就像@Kirjava 提到的,执行计划是搜索SQL 瓶颈时最重要的事情之一。如果没有执行计划,没有人能够认真地帮助您解决您的具体问题。
标签: sql sql-server indexing