2016-04-21 105 views
0

这是我的选择查询。Oracle选择查询花费很长时间

select count(m.uniq_no) cnt 
     from web_cst_mst m 
inner join WEB_CST_INV i on M.UNIQ_NO=I.UNIQ_NO 
where I.INV_NO='inv01' 
    and I.INV_DT=to_date('2015-01-12','YYYY-MM-DD') 
    and M.sel_tin='19320703277' 
    ; 

我已经创建了一个(uniq_no,sel_tin)指数web_cst_mst表和(uniq_no,inv_no,inv_dt)web_cst_inv表的索引。

该查询需要大约250ms才能执行。之前它曾经需要500毫秒,当我有修剪功能卖方tin(trim(M.sel_tin))。我删除了修剪,它是原来的时间的一半,所以我想如果我可以删除to_date功能,那么它可能需要较少的时间,但我在这里面临的问题是我发送日期字符串格式,因为我不能发送c#日期变量在(10-JAN-14)这种格式中,因为c#日期变量也保持时间。我试过下面的代码只是为了发送日期部分,以便我可以删除oracle中的to_date函数,但它不工作。并且oracle中的日期以(dd-MMM-yy ex:10-JAN-14)格式存储。所以无论我只需要发送日期部分还是必须在查询中有to_date函数。

我想只发送日期时间变量的日期部分以提高此查询的性能。但我无法做到这一点。

任何建议/有助于提高性能。谢谢。

DateTime inv_date = DateTime.ParseExact(inv_dt, "dd-MMM-yy", CultureInfo.InvariantCulture).Date; 
+0

*您应该*使用参数化查询和传递的字符串而不是实际的日期时间值,以避免转换错误。例如,你提到的格式('10-JAN-14')保证失败*并*引入Y2K错误。尽管如此,这*不会对性能有所帮助。 'to_date'应用于可用于搜索索引的单个字符串。另一方面,'Trim'必须应用于* all *行,以防止使用索引。 –

+0

你看过sql执行计划吗? –

回答