2012-09-26 48 views
3

我有一些我繼承的T-SQL(SQL Server 2008),並試圖找出爲什麼某些查詢運行得非常慢。在Actual Execution Plan我有三個聚集索引掃描,這些掃描使我花費了19%,21%和26%,所以這似乎是我的問題的根源。2個變種之間的T-SQL隱式轉換

字段的內容通常是數字(但有些作業號有一個字母前綴)

的數據庫設計(供應商)是相當差。在他們的申請中,職位編號的最大長度爲12個字符,但在加入的表格中,在某些地方定義爲varchar(50),其他地方定義爲varchar(15)。我的參數是varchar(12),但我得到同樣的事情,如果我將其更改爲varchar(50)

節點包含此:

Predicate: [Live_Costing].[dbo].[TSTrans].[JobNo] as [sts1].[JobNo]=CONVERT_IMPLICIT(varchar(50),[@JobNo],0) 

sts1是派生表,但表中它拉jobno從一個varchar(50)

我不明白爲什麼它在做兩個varchars之間的隱式轉換。僅僅因爲它們長度不同?

我是相當新的執行計劃

有一種簡單的方法來找出哪些節點在EXEC計劃涉及到查詢的哪一部分? 是謂詞,連接子句?

問候

馬克

+6

[可能是整理不匹配](http://blogs.msdn.com/b/arvindsh/archive/2012/09/18/sql-collat​​ion-and-performance.aspx)。看起來不像是你的問題的原因,但轉換髮生在參數而不是列上。 –

+1

發佈TSQL .. – Paparazzi

+0

那麼,給你一個正方形和公平的答案需要一些更多的信息。也許你可以給我們更多關於執行計劃的細節?也許你可以在某處張貼一些圖片或xml文件? –

回答

1

有些變量可以歸類:enter link description here

無論您需要驗證您的排序規則,可以在服務器,數據庫,表和列級指定。

首先,檢查您的tempdb和供應商提供的數據庫之間的排序規則。它應該匹配。如果沒有,它會傾向於進行隱式轉換。

假設您無法修改供應商提供的代碼庫,以下一項或多項內容可幫助您: 1)預定義臨時表併爲鍵字段指定與正在使用的數據庫相同的排序規則,而不是tempdb 。 2)在進行字符串比較時提供排序規則。 3)如果在臨時表中使用「select into」,則指定鍵值的排序規則 4)確保您的表和列中的排序規則與您的數據庫排序規則匹配(如果僅將某個特定表從某個供應商導入到現有數據庫)

如果您可以更改供應商提供的代碼庫,那麼我會建議您查看使所有char密鑰長度相同並且不使用varchar的開銷。 Varchar的開銷爲10.需要注意的是,如果您創建的固定長度字符字段不爲空,它將被填充到右側(不可避免)。

理想情況下,你將有一個整型鍵,並且只使用VARCHAR字段用戶交互/查找:

創建表產品(產品ID INT NOT NULL標識(1,1)主鍵聚集,ProductNumber VARCHAR(50) NOT NULL)

ALTER TABLE產品添加約束uckProducts_ProductNumber獨特(ProductNumber)

然後做所有聯接的產品ID,而不是ProductNumber。只需過濾ProductNumber。

會很好。