Sql server Sql Server选择请求优化
我们有一个SQL Server数据库表,有大约6000万条记录。这些是特定实体名称和地址的记录。表包含以下列:Sql server Sql Server选择请求优化,sql-server,azure,nosql,sql-tuning,Sql Server,Azure,Nosql,Sql Tuning,我们有一个SQL Server数据库表,有大约6000万条记录。这些是特定实体名称和地址的记录。表包含以下列: [Name] [nvarchar](425) NOT NULL, [Street] [nvarchar](900) NULL, [City] [nvarchar](900) NULL, [State] [nvarchar](900) NULL, [PostalCode] [nvarchar](100) NULL 我们必须实现的是能够在1秒内执行特定的select语句 我们应该能够根据
[Name] [nvarchar](425) NOT NULL,
[Street] [nvarchar](900) NULL,
[City] [nvarchar](900) NULL,
[State] [nvarchar](900) NULL,
[PostalCode] [nvarchar](100) NULL
我们必须实现的是能够在1秒内执行特定的select语句
我们应该能够根据“[Name]”是否包含一个或多个输入的单词(不是“精确匹配”也不是“以开头”)来选择记录,然后应用下一个优先级逻辑:
问题是我们如何能够使用SQL Server或任何其他数据源(最好在Azure上提供)在1秒内执行选择,这是我唯一能想到的,除了规范化城市、州和邮政编码,并适当调整这些字段的大小之外,是制作一个单词列表表:
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\u Entity
中的行来填充bl\u Entity\u Name\u元素。索引tbl_Entity_Name_Element
上的tbl_Entity_Name_Element
,您应该能够相当快地获得Entity_ID
值,该值包含给定单词列表中的所有单词,并且应该是可以使用的。这将为您提供所需的tbl_实体
项。这有意义吗?你能把这些列缩小些吗?地球上哪个城市和/或州有900个字符?或者100个字符的邮政编码?你在实验中尝试过columnstore索引吗?对于需要按其他条件排序的Name
谓词,您通常会得到多少结果?@MartinSmith yea,我得到了。实际上,结果的数量是问题之一。它可能是20万+我不知道你是否有可能改变一下你的设计。如果是这样,那么您应该规范化您的设计。将城市名称保留为地址表中的文本是不合适的…您可以拥有一个城市表,并将外键引用到地址表中..然后您将能够筛选城市的小表并将其与地址表连接..@samantarighpeima这很有意义,但您认为这可能有助于解决性能问题吗?这是一个好主意。在我尝试过的一个实验中,这种方法确实带来了价值,但仍然不够快。特别是当有很多比赛时,最具挑战性的部分是足够快地对结果进行优先级排序(显示在给定州和城市、给定州但其他城市以及所有其他城市的顶部记录上),您是否查看了评分函数,其中您获得了匹配州的一分,匹配城市的另一分,然后将按接近度排序\u Score Desc
放入查询中?另外,我必须问:到底是什么驱动了亚秒级的查询执行需求?如何使用这些数据?SQL Server查询性能真的是用户体验的瓶颈吗?您的评论让我重新考虑了这个想法,在进一步改进模式后,我在这里取得了一些进展,因此我接受您的回答我很高兴听到这一点,@Stanislav。如果您愿意分享,我很想知道您的查询运行速度有多快。