2012-06-23 45 views
0

我有一個非常小的樣本項目,可以downloaded from here工作。我想要做的是調試爲什麼抓取在我自己的項目中花了這麼長時間,但我已經將這個項目用作一種基準。我在我的方案中啓用了-com.apple.CoreData.SQLDebug 1,這樣我就可以看到使用提取將哪些命令發送到SQLite存儲區。核心數據獲取不一致

首先,在AppDelegate中,我只是包裝的第一部分(其中正在創建銀行)在for循環創建1000個對象。他們註釋掉AppDelegate的獲取請求。

然後,在FBCFMasterViewController,有一個取指令請求在那裏。在保存的1000個項目後運行應用程序,並把它們取一個NSFetchedResultsController,你會看到成千上萬的輸出線類似的這些:

2012-06-23 09:16:30.374 FailedBankCD[90166:fb03] CoreData: annotation: sql connection fetch time: 0.0004s 
2012-06-23 09:16:30.375 FailedBankCD[90166:fb03] CoreData: annotation: total fetch execution time: 0.0009s for 1 rows. 
2012-06-23 09:16:30.375 FailedBankCD[90166:fb03] CoreData: annotation: fault fulfilled from database for : 0xc3e9060 <x-coredata://60E5B64A-83AB-4E6A-BEAD-5FFF50DB7F66/FailedBankDetails/p823> 
2012-06-23 09:16:30.376 FailedBankCD[90166:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCLOSEDATE, t0.ZUPDATEDATE, t0.ZZIP, t0.ZINFO FROM ZFAILEDBANKDETAILS t0 WHERE t0.Z_PK = ? 

我猜是從是,sortDescriptor與初始化鍵details.closeDate,這是一個關係,從而來排序屬性,它具有抓取故障中的每個對象,使輸出的線出現十萬。

所以我改變了sortDescriptor排序的財產,而不是city,當我運行這段時間,我得到下面的輸出:

2012-06-23 08:53:04.924 FailedBankCD[89564:fb03] CoreData: sql: SELECT 0, t0.Z_PK FROM ZFAILEDBANKINFO t0 ORDER BY t0.ZCITY DESC 
2012-06-23 08:53:04.929 FailedBankCD[89564:fb03] CoreData: annotation: sql connection fetch time: 0.0049s 
2012-06-23 08:53:04.930 FailedBankCD[89564:fb03] CoreData: annotation: total fetch execution time: 0.0059s for 1009 rows. 
2012-06-23 08:53:04.936 FailedBankCD[89564:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCITY, t0.ZNAME, t0.ZSTATE, t0.ZDETAILS FROM ZFAILEDBANKINFO t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?) ORDER BY t0.ZCITY DESC LIMIT 10 
2012-06-23 08:53:04.938 FailedBankCD[89564:fb03] CoreData: annotation: sql connection fetch time: 0.0013s 
2012-06-23 08:53:04.939 FailedBankCD[89564:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCLOSEDATE, t0.ZUPDATEDATE, t0.ZZIP, t0.ZINFO FROM ZFAILEDBANKDETAILS t0 WHERE t0.ZINFO IN (?,?,?,?,?,?,?,?,?,?) 
2012-06-23 08:53:04.971 FailedBankCD[89564:fb03] CoreData: annotation: sql connection fetch time: 0.0318s 
2012-06-23 08:53:04.972 FailedBankCD[89564:fb03] CoreData: annotation: total fetch execution time: 0.0326s for 10 rows. 
2012-06-23 08:53:04.973 FailedBankCD[89564:fb03] CoreData: annotation: Prefetching with key 'details'. Got 10 rows. 
2012-06-23 08:53:04.974 FailedBankCD[89564:fb03] CoreData: annotation: total fetch execution time: 0.0372s for 10 rows. 

我沒有得到重複上千行輸出了,這似乎是預期的產出。但是,如果我再次運行,甚至不進行任何修改,我再次得到成千上萬行輸出類似以下內容:

2012-06-23 09:19:31.263 FailedBankCD[90216:fb03] CoreData: annotation: sql connection fetch time: 0.0006s 
2012-06-23 09:19:31.264 FailedBankCD[90216:fb03] CoreData: annotation: total fetch execution time: 0.0010s for 20 rows. 
2012-06-23 09:19:31.264 FailedBankCD[90216:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCITY, t0.ZNAME, t0.ZSTATE, t0.ZDETAILS FROM ZFAILEDBANKINFO t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ORDER BY t0.ZCITY DESC LIMIT 20 

這是古怪的行爲,不是嗎?任何人都可以快速複製這個並解釋發生了什麼,爲什麼我會得到數千行輸出?

+0

結果是一樣的嗎?我不會擔心Core Data翻譯引擎蓋下的查詢。 –

回答

1

close_datecity不被索引,這解釋了數以千計的查詢,也可能低性能。對於運行之間的差異,我敢打賭你正在使用的緩存:

NSFetchedResultsController *theFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
            managedObjectContext:managedObjectContext sectionNameKeyPath:nil 
               cacheName:@"Root"];