写了个视图,为啥select在数据库查只需要一秒,但是转为list时就很慢,
并且select*from要比带where条件的速度要快,索引也都加了
了解IEnumable和IQuerable,ToList是前者,而存在IQuerable实现那么调用的是IQuerable实现。
这个好像与数据库没关系吧
sp_refreshview 视图名, 试试
刷新视图可以有用吗?我没改视图
@灬丶: 不知道你是用啥查的,是不是ef,如果是ef的话,你追踪下ef生成的sql语句,然后用这个生成的sql 去数据库查询 看看效果
@Fan丶: IBatis,并且在数据库里带where条件比查全部的慢,哎,百思不得其解
@灬丶: 是否涉及到时间筛选,或者索引没用到,特别是时间查询,如果没用到 就容易全表查询,可以查看下sql执行计划,看看使用资源情况,你的ibatis 配置下 看看输出的sql
@Fan丶: 没有,int查询
@Fan丶: 那也不应该比查全部的慢吧,是不是视图left join太多表了
@灬丶: 有可能,比如你 a表 10万数据,b表100万。你left join
后 筛选 a 数据,如果where 不合理,可能把b也全表扫表了,多看看你的sql
@Fan丶: 那为啥查询所有的比带where条件快呢?
你这样问问题别人怎么回答呢,最少要把语句发一下吧
主要语句太长了
CREATE VIEW [dbo].[V_CardCheck] WITH SCHEMABINDING
--------红黄牌统计视图
AS
SELECT phd.Phd_ProjectNumber AS ProjectNumber,phd.Phd_ProjectName AS ProjectName,
CASE SUBSTRING ( phd.Phd_ProjectNumber ,1,1)
WHEN 'A' THEN '集管省建'
WHEN 'C' THEN '地市自主立项项目'
ELSE '省管项目'
END ProjectArea
,phd.Phd_Room AS DepGroup ,phd.Phd_WbsOrgName AS WbsOrgName,phd.Phd_BuildRegion AS Region,Phd_ProvinceManagerId AS ProvinceManagerId,Phd_ProjectManagerId AS ProjectManagerId,
CASE --判断是否有立项变更时间
WHEN phd.Phd_InitChangeDate IS NOT NULL THEN phd.Phd_InitChangeDate
ELSE phd.Phd_InitDate
END InitDate
,pt.P_WorkflowEndDate AS ProjectTransferEndDate
,MIN(t.CreateTaskTime) AS CreateTaskTime,
CASE --判断是否有工期调整
WHEN psptic.SwChangeEndTime IS NULL THEN pspti.SwEndTime
WHEN psptic.SwChangeEndTime IS NOT NULL THEN psptic.SwChangeEndTime
END SwEndTime,
CASE --判断是否有设计批复变更时间
WHEN phd.Phd_ChangeDesignReplyDate IS NOT NULL THEN phd.Phd_ChangeDesignReplyDate
ELSE phd.Phd_DesignReplyDate
END DesignReplyDate
,phd.Phd_StartWorkDate AS StartWorkDate,phd.Phd_CompleteWorkDate AS CompleteWorkDate
,phd.Phd_PreliminaryDate AS PreliminaryDate ,phd.Phd_FinalInspectionyDate AS FinalInspectionyDate FROM dbo.T_ProjectHisDoc phd
--取任务分解最早时间
LEFT JOIN(
SELECT MIN(T_CreateTime) AS CreateTaskTime,T_ProjectNumber FROM dbo.T_Task WHERE T_DeleteTime IS NULL GROUP BY T_ProjectNumber
) t ON t.T_ProjectNumber=phd.Phd_ProjectNumber
--过滤未移交完成项目
INNER JOIN
(
SELECT P_WorkflowEndDate,P_ProjectNumber FROM dbo.IPMS_ProjectTransfer WHERE P_DeleteTime IS NULL AND P_WorkflowEndDate<>'' GROUP BY P_ProjectNumber,P_WorkflowEndDate
) pt ON pt.P_ProjectNumber=phd.Phd_ProjectNumber
--取实施计划割接时间最晚最为计划完工时间
LEFT JOIN(
SELECT MAX(Pspti_SwdEndTime) AS SwEndTime,Pspti_ProjectNumber FROM dbo.T_ProjectSchedulePlanByTaskItem WHERE Pspti_SwName='割接上线' AND Pspti_DeleteTime IS NULL GROUP BY Pspti_ProjectNumber
)pspti ON pspti.Pspti_ProjectNumber=phd.Phd_ProjectNumber
--是否做了工期调整,有则取调整后时间
LEFT JOIN (
SELECT MAX(Psptic_SwdEndTime) AS SwChangeEndTime,Psptic_ProjectNumber FROM dbo.T_ProjectSchedulePlanByTaskItemChange WHERE Psptic_SwName='割接上线' AND Psptic_DeleteTime IS NULL GROUP BY Psptic_ProjectNumber
) psptic ON psptic.Psptic_ProjectNumber=phd.Phd_ProjectNumber
WHERE Phd_DeleteTime IS NULL AND ISNULL(Phd_SpecialProject,'') ='' AND phd.Phd_ProjectManagerId<>0 AND Phd_ProjectState=1
GROUP BY phd.Phd_Id,phd.Phd_ProjectNumber ,pt.P_WorkflowEndDate,phd.Phd_DesignReplyDate,phd.Phd_StartWorkDate,phd.Phd_CompleteWorkDate,phd.Phd_PreliminaryDate
,phd.Phd_FinalInspectionyDate,pspti.SwEndTime,psptic.SwChangeEndTime,phd.Phd_BuildRegion,phd.Phd_ProvinceManagerId,phd.Phd_ProjectManagerId,phd.Phd_InitDate
,phd.Phd_WbsOrgName,phd.Phd_InitChangeDate,phd.Phd_ChangeDesignReplyDate,phd.Phd_Room,phd.Phd_ProjectName
然后
select * from V_CardCheck where ....要比select * from V_CardCheck的时间长
@灬丶: 你看一下两条语句的执行计划有什么区别。另外补充一下select * from V_CardCheck并不是全表查询比如你用mysqlworkbench去执行select * from V_CardCheck他会给你加个limit0,1000的。
加了索引如果你的语句写的不对也可能不走索引 所以碰到加索引依然很慢就看一下执行计划看一下
@灬丶: 你的view里面的查询语句可能根本就没走索引
on没走所以吗
@灬丶: 把语句拿出去看一下执行计划就全明白了 你语句太多了没办法帮你一条一条看
在java里面,查询出来的结果需要去做生成对象的操作,查询的时候你可以打开任务管理器,显示肯定是这样的,先是网络占用很大资源,然后java一个个生成对象到list,会占用很大的内存。这样式很需要时间的