【发布时间】:2021-05-17 14:25:20
【问题描述】:
我需要优化以下查询:
IF object_id('tempdb..#TAB001') IS NOT NULL
DROP TABLE #TAB001;
select *
into #TAB001
from dbo.uvw_TAB001
where 1 = 1
and isnull(COD_CUSTOMER,'') = isnull(@cod_customer,isnull(COD_CUSTOMER,''))
and isnull(TAXCODE,'') = isnull(@taxcode, isnull(TAXCODE,''))
and isnull(SURNAME,'') = isnull(@surname,isnull(SURNAME,''))
and isnull(VATCODE,'') = isnull(@vatCode,isnull(VATCODE,''))
目标是提高此查询的性能。 目前速度很快,但我想加快速度。
此查询具有可选参数,需要对其进行查询,无论设置了 all 还是 1 个参数,都在尽可能短的时间内返回结果。
【问题讨论】:
-
那么无论您做什么,都不要使用
ISNULL来节省一些输入,这是确保不能使用索引的好方法。请参阅this 和文章的其余部分,了解是做什么好。 -
您可以将索引添加到基础表。添加索引通常由数据库管理员完成。这取决于 COD_CUSTOMER、TAXCODE、SURNAME、VATCODE 是从视图中的基础表中选择的列还是计算的列。您可以通过编写视图来验证。如果它们被选中,我将为基础表的每一列添加 1 个索引。 SQL Server 应该处理这些索引的合并连接,或者至少选择它认为最优化的索引组合。您可以通过查看 SSMS 中的估计执行计划来确认 SQL Server 是否使用索引。