在网络上searching for a solution之后进行慢速查询。我注意到将查询转换为动态查询会使其执行得更快。这似乎与传递不同参数时使用的错误执行计划有关。
这很慢
SELECT ProductID, ProductName FROM TransactionHistory
WHERE (ProductID = pProductId OR pProductId IS NULL)
AND (ReferenceOrderID = pOrderId OR pOrderId IS NULL)
AND (TransactionType = pTransactionType OR pTransactionType IS NULL)
这很快(请忽略错误的查询和注入)
vSql := 'SELECT ProductID, ProductName FROM TransactionHistory WHERE 1=1 '
IF pProductId IS NOT NULL THEN
vSql := vSql || ' AND ProductID = ' || pProductId
END IF;
IF pOrderId IS NOT NULL THEN
vSql := vSql || ' AND ReferenceOrderID = ' || pOrderId
END IF;
IF pTransactionType IS NOT NULL THEN
vSql := vSql || ' AND TransactionType = ' || pTransactionType
END IF;
OPEN pCursor FOR vSql;
我目前正在研发10g,但很快就会转向11g。使用11g,有没有办法让查询在没有动态查询的情况下快速运行?