我有一個視圖,即連接24個表(除1外都是外部連接)和83列。當我從視圖中選擇*而沒有order by子句時,它會在大約4:27秒內返回27k行所有列。如果我執行相同的選擇,但添加'order by requestId'子句,則需要83分鐘才能完成。 正在排序的列在原始表中編入索引。按條款使用單列順序時視圖緩慢查詢
我試着用requestId在Select * from(.......)順序中包裝它,但得到了相同的結果。
建議上哪裏找
我有一個視圖,即連接24個表(除1外都是外部連接)和83列。當我從視圖中選擇*而沒有order by子句時,它會在大約4:27秒內返回27k行所有列。如果我執行相同的選擇,但添加'order by requestId'子句,則需要83分鐘才能完成。 正在排序的列在原始表中編入索引。按條款使用單列順序時視圖緩慢查詢
我試着用requestId在Select * from(.......)順序中包裝它,但得到了相同的結果。
建議上哪裏找
解釋可能會告訴你更多,如果您有通過它涉水的時候,但我猜測會說這是做了充分的排序所有27000行,因爲它無法找到一個有用的有序索引來避免額外的排序。
這將是很難發現當中你有什麼,但一個簡單的場景將
TableA的KeyColumn,DataColumn的,其中鍵列是主鍵
Select * From TableA Order By KeyColumn
,將用PK指數,這是訂單,所以不需要排序。
select * From TableA Order By DataColumn
,會讀取表格然後做一個排序。
爲數據列添加索引,並且不需要排序。
只要你遇到更復雜的場景,可能是你有一個有用的排序索引,但它不是最好的加入,所以它快速地加入,然後花費所有的時間排序。
如果我在看這個,做什麼都不會跳到我身上。根本沒有任何索引的requestid,那麼我會開始剔除查詢中的表,直到我停止獲取不需要的行爲。然後放回一個來取回它,然後使用這個希望不那麼費力的查詢並查看是否可以獲得有用的索引或重新查詢以使用更有用的索引。
祝你好運。
如果您對列有秩序,那麼該列必須是任一部分: - 它自己的索引,其中,僅列存在 - 或者在具有在WHERE子句,然後將字段的索引ORDER BY子句中的字段按照確切的順序排列。
如果您向我展示查詢,最好。然後我可以和你一起頭腦風暴。
這個特定的查詢是否真的需要所有24個表中的列?也許你應該考慮針對基表編寫一個有針對性的查詢,而不是繼承超大視圖的所有噪聲。 – 2012-07-06 13:07:22
不幸的是,它返回的數據被導出到excel進行進一步分析。 – 2012-07-06 13:09:37
嗯,我會要求查看執行計劃,但恐怕他們會給我做噩夢。 :-( – 2012-07-06 13:10:22