我需要一些帮助来提升这个SQL语句.执行时间约为125毫秒.
在我的程序运行期间,这个sql(更好:用于不同表的结构相同的sqls)
将被称为300.000次.
表中的平均行数约为10.000.000行,每天将添加新行(更新/插入)和时间戳.这个特定出口计划的有趣数据在过去的1-3天内.也许这对创建索引很有帮助.我需要的数据是给定id的当前有效行和获取更新的forerunner datarow(如果存在).
我们使用Oracle 11g数据库和Dot.Net Framework 3.5
提升的SQL语句:
select
ID_SOMETHING, -- Number(12)
ID_CONTRIBUTOR, -- Char(4 Byte)
DATE_VALID_FROM, -- DATE
DATE_VALID_TO -- DATE
from
TBL_SOMETHING XID
where
ID_SOMETHING = :ID_SOMETHING
and ID_CONTRIBUTOR = :ID_CONTRIBUTOR
and DATE_VALID_FROM <= :EXPORT_DATE
and DATE_VALID_TO >= :EXPORT_DATE
order by
DATE_VALID_FROM asc;
Run Code Online (Sandbox Code Playgroud)
在这里,我上传了此查询的当前解释计划.
我不是数据库专家,所以我不知道哪种索引类型最适合这个要求.我已经看到可以应用许多不同的可能索引类型.也许Oracle Optimizer Hints也很有帮助.
有没有人有一个好主意调整这个SQL或可以指向我正确的方向?
我们在Oracle数据库中有一个表,其中包含一列类型为Char(3 Byte)的列。
现在,我们使用参数化的sql来选择带有DBNull.Value的某些行,但它行不通:
OracleCommand command = null;
OracleDataReader dataReader = null;
string sql = "select * from TEST_TABLE where COLUMN_1 = :COLUMN_1";
try
{
OracleConnection connection = (OracleConnection) dbConnection;
command = new OracleCommand( sql, connection );
OracleParameter param_1 = new OracleParameter( "COLUMN_1", OracleDbType.Char );
command.Parameters.Add( param_1 );
param_1.Value = DbNull.Value;
dataReader = command.ExecuteReader( );
int recordCount = 0;
while( dataReader.Read( ) == true )
{
recordCount++;
}
Console.WriteLine( "Count = " + recordCount ); // is 0
}
[...]
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我们肯定有一些包含DBNull的行, …
我很惊讶第三种解决方案不起作用(Compiler说:) ; is missing.
bool isFoobar = true;
isFoobar == true ? isFoobar = false : isFoobar = true; // [1] works
( isFoobar ? isFoobar = false : isFoobar = true ); // [2] works
isFoobar ? isFoobar = false : isFoobar = true; // [3] failed
Run Code Online (Sandbox Code Playgroud)
嗯,为什么最后一个不起作用?