【问题标题】:SQL query optimization for select query over IN query选择查询优于 IN 查询的 SQL 查询优化
【发布时间】:2020-03-26 13:24:42
【问题描述】:

我有一个视图,我想在这个视图上添加分页逻辑。有超过 150 万条记录。如果我的 where 条件只选择映射到一个 ID 的特定记录,则需要更长的时间才能获得结果。 我正在考虑只从主表中获取那些映射的记录,然后只从视图中选择那些记录,这会更快吗?

Select top 10 col1, col2, col3, ROW_NUMBER() OVER (ORDER BY col4 desc) from vMyView where someid=1

然后

Select top 10 col1, col2, col3 from vMyView where col1 in (Select col1 from tMyTable where someid=1)

仅供参考,我不是专家

【问题讨论】:

  • 取决于vMyView 的构建方式以及视图基础表上存在的索引(以及tMyTable 上的索引)。我的猜测是,在你的 SQL 中添加更多逻辑不会让它更快。
  • 好吧,最重要的是,IN 速度非常慢,因为查询优化器不会生成参数数量的统计信息。一旦你点击了其中的一些(10、20?),最好使用临时表变量,加载其中的值并使用连接 - 因为如果你正确定义它,该表变量实际上确实会生成统计信息

标签: sql-server sql-server-2008


【解决方案1】:

假设典型的基数,我倾向于这样写:

select top 10 col1, col2, col3 
from vMyView v
inner join tMyTable t ON t.col1 = v.col1
WHERE t.someid = 1

但是,如果对于vMyView 中的每个col1 值,可以匹配tMyTable 中的多行,这可能会导致与vMyView 重复行。如果可以复制行,基于row_number() 的解决方案通常是最快的选择。


我想在这个视图上添加分页逻辑

至于分页,您应该查看OFFSET/FETCH 语法,而不是TOP n。

SELECT col1, col2, col3
FROM vMyView v
ORDER BY <need an order by clause for paging to work>
OFFSET <pagenumber * pagesize> FETCH NEXT <pagesize> ROWS ONLY

【讨论】:

  • 在前辈的帮助下解决了这个问题,谢谢大家的帮助。赞赏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多