【发布时间】:2019-03-22 03:34:48
【问题描述】:
我们有一个包含大约 6000 万条记录的 SQL Server 数据库表。这些是特定实体的名称和地址的记录。表包含以下列:
[Name] [nvarchar](425) NOT NULL,
[Street] [nvarchar](900) NULL,
[City] [nvarchar](900) NULL,
[State] [nvarchar](900) NULL,
[PostalCode] [nvarchar](100) NULL
我们要做到的是能够在 1 秒内执行特定的 select 语句。
我们应该能够根据“[姓名]”是否包含一个或多个输入的单词(不是“完全匹配”而不是“开头为”)来选择记录,然后应用下一个优先级逻辑:
- 显示位于给定 [州] 和 [城市] 的顶级记录
- 显示位于给定 [州] 但另一个城市的项目
- 显示位于其他州的项目
这是我们尝试过的:
- 我们尝试通过多种方式重建表,在不同的表中提取不同的列,不同的索引集,在单独的文件夹中提取每个单词作为标记
- SQL Server 全文搜索。 (使用“包含”功能匹配记录)
- Azure Cosmos DB。我们在那里迁移数据以评估我们是否可以足够有效地执行选择
问题始终是根据州+城市对记录进行优先级排序
问题是我们如何使用 SQL Server 或任何其他数据源(最好在 Azure 上提供)实现在 1 秒内执行选择的能力
【问题讨论】:
-
你能让这些列变窄吗?地球上哪个城市和/或州有 900 个字符?还是 100 个字符的邮政编码?
-
您在实验中尝试过列存储索引吗?对于需要按其他条件排序的
Name谓词,您通常会得到多少结果? -
@MartinSmith 是的,我做到了。实际上结果的数量是问题之一。可能是 200k+
-
我不知道你是否可以稍微改变你的设计。 .如果是,那么你应该规范你的设计。 .将城市名称作为文本保留在地址表中是不合适的...您可以拥有一个城市表并引用地址表的外键..然后您就可以过滤城市的小表并将其与地址连接起来表..
-
@samantarighpeima 说得有道理,但您认为这有助于解决性能问题吗?
标签: sql-server azure nosql sql-tuning