首先:我不是一个DB专家,所以请尽情享受,如果问题很琐碎...火鸟2.5 SQL查询执行计划不使用索引或声明
我有一个子表CHILD
查询寻找在主表PARENT
中增加一些值以确定是否要加载条目。
查询看起来像这样
SELECT C.*, P.DATE, P.STATUS
FROM CHILD C, PARENT P
WHERE C.PARENT_ID = P.ID
AND (P.DATE > '01.01.2015' OR (P.STATUS <> 1 AND P.STATUS <> 9));
我选择的目的STATUS
价值观强调的是,我需要使用的不平等,我需要选择从是不连续的状态值。
我对PARENT.ID
有外键CHILD.PARENT_ID
,并创建了一个索引CHILD.PARENT_ID
。我还在和STATUS
字段的表PARENT
上创建了索引。
现在,当我更换OR
与和AND
CHILD
使用上PARENT_ID
和PARENT
索引使用上DATE, STATUS
这是我所期望的指数。
但是,当使用OR
时,查询使用CHILD
上的自然计划和PARENT.ID
上的主键索引。
发生同样,如果我申请查询仅父表:
SELECT P.* FROM PARENT P WHERE (P.DATE > '01.01.2015' OR (P.STATUS <> 1 AND P.STATUS <> 9));
有没有办法来优化这样的查询使用比天然计划好?
你能否在这里更新两个计划:http://www.brentozar.com/pastetheplan/ ..此外,表格数量, – TheGameiswar
这两个表上的索引请标记您正在使用的数据库。 –
请编辑您的问题,为所讨论的表(包括所有索引)和执行计划添加'create table'语句。 [_Formatted_](http://stackoverflow.com/help/formatting)**文本**请[无屏幕截图](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload图像-的代码上那么当-要价-A-问题/ 285557#285557) –