2015-01-12 151 views
0

我有一個sql表約6,000個記錄,每個記錄有17列。如果我在表格上進行基本搜索(即從table_Orders中選擇*),則需要1.5分鐘才能返回所有記錄!我使用這個表運行的任何查詢也很慢。我已經重新編制索引表,所以碎片化並不是問題。此表中有2個nvarchar(max)列,用於存儲xml數據。沒有這些列返回表是非常快(不到1秒)。所以,我猜這是XML查詢陷入困境的數據。有什麼我可以做的,以加快性能的查詢,利用列中的XML在他們?任何見解將不勝感激。我通常不使用sql中的xml,所以我甚至不知道從哪裏開始。SQL表導致運行緩慢查詢

+2

問題只是列的大小。您可以從中提取信息(即使使用索引)。或者,不要歸還它們。 –

+0

由於'(MAX)'數據類型最多可以存儲2GB的數據,並且您在這些列中存儲的數據數量相當可觀,因此這些列的性能很差,我只需將它們放在單獨的表中(使用外鍵) 。你不能索引(最大)數據類型,所以不要通過添加不必要的索引來浪費你的資源。 –

+2

我很想知道爲什麼這些列是'nvarchar',如果這是XML數據。 XML是ascii的一個子集 - 沒有理由使用除UTF-8之外的任何東西。你應該把它們改成'varchar(max)' – Hogan

回答

1

這聽起來像網絡速度和非搜索時間。即使是6000行的表掃描也只需要幾分之一秒的時間 - 搜索所有行。儘管將這些行返回給客戶端,但您正在下載所有這些數據,因此當您檢索大量數據時您將看到不同之處。這與「查詢性能」無關,除非您可以使網絡更快或傳輸更少的數據,否則您無法做任何事情。

您可以通過發佈查詢搜索聚簇索引中的鍵來測試此操作。假設你在RowID上有一個聚集索引...

select RowId, NonXmlColumn where RowId = 3 -- or some other reasonable key 
select RowId, XmlColumn where RowId = 3 

這些查詢的搜索時間將是相同的。所以,任何速度差異都可以歸因於網絡。

+0

我們可能有網絡問題。我嘗試了兩次查詢:
'select Id,來自table_Orders的NonXmlColumn,其中自動編號> 3000
從table_Orders中選擇Id,XmlColumn其中自動編號> 3000'
第一個查詢在1秒內​​運行...第二個查詢花費1分鐘運行。 – user2158338

+0

那是什麼結果呢?請記住,只有在「自動編號」字段上有一個索引時,此測試纔有效,該字段不會「覆蓋」其他字段。 – Jasmine

+0

嗯...好的...我調整了查詢​​在索引字段上搜索。結果之間僅有3秒的差異。這是否意味着我應該索引我的XML列? – user2158338

0

我不會將該數據存儲在表中。如果我這樣做,我不會在VARCHAR中存儲。不要聽起來像個混蛋。

SQL Server有一個xml數據類型:http://msdn.microsoft.com/en-us/library/hh403385.aspx 它說有限制。您應該看到適用於您的方案的內容。

如果您需要保留XML,請將其粘貼到其他位置,並從中獲取您需要搜索的字段。