日期:2014-05-17  浏览次数:20515 次

inner join 在数据量大时的查询优化问题?
----------------------------
Cards表有30000多条数据
cardSale表有20000多条数据
--------------------------

t-sql
select a.* from cardSale a inner join cards b on a.cardID=b.cardID where a.payment=1 order by a.id asc

查询时间 55秒
asp程序报错 【Microsoft OLE DB Provider for SQL Server 错误 '80040e31' 超时已过期 】

------解决方案--------------------
你这个数据量一点都不大,可以考虑asp那里的超时加长一点。优化的根据应该是看执行计划。你先贴出来吧。这个语句或者换成这个试试:

SELECT  a.*
FROM    cardSale a
WHERE   a.payment = 1
        AND EXISTS ( SELECT 1
                     FROM   cards b
                     WHERE  a.cardID = b.cardID )
--ORDER BY a.id ASC

在cardSale 的id上创建一个asc的聚集索引。这样可以避免order by的开销。另外,在两表的cardid上创建非聚集索引试试。
------解决方案--------------------
同意楼上的。
------解决方案--------------------
这个不是数据库查询超时,而是你指定了太短的超时时间。
------解决方案--------------------
先在数据库里单独执行SQL语句,看看时间多少。如果时间很长,请参考1楼的的办法修改。
如果单独执行很快,那么就不是SQL的问题了,关注下你的asp程序,可以开启数据库后台跟踪sql server profiler,看看代码实际执行情况。
------解决方案--------------------
select a.* from cardSale a inner join cards b on a.cardID=b.cardID where a.payment=1 order by a.id asc

可以是没有索引 cardid上建索引试试。

------解决方案--------------------
不用a.* ,把要查的字段一个一个写出来