很奇葩的问题,求大家帮忙看看,sqlserver视图查询问题

紫川琴秀 2018-08-06 05:37:44
1:环境说明[/b]
我有两个数据库
db1 跟 db2
db1有一张人员表t_enterprise_account,有1万条数据
db2创建视图连接db1的人员表
db2还有一张客户表t_yw_customer_mng_qhcrm

2:执行情况

查询语句:
select (select c_nick_name from t_enterprise_account a with(nolock) where a.c_id=t.c_account_id)c_account_id from t_yw_customer_mng_qhcrm t with(nolock) where 1=1 and isnull(c_customer_id,'')='' and black_state=2 order by c_create_time desc OFFSET ((1-1)*300) ROW FETCH NEXT 300 Rows Only

视图语句:
CREATE VIEW [dbo].[T_ENTERPRISE_ACCOUNT]
AS
SELECT *
FROM db1.dbo.T_ENTERPRISE_ACCOUNT

第一种情况:
t_enterprise_account如果使用视图查询的话,执行查询时间为20秒
第二中情况:
不做视图,把t_enterprise_account表建到db2,执行查询时间不用1秒

请问这个是什么情况。


...全文
155 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-08-07
  • 打赏
  • 举报
回复
应该不是联查的问题, 毕竟放在一个库就快了。
跨库, 统计信息无法共享才是关键吧。

SELECT c_nick_name AS c_account_id
FROM t_yw_customer_mng_qhcrm t WITH(NOLOCK)
LEFT JOIN t_enterprise_account a WITH(NOLOCK) ON a.c_id = t.c_account_id
WHERE 1 = 1
AND ISNULL(c_customer_id, '') = ''
AND black_state = 2
ORDER BY
c_create_time DESC OFFSET((1 -1) * 300) ROW
FETCH NEXT 300 ROWS ONLY

先把主键加起来, 再试下 上面的脚本 有没有改善?
如果还不能快起来, 可以贴出执行计划的截图。
紫川琴秀 2018-08-07
  • 打赏
  • 举报
回复
因为c_id就是主键
紫川琴秀 2018-08-07
  • 打赏
  • 举报
回复
c_create_time有索引的,我看了些资料,好像是说,主键不能联查,不然效率会很慢,如果要联查,建议另外创建一个unique
吉普赛的歌 2018-08-07
  • 打赏
  • 举报
回复
主键去掉不可取, 还是多研究下吧。

c_create_time 这个字段有索引么?
紫川琴秀 2018-08-07
  • 打赏
  • 举报
回复
问题已经解决了,但是还是不知道为什么,因为T_ENTERPRISE_ACCOUNT加了主键,就很慢,把主键去了,加了非聚焦索引就可以了,希望大家知道后,来这里回复一下为什么会这样,谢谢!感谢版主大人的耐心解答!
吉普赛的歌 2018-08-07
  • 打赏
  • 举报
回复
EXEC sys.sp_updatestats

两个库上都执行一下这个再试
紫川琴秀 2018-08-07
  • 打赏
  • 举报
回复
刚试了下,也一样
紫川琴秀 2018-08-07
  • 打赏
  • 举报
回复
版主,select * 会影响这个吗
吉普赛的歌 2018-08-06
  • 打赏
  • 举报
回复
-- DB2 上的视图稍改下:
alter VIEW [dbo].[T_ENTERPRISE_ACCOUNT]
AS
SELECT
c_id
, c_nick_name
FROM db1.dbo.T_ENTERPRISE_ACCOUNT


这样再看下

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧