2012-08-10 50 views
-1

。凡(X => x.Rated!) 這將創建的SQL,看起來像: 沒有(cdrcalltmp0_.Rated = 1)獲取連貫NHibernate不使用參數

我們的DBA說,我不得不刪除不適合一些過濾的索引工作。

。凡(X => x.Rated ==假) 這將創建的SQL,看起來像:通過cdrcalltmp0_.Created ASC」

這並不因爲工作 [email protected]秩序參數。

他想這個SQL:由cdrcalltmp0_.Created ASC」

cdrcalltmp0_.Rated = 0順序是有可能使NHibernate的不使用參數? 這樣過濾的索引就可以工作。

+1

「由於參數,這不起作用。」爲什麼不工作? – Jaguar 2012-08-10 10:03:58

+0

同意,什麼概率與「這是因爲參數不起作用。」 – Chev 2012-08-10 11:27:29

+0

對不起,我不知道爲什麼索引不能使用參數。我猜應該。 – Anders 2012-08-10 13:19:23

回答

0

前言: 以下的答案是假設你使用SQL Server 2008中如果你沒有,那麼它很可能是使用NOT運算符時,數據庫技術問題,不支持索引。所以,如果你使用SQL Server 2008 ...

你的DBA不知道他在說什麼。

以下語法

NOT (SomeTableAlias.SomeTableColumn = 1) 

絕對由SQL Server查詢分析器的理解。我有NHibernate的查詢,看起來像上面的語法,他們確實使用正確的索引。

並回答你的問題,沒有。 NHibernate在爲你創建SQL時總是使用參數。參數化查詢是非常常見的地方,即使您自己使用傳統的ADO.NET。

讓NHibernate不使用參數的唯一方法是如果您使用session.CreateSQLQuery()方法提供它需要執行的SQL。

無論如何,上述行,你貼:

Where(x => x.Rated == false) This creates sql that looks like: [email protected] order by cdrcalltmp0_.Created asc' 

是完全有效的。當SQL Server收到參數化查詢時,它將使用您的「額定」列中的任何索引。

如果您的DBA仍然懷疑您,請告訴他在Sql Server Management Studio中運行帶有「顯示估計執行計劃」功能的查詢。這將證明查詢正在使用索引。

+0

不要太確定。因爲SQL Server 2000將它解釋爲WHERE CAST(SomeBitColumn AS INT)= 1'而不是'WHERE SomeBitColumn = CAST(1 AS BIT)',所以SQL Server 2000甚至不使用索引來清除WHERE SomeBitColumn = 1。我知道這已經得到了改進,但它很大程度上取決於所使用的SQL Server的確切版本。這個問題甚至沒有明確指定SQL Server完全被使用,而不是某些其他數據庫引擎(但是毫無疑問,語法看起來像它)。 – hvd 2012-08-10 23:10:29

+0

@ hvd好點。我將更新我的答案,序言我所做的陳述對於SQL Server 2008是正確的。 – 2012-08-10 23:35:35

+0

更新:這是一個過濾的索引。有時nhibernate不使用參數。出於某種原因,我的原始問題中的第一個示例不使用參數 – Anders 2012-08-13 08:53:55