2009-09-23 180 views
1

我有一個nhibernate查詢來生成這樣的查詢。我只提取出的示例場景NHibernate查詢優化

SELECT ID FROM EMPLOYEE WHERE = EMPLOYEE.NAME @ P1和 AND MANAGER_ID IN(@ P2,P3 @,@ P4 ... @ PN)等。

使用NHprofiler我發現查詢需要大約500毫秒。表具有名稱和manager_id的索引。員工表大約有600萬條記錄。

當查詢只有一個記錄要在manager_id內搜索時,例如

SELECT ID FROM EMPLOYEE WHERE = EMPLOYEE.NAME @ P1和 AND MANAGER_ID IN(@ P2),該查詢在大約2秒完成。

因此,我試圖通過使用最終查詢並運行查詢@n次(n - pn的數量)來劃分此查詢。但是,這些查詢中的每個查詢的性能都會增加大約400 ms或更多。

有同等Storedproc的(有要是再尋找經理ID樹的條件),並執行速度更快..

有沒有辦法,我在這裏我失去了一些東西?

謝謝。

+0

你有適當的DB指標設置? – 2009-09-23 20:06:29

+0

是的..它與sp和nhibernate正在打的相同的分貝..! – bkhanal 2009-09-23 20:37:14

回答

0

思考...

  • IN的計算結果爲..OR..OR..OR等讓你有一個索引掃描。這是殺手。

  • 是否索引「覆蓋」以避免密鑰查找?

  • 兩種方式的指數有什麼不同?我建議同時具有這樣的優化可以選擇什麼是最好的(根據統計,基數等)

這樣的:

CREATE INDEX IX_MN ON EMPLOYEE (MANAGER_ID, NAME) INCLUDE (ID) 
CREATE INDEX IX_NM ON EMPLOYEE (NAME, MANAGER_ID) INCLUDE (ID) 
  • 你能改寫爲UNION/UNION ALL?

這樣的:

SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p2 
UNION ALL 
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p3 
UNION ALL 
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p4 
UNION ALL 
SELECT ID FROM EMPLOYEE WHERE EMPLOYEE.NAME = @P1 AND AND MANAGER_ID = @p5 
UNION ALL 
.... 
  • 待辦事項@ p1和p2的@ @ .. PN匹配列的數據類型究竟

  • SP是什麼樣的?