2015-04-23 89 views
6

我試圖讓這個示例儘可能容易地重現。我有一個MS Access的表格,大約有425,000行。當我執行以下查詢再次大約需要10秒錶來執行:爲什麼選擇*比在Microsoft Access數據庫中選擇前1更快

SELECT TOP 1 BlockID FROM AvailabilityBlocks ORDER BY BlockID; 

的「塊標識」字段是主鍵,索引。

但是當我運行下面的查詢它小於2秒返回:

SELECT BlockID FROM AvailabilityBlocks ORDER BY BlockID; 

我試着重建索引,甚至做了壓縮和修復,並沒有作出了區別。

任何幫助或洞察將非常感激!

+1

旁註爲什麼你在訪問如此多的數據,你就是自找麻煩 –

+2

具有訪問任何數據是自找麻煩...

+2

你的標題說,'SELECT *'但是你在做'選擇BlockID' 。除非你只有一列,否則它們不是同一個東西(不是對這個問題應該重要)。 –

回答

1

擴展您的實驗時,您將以更多方式看到MS-Access的這種行爲。

觀察結果在這裏轉載在一個MS-Access數據庫中,用於將CSV導入傳輸到SQL服務器。

使用排序順序選擇全部無索引字段MS-Access需要3分鐘才能執行。選擇全部索引字段時,需要分割秒。當選擇索引字段的TOP 1時,它再次需要3分鐘,這證明該函數沒有使用可用的索引。作弊(SELECT TOP 1 BLOCKID FROM (SELECT BlockID FROM AvailabilityBlocks ORDER BY BlockID)也沒有使用索引,也需要3分鐘。

我的解釋是,MS-Access具有本地「噴氣引擎」功能,可以接受某些用途(我仍然在一些輕量級網站上使用MS-Access)。 '噴氣引擎'支持視覺查詢設計屏幕的所有功能。從Office 2007開始,添加了另一層功能以使SQL語言與T-SQL兼容。

'TOP 1'聲明是這些'新'功能之一。正如你可以看到它在視覺設計中不被支持。很顯然,這個函數不是爲了利用現有的索引而創建的。

你可以限制你的代碼到噴氣發動機的功能在'options for Access'-> 'Design for objects' -> 'Query design' -> 'Compatibility with SQL server (ANSI 92).'

,以保護您的投資在MS-訪問另一個選擇是將數據遷移到ODBC數據庫(MySQL和SQL服務器,甲骨文...)並僅將MS-Access用作前端。 'top 1'的視圖可以通過更優化的引擎渲染。

+0

非常有見地的答案。謝謝! – Mmm

相關問題