我遇到了一个需要永久执行的存储过程.这是非常大的,我可以理解,我会花一些时间,但这一次持续将近20分钟.
经过一些调试和研究后,我注意到替换了这部分WHERE条款;
((p_DrumNo IS NULL) OR T_ORDER.ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY))
Run Code Online (Sandbox Code Playgroud)
发了很大的变化.所以只要p_DrumNo为NULL,或者我修改上面的内容就不检查p_DrumNo是否为NULL,程序就可以正常工作;
(T_ORDER.ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY))
Run Code Online (Sandbox Code Playgroud)
此WHERE子句的目标是在p_DrumNo上传递结果集,如果它传入存储过程.WHERE然后该子句继续进一步的条件,但这个特定的条件停止查询.
ORDERDELIVERY只是一个包含与参数p_DrumNo相关的ORDER_ID的临时表.
这个简单的IS NULL检查怎么会造成如此大的影响呢?它可能与OR子查询的使用有关但我不明白为什么因为子查询本身工作得很好.
提前致谢!
更新 [2011-09-23 10:13]
我将问题分解为显示相同行为的小查询;
例A
SQL查询
SELECT * FROM T_ORDER WHERE
('290427' IS NULL OR ORDER_ID IN (SELECT ORDER_ID FROM T_ORDER WHERE ORDERNO LIKE '290427%') );
Run Code Online (Sandbox Code Playgroud)
执行计划
OPERATION OBJECT_NAME OPTIONS COST
------------------------------------------------------------
SELECT STATEMENT 97
FILTER
TABLE ACCESS T_ORDER FULL 95
TABLE ACCESS T_ORDER BY INDEX ROWID 2 …Run Code Online (Sandbox Code Playgroud) 如何使用正则表达式替换所有类型的换行符(CR、LF 和 CrLf)?
我尝试了 "\n" 和 "\r" 的不同组合,但没有一个找到它们。
formatedString = System.Text.RegularExpressions.Regex.Replace(text, "\r\n", "[Exp 1]")
Run Code Online (Sandbox Code Playgroud)
下面的代码完成了这项工作,但它让我感到烦恼,我似乎无法使用 Regexp 替换换行符。
formatedString = formatedString.Replace(Environment.NewLine, "[Environment.NewLine]") ' Equals CR
formatedString = formatedString.Replace(ControlChars.CrLf, "[ControlChars.CrLf]") ' CR and LF
formatedString = formatedString.Replace(ControlChars.Cr, "[ControlChars.Cr]") ' Carriage Return (CR)
formatedString = formatedString.Replace(ControlChars.Lf, "[ControlChars.Lf]") ' Line Feed (LF)
Run Code Online (Sandbox Code Playgroud)
非常欢迎所有建议!:)