價值內聯

有時,引數的便利性(在維護和表現力方面)可能會被其效能成本所抵消,以將其作為引數對待。例如,當頁面大小由配置設定修復時。或者狀態值與 enum 值匹配。考慮:

var orders = connection.Query<Order>(@"
select top (@count) * -- these brackets are an oddity of SQL Server
from Orders
where CustomerId = @customerId
and Status = @open", new { customerId, count = PageSize, open = OrderStatus.Open });

這裡唯一真實的引數是 customerId - 另外兩個是偽引數,實際上不會改變。如果將 RDBMS 檢測為常量,RDBMS 通常可以做得更好。Dapper 有一個特殊的語法 - {=name} 而不是 @name - 它只適用於數字型別。 (這可以最大限度地減少 SQL 注入的任何攻擊面)。一個例子如下:

var orders = connection.Query<Order>(@"
select top {=count} *
from Orders
where CustomerId = @customerId
and Status = {=open}", new { customerId, count = PageSize, open = OrderStatus.Open });

在發出 SQL 之前,Dapper 用文字替換值,因此 RDBMS 實際上看到如下內容:

select top 10 *
from Orders
where CustomerId = @customerId
and Status = 3

當允許 RDBMS 系統不僅做出更好的決策,而且開啟實際引數阻止的查詢計劃時,這尤其有用。例如,如果列謂詞針對引數,則不能使用在該列上具有特定值的篩選索引。這是因為下一個查詢可能具有與這些指定值之一不同的引數。

使用文字值,查詢優化器能夠使用篩選的索引,因為它知道在將來的查詢中值不會更改。