Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Advanced Core Data
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Sing Jie Lee
November 20, 2015
Technology
42
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Advanced Core Data
Sing Jie Lee
November 20, 2015
More Decks by Sing Jie Lee
See All by Sing Jie Lee
Infocomm Media Youth Festival 2016 - Career Talk
singjie
0
58
Sprite Kit
singjie
0
59
SiriKit
singjie
0
210
React Native
singjie
1
90
Arduino
singjie
0
45
Software Engineering
singjie
0
57
Amazon Echo and Home Integration
singjie
0
100
CS3216 Garena Project X
singjie
0
53
Life
singjie
0
43
Other Decks in Technology
See All in Technology
從開發到部署全都交給 AI:實作 AI 驅動的自動化流程
appleboy
0
160
Comment regagner la souveraineté de vos données tout en étant payé grâce à Nostr !
rlifchitz
0
200
Agile and AI Redmine Japan 2026
hiranabe
4
480
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
270
[チョークトーク資料]AWS DevOps Agent を使いこなす / AWS Dev Ops Agent Chalk Talk AWS Summit Japan 2026
kinunori
4
770
2026 AI Memory Architecture
nagatsu
0
130
技術・能力を向上する原理原則 #きのこセッションa #きのこ2026
bash0c7
0
120
時期が悪い!それでもRaspberry Piを買って遊んで活用するには / 20260627-osc26do-rpi-jikigawarui
akkiesoft
0
800
秘密度ラベル初心者が第1歩でつまづかないための「設計・運用」ポイント
seafay
PRO
1
480
From Prompt Engineering to Loop Engineering
shibuiwilliam
1
190
AIをフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
120
ロボティクスの技術 / Robotics Technology
ks91
PRO
0
130
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.5k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Test your architecture with Archunit
thirion
1
2.3k
Navigating Weather and Climate Data
rabernat
0
230
Navigating Team Friction
lara
192
16k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
730
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
450
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
170
The Invisible Side of Design
smashingmag
301
52k
ラッコキーワード サービス紹介資料
rakko
1
3.7M
From π to Pie charts
rasagy
0
220
Transcript
CORE DATA LEE SING JIE
ARDUINO…
UNDERSTANDING CORE DATA IN DEPTH
UNDERSTANDING CORE DATA IN DEPTH
GUI BROWSER
COMMAND LINE BROWSER $ sqlite3 /Users/singjie/present/ main-25142226 SQLite version 3.8.5
2014-08-15 22:37:57 Enter ".help" for usage hints. sqlite>
Z_METADATA
Z_METADATA - PLIST
Z_PRIMARYKEY
Z_ENT
SUBCLASSING SHOULD YOU?
SUBCLASSING
SUBCLASSING
SUBCLASSING - Z_PRIMARYKEY
SUBCLASSING - Z_ENT
SUBCLASSING - Z_ENT
SUBCLASSING - WHAT IS INDEXING?
CHECKING ON QUERY’S EFFICIENCY
sqlite> explain query plan select * from ZBTMessage where ZMSGID
= 2; 0|0|0|SEARCH TABLE ZBTMessage USING INDEX ZBTMESSAGE_ZMSGID_INDEX (ZMSGID=?) USING EXPLAIN QUERY PLAN
sqlite> explain query plan select * from ZBTMessage where ZMSGID
= 2; 0|0|0|SEARCH TABLE ZBTMessage USING INDEX ZBTMESSAGE_ZMSGID_INDEX (ZMSGID=?) USING EXPLAIN QUERY PLAN
sqlite> explain query plan select * from ZBTInvite where ZINVITEID
= 2; 0|0|0|SCAN TABLE ZBTInvite USING EXPLAIN QUERY PLAN
SUBCLASSING - Z_ENT ZBTBuzzClub - 50k rows (Z_ENT == 16)
ZBTBuzzUser - 50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows Indexes: ‣ Z_ENT ‣ Z_BUZZ_ID sqlite will always use Z_ENT index SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
SUBCLASSING - Z_ENT Indexes: ‣ Z_ENT ‣ Z_BUZZ_ID sqlite> explain
query plan select * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123; 0|0|0|SEARCH TABLE ZBTBuzz USING INDEX ZBTBuzz_Z_ENT_INDEX (Z_ENT=?) SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
SUBCLASSING - Z_ENT INDEX ZBTBuzzClub - 50k rows (Z_ENT ==
16) ZBTBuzzUser - 50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows ZBTBuzzClub - 50k rows (Z_ENT == 16) ZBTBuzzClub - 1 row (Z_BUZZ_ID = 123) 1 2 3 SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
SUBCLASSING - Z_BUZZ_ID INDEX ZBTBuzzClub - 50k rows (Z_ENT ==
16) ZBTBuzzUser - 50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows ZBTBuzzClub - 2 rows (Z_BUZZ_ID == 123) ZBTBuzzClub - 1 row (Z_ENT == 16) 1 2 3 SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
SUBCLASSING - Z_ENT, Z_BUZZ_ID COMPOUND INDEX ZBTBuzzClub - 50k rows
(Z_ENT == 16) ZBTBuzzUser - 50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows ZBTBuzzClub - 1 row (Z_ENT == 16 && Z_BUZZ_ID == 123) 1 2 SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
SUBCLASSING - Z_ENT, Z_BUZZ_ID COMPOUND INDEX ZBTBuzzClub - 50k rows
(Z_ENT == 16) ZBTBuzzUser - 50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows ZBTBuzzClub - 1 row (Z_ENT == 16 && Z_BUZZ_ID == 123) 1 2 SELECT * from ZBTBuzz where Z_ENT = 16 AND Z_BUZZ_ID = 123;
HOW TO FIX?
SUBCLASSING ZBTBuzzClub - 50k rows (Z_ENT == 16) ZBTBuzzUser -
50k rows (Z_ENT == 15) ZBTBuzz - ~100k rows ZBTBuzzClub - 2 rows (Z_BUZZ_ID == 123) 1 2 for (id result in results) { if ([result isKindOfClass:[BTBuzzClub class]]) { … } } SELECT * from ZBTBuzz where Z_BUZZ_ID = 123;
IN SHORT, DON’T SUBCLASS!
MANAGE TYPES YOURSELF ZBTBuzz(Club) - 50k rows (Z_TYPE == BUZZCLUB)
ZBTBuzz(User) - 50k rows (Z_TYPE == BUZZUSER) ZBTBuzz - ~100k rows select * from ZBTBuzz where Z_TYPE = BUZZCLUB AND Z_BUZZ_ID = 123; Compound: ‣ Z_TYPE, Z_BUZZ_ID
PROFILING ON THE FLY
PROFILING ▸ -com.apple.CoreData.SQLDebug 1
PROFILING 2015-11-20 10:09:48.593 BeeTalk[3579:1652444] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT,
t0.ZDATA, t0.ZDISPLAYINDEX, t0.ZISOUTGOING, t0.ZISWHISPER, t0.ZMEDIASTATUS, t0.ZMSGID, t0.ZREADCOUNT, t0.ZSTATUS, t0.ZTIMESTAMP, t0.ZTYPE, t0.ZWHISPERDURATION, t0.ZWHISPERSTARTTIME, t0.ZBUDDYINFO, t0.ZCHAT, t0.Z5_CHAT, t0.ZINVCHAT, t0.Z5_INVCHAT, t0.ZLASTREADCHAT, t0.Z5_LASTREADCHAT, t0.ZUSER FROM ZBTMESSAGE t0 WHERE (( t0.ZMEDIASTATUS = ? OR t0.ZMEDIASTATUS = ?) AND t0.ZTYPE = ?) 2015-11-20 10:09:48.594 BeeTalk[3579:1652444] CoreData: annotation: sql connection fetch time: 0.0002s
PROFILING + (void)load { #if defined DEBUG || defined INTRELEASE
Method original, swizzled; original = class_getInstanceMethod(self, @selector(executeFetchRequest:error:)); swizzled = class_getInstanceMethod(self, @selector(executeFetchRequest_Swizzled:error:)); method_exchangeImplementations(original, swizzled); #endif } - (NSArray *)executeFetchRequest_Swizzled:(NSFetchRequest *)request error:(NSError *__autoreleasing *)error { NSString *logFormat = [NSString stringWithFormat:@"[%@]: %@", request.entityName, request.predicate.tracerPredicate]; CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); NSArray *results = [self executeFetchRequest_Swizzled:request error:error]; CFAbsoluteTime end = CFAbsoluteTimeGetCurrent() - start; // 100ms if (end - start > 0.1) { NSLog(@"%@", logFormat); NSParameterAssert(NO); } return results; }
MIGRATION WHAT REALLY HAPPENS?
Z_METADATA - PLIST
DIFFERENT HASH? BTUSER BTUSER_BAK Rename
DIFFERENT HASH? BTUSER_BAK BTUSER Insert
DIFFERENT HASH? BTUSER_BAK BTUSER
DIFFERENT HASH? BTUSER
Z_PRIMARYKEY TABLE
Z_PRIMARYKEY TABLE
Z_ENT - ALPHABETICAL ORDER 18 | BTLINKEDCONTACT 19 | BTMESSAGE
Z_ENT - ALPHABETICAL ORDER 18 | BTLINKEDCONTACT 19 | BTMESSAGE
XX | BTMARY
Z_ENT 19 | BTMESSAGE 18 | BTLINKEDCONTACT XX | BTMARY
Z_ENT 18 | BTLINKEDCONTACT 20 | BTMESSAGE 19 | BTMARY
Z_PRIMARYKEY
HOW TO FIX?
Z_ENT 18 | BTLINKEDCONTACT 19 | BTMESSAGE 50 | BTZMARY
Z_ENT 18 | BTLINKEDCONTACT 19 | BTMESSAGE 50 | BTZMARY
Q&A