首页 新闻 会员 周边 捐助

sql server下,怎么实现低损耗的Distinct

0
悬赏园豆:5 [已解决问题] 解决于 2012-07-24 10:43

前几天问了一个ASP.Net MVC下EF动态查询导航属性的问题,实现后发现损耗有些大,经查,是使用了Distinct的原因,百度了一下,大家都说Distinct性能有问题。

我的页面使用了三个联动的select和一个PartialView,Select显现的是Distinct之后的JSON数据,本地测试750ms上下而PartialView也就是230ms上下。

请问有什么方法可以提高查询的性能?

BorgChen的主页 BorgChen | 初学一级 | 园豆:11
提问于:2012-07-18 15:37
< >
分享
最佳答案
-1

不一定是Distinct的原因,建议检查一下是否是索引的问题

收获园豆:5
dudu | 高人七级 |园豆:30925 | 2012-07-18 16:11

我是用注释代码的方式调试,结果到Distinct那下运行时间降了一半,Distinct里面的参数也是导航属性的字段来的。

另外我创建了几个相关外键的索引,貌似运行时间又多了百来ms。这个够汗。

BorgChen | 园豆:11 (初学一级) | 2012-07-18 18:15

@BorgChen: 用SQL Profiler捕获一下实际执行的SQL,然后在Management Studio运行这个SQL并看一下执行计划。

dudu | 园豆:30925 (高人七级) | 2012-07-18 18:17

@dudu: 汗的,用SQL Profiler看,有好几个语句都是select...from T where (select ...from T where (select....fromT ))这种形式,不慢才怪,其中一个我拷到Management Studio中运行了一下,949ms。无语了。

另外,dudu,我根据你上次说的去看了一些表达式树的资料,但是好像都没用到导航属性的。

BorgChen | 园豆:11 (初学一级) | 2012-07-18 21:33

@BorgChen: 表达式树与导航属性没有关系

dudu | 园豆:30925 (高人七级) | 2012-07-18 21:40

@dudu: 搞不懂为什么

list=_db.Ts.Where(A);

list=list.where(B)

会被编译成嵌套的select而不是select* from T where A&B

BorgChen | 园豆:11 (初学一级) | 2012-07-18 23:55

@BorgChen: 嵌套的不一定有性能问题,要看实际的执行计划

dudu | 园豆:30925 (高人七级) | 2012-07-19 07:44
其他回答(5)
0

建议通过一些工具(如SQL Server Profiler)来进行监测,找出实际执行的SQL语句,然后分析是什么原因导致慢,是否有索引没有添加等等。

artwl | 园豆:16736 (专家六级) | 2012-07-18 15:46
0

Distinct性能 问题 这种问题在数据量达到100万之前可以直接忽略

建议用缓存解决

互联网Fans | 园豆:344 (菜鸟二级) | 2012-07-18 15:58

汗了,这个表才一万多条记录

支持(0) 反对(0) BorgChen | 园豆:11 (初学一级) | 2012-07-18 18:16
0

GROUP BY 比Distinct要好些

56180825 | 园豆:1749 (小虾三级) | 2012-07-18 16:10
0

EF自动生成的SQL语句,会有两个嵌套的 Group By ,比单个 Group By 执行要快。

Launcher | 园豆:45050 (高人七级) | 2012-07-18 17:57
0

楼主从以下几点优化查询

1、尽量少嵌套的sql语句。

2、索引是否优化?

3、能否用存储过程/函数代替?

4、数据量不是非常大的时候尽可能使用With函数。

Shannon | 园豆:611 (小虾三级) | 2012-07-20 16:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册