我在多列上搜索大型(> 200,000行)SQL服务器表时寻求更好的性能。当前代码生成类似
的查询(
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
)
当只搜索到一个名称时,它会立即返回,但是在第一个和最后一个搜索时(通常需要找到正确的人,因为单独一个人会有太多匹配),运行时变得高得令人无法接受。任何人都可以建议一种不同的方法来构建此查询以提高性能吗?
答案 0 :(得分:0)
最好查看查询计划。但你肯定可以试试这个:
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。
哪些列还有索引?
答案 1 :(得分:0)
您必须将计算字段作为NameSurname添加到Person。并在其上创建索引。
alter table dbo.R_Person将NameSurname添加为名称+''+姓氏
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
)
答案 2 :(得分:-1)
正如ElectricLlama所提到的,视图往往会变得令人讨厌,我们仍然不知道这是一个简单的视图还是嵌入了多个嵌入视图的嵌套视图。
当我遇到这些问题时,我只是尝试查看视图的代码,将其定义嵌入我的有问题的查询中,然后查看执行计划。正如我所观察到的那样,优化器无论如何都不能很好地处理嵌套视图。