我有以下查询,
SELECT 1
FROM orderdetail -- table orderdetail has 1420703 rows
WHERE orderdetailstatusid != 3 -- not cancelled
AND
navdate = '20161212';
问题在于,扫描一个包含~1420703行的大表时,执行时间超过130秒。我想知道是否有办法让它快一点。
我最后尝试limit 1
,但这也无济于事。
有人可以提出一些建议,如何改进?
提前谢谢。
答案 0 :(得分:2)
在表格上创建索引会使速度更快。
CREATE INDEX index_name1
ON table_name (navdate)
CREATE INDEX index_name2
ON table_name (orderdetailstatusid)
答案 1 :(得分:1)
SELECT 1
FROM orderdetail With(NOLOCK)
WHERE orderdetailstatusid!= 3 - 未取消
AND navdate ='20161212';
答案 2 :(得分:1)
并添加我的贡献:
为获得最佳表现:
首先,您应按照macco
的建议索引2列其次,!=
/ <>
运算符是一个性能上的杀手,比=
运算符对引擎更加密集,并且可能会导致全表扫描。
如果可以,最好列出所有可能的值,而不是说与值不同。
看起来就是这种情况。所以你可以像这样重写你的查询:
SELECT 1
FROM orderdetail -- table orderdetail has 1420703 rows
WHERE orderdetailstatusid IN (1,2,4,5) -- everything but cancelled
AND navdate = '20161212';
假设您只能拥有{1,2},(1,2,3,4,5)等orderdetailstatusid
值,请相应更改。