Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Sql Server选择请求优化_Sql Server_Azure_Nosql_Sql Tuning - Fatal编程技术网

Sql server Sql Server选择请求优化

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语句 我们应该能够根据

我们有一个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]”是否包含一个或多个输入的单词(不是“精确匹配”也不是“以开头”)来选择记录,然后应用下一个优先级逻辑:

  • 显示位于给定[州]和[市]的顶部记录
  • 显示位于给定[州]但位于其他城市的项目
  • 显示位于其他状态的项目
  • 以下是我们尝试过的:

  • 我们尝试以多种方式重建表,在不同的表中提取不同的列,提取不同的索引集,将每个单词提取为单独文件夹中的标记
  • SQL Server全文搜索。(使用“包含”功能匹配记录)
  • 蔚蓝宇宙数据库。我们在那里迁移了数据,以评估我们是否能够足够有效地执行选择
  • 问题始终是根据州+城市对记录进行优先级排序


    问题是我们如何能够使用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。如果您愿意分享,我很想知道您的查询运行速度有多快。