Sql 服务器 select 请求调整

Sql Server select requests tuning

我们有一个 SQL 服务器数据库 table,其中包含大约 6000 万条记录。这些是特定实体的名称和地址的记录。 Table 包含以下列:

[Name] [nvarchar](425) NOT NULL,
[Street] [nvarchar](900) NULL,
[City] [nvarchar](900) NULL,
[State] [nvarchar](900) NULL,
[PostalCode] [nvarchar](100) NULL

我们要实现的是能够在 1 秒内执行特定的 select 语句。

我们应该能够 select 根据“[Name]”是否包含一个或多个输入的单词(不是 'exact match' 也不是 'starts with')进行记录,然后应用下一个优先级逻辑:

  1. 显示位于给定 [State] 和 [City] 的顶部记录
  2. 显示给定[州]但另一个城市的项目
  3. 显示位于其他州的项目

这是我们尝试过的方法:

  1. 我们尝试以多种方式重建 table,在不同的 table、不同的索引集中提取不同的列,在单独的文件夹中提取每个单词作为标记
  2. SQL 服务器全文搜索。 (用'Contains'函数匹配记录)
  3. Azure Cosmos 数据库。我们将数据迁移到那里以评估我们是否可以selects 足够高效地执行

问题总是根据州+市对记录进行优先排序

问题是我们如何使用 SQL 服务器或任何其他数据源(最好在 Azure 上可用)select 在这种情况下在 1 秒内执行 selects

除了规范化 CityStateZip 并适当调整这些字段的大小之外,我唯一能想到的就是制作一个单词列表 table:

Create Table tbl_Entity
(
    [ID] [Int] Identity Not Null,
    [Name] [nvarchar](425) NOT NULL,
    [Street] [nvarchar](900) NULL,
    [City] [nvarchar](900) NULL,
    [State] [nvarchar](900) NULL,
    [PostalCode] [nvarchar](100) NULL
)

Create Table tbl_Entity_Name_Elements
(
    [ID] [Int] Identity Not Null,
    [Entity_ID] [Int] Not Null,   -- foreign key to tbl_Entity
    [Name_Element] [nvarchar](100) Null
)

有一个例程(可能是夜间工作)通过解析 tbl_Entity 中的行来填充 bl_Entity_Name_Elements。在 Name_Element 上索引 tbl_Entity_Name_Elements,您应该能够相当快地获得包含所有给定单词列表的 Entity_ID 值,并且应该支持 SARG。这将为您提供所需的 tbl_Entity 项。这有意义吗?