作爲一個方面的問題,請注意,如果您可以對字符串長度的一些假設,你的加盟表達可以簡化(並可能獲得更好的性能,因爲一方是現在使用的平等):
SELECT tbl1.col1, tbl1.col2
FROM
TBL1
INNER JOIN TBL2
ON tbl1.col + tbl1.col2 = tbl2.col1
AND tbl1.col4=2233
AND tbl1.date1 BETWEEN tbl2.date1 AND Coalesce(tbl2.date2, GetDate())
另外,如果你正在尋找最佳的性能,試試這個:
ALTER TABLE TBL2 ADD LeftPart AS (LEFT(col1, LEN(col1)-2));
ALTER TABLE TBL2 ADD RightPart AS (RIGHT(tbl2.col1,2));
CREATE NONCLUSTERED INDEX IX_TBL2_Parts ON TBL2 (LeftPart, RightPart);
現在你只需加入像這樣:
SELECT tbl1.col1, tbl1.col2
FROM
TBL1
INNER JOIN TBL2
ON tbl1.col = tbl2.LeftPart
AND tbl1.col2 = tbl2.RightPart
AND tbl1.col4=2233
AND tbl1.date1 BETWEEN tbl2.date1 AND Coalesce(tbl2.date2, GetDate())
甚至更好,更改數據庫設計以實際將TBL2.col1數據存儲在兩列中。通過在一列中放入兩個截然不同的數據,您違反了第一種正常形式,現在,正如您發現的那樣,您在整個應用程序中支付性能,開發&10維護時間,查詢複雜性和等等。
甚至可以將我的方案顛倒過來以便LeftPart和RightPart列是實數,並且創建一個具有Col1名稱的新計算列,並使用索引來實現這些值並使它們可供搜索。最後,如果完全需要,您可以重命名錶,使用舊名稱在表上創建視圖,然後在視圖上放置INSTEAD-OF觸發器,以截取對該表的數據操作並將它們轉換爲正確的模式。
更新
順便說一句,如果你對錶的設計沒有任何影響,你可能要考慮使用的「99991231」的tbl2.date2的「開放式日期」值或一些這樣的,而不是空值。 Coalesce可能會導致性能下降,有時會在可能的情況下強制進行掃描。
這通常是缺少索引或陳舊統計信息的問題。順便說一句,請停止使用'NOLOCK'。 – 2010-09-23 17:45:31