Sql server 在多列上搜索大型SQL表的速度较慢

Sql server 在多列上搜索大型SQL表的速度较慢,sql-server,database-performance,large-data,Sql Server,Database Performance,Large Data,我希望在多个列上搜索大于200000行的大型SQL server表时获得更好的性能。当前代码生成的查询类似于 ( SELECT Person._pk FROM dbo.R_Person as Person WHERE Person._pk > 0 AND Person.first_name LIKE 'jane%' AND Person.last_name LIKE 'morgan%' AND Person._pk IN ( SELECT _pk FROM dbo.R_P

我希望在多个列上搜索大于200000行的大型SQL server表时获得更好的性能。当前代码生成的查询类似于

(
SELECT Person._pk 
FROM dbo.R_Person as Person 
WHERE Person._pk > 0 
AND Person.first_name LIKE 'jane%' 
AND Person.last_name LIKE 'morgan%' 
AND Person._pk IN (
    SELECT _pk FROM dbo.R_PersonView12 
)

当只搜索一个姓名时,会立即返回,但由于搜索第一个姓名和最后一个姓名通常需要找到正确的人,因为这两个姓名中的任何一个都会有太多匹配项,因此运行时间会变得异常高。是否有人可以提出一种不同的方法来构建此查询以提高性能?

最好查看查询计划。但你当然可以试试这个:

SELECT Person._pk 
FROM dbo.R_Person as Person 
WHERE Person._pk > 0 
AND Person.first_name LIKE 'jane%' 
AND Person.last_name LIKE 'morgan%' 
AND EXISTS (
    SELECT 1 FROM dbo.R_PersonView12 V
    WHERE V._pk = Person._pk
)
看起来这里也有一个视图,这可能也是问题所在。发布DDL


还有哪些列有索引?

正如ElectricLlama所提到的,视图有时会变得很糟糕,我们仍然不知道这是一个简单视图还是一个嵌套视图,其中嵌入了多个索引


当我遇到这些问题时,我只是尝试查看视图的代码,将其定义嵌入有问题的查询,然后查看执行计划。不知何故,正如我所观察到的那样,优化器无法始终很好地处理嵌套视图。

您必须将计算字段添加到Person作为NameSurname。并在其上创建索引

更改表dbo.R_Person将nameurname添加为Name+“”+姓氏

SELECT Person._pk 
FROM dbo.R_Person as Person 
WHERE Person._pk > 0 
AND Person.NameSurname  LIKE 'jane morgan%' 
AND EXISTS (
    SELECT 1 FROM dbo.R_PersonView12 V
    WHERE V._pk = Person._pk
)

WHERE中的所有列都有索引吗?您能否查看查询计划,以了解当您同时使用两个名称col时,为什么需要很长时间?可能有一种方法可以调整索引,这样它可以更有效地工作。我被告知,这里涉及的两个列都被索引了。我没有直接访问数据库的权限。不幸的是,我维护了生成查询的软件。我想知道嵌套使用IN是否会强制查询只查看通过一次搜索进行第二次搜索的记录。似乎您唯一的选择是更改查询。您的IN示例和我的EXISTS示例在逻辑上是相同的是,它们确实限制开始搜索记录,但EXISTS有时比IN具有性能优势,因为在某些情况下,它可以将搜索推到视图的更深处,而IN不能。你能试试吗?