优化更新SQLite子查询或至少分解成块

时间:2013-11-14 18:46:38

标签: sqlite query-optimization

以下查询在我杀死它之前24小时运行。它导致了一个与数据库本身一样大的日志文件(25GB日志文件,27GB数据库文件),并在杀死后花了几个小时才恢复:

ALTER TABLE core ADD COLUMN pointcount;
UPDATE core SET pointcount = (SELECT pointcount FROM pointcountsByZip WHERE zip = core.zip);

数据库

  • core大约有1300万行。
  • pointcountsByZip大约有一千行。

预期用途

  • 单个用户的数据分析
  • 我总是需要提取完全合并的表单(例如,我需要core的版本,其中对于core中的每个ID,一遍又一遍地重复点数列
  • 相当不频繁的更新(但每列不能花一天时间!)

关于更新

  • 通过这样做,我意识到我正在对数据库进行规范化。

我看到优化的可能性

  1. 保持数据库规范化,然后每次读取时都进行左外连接。
  2. 如上所述,在一个大型操作中对数据库进行非规范化
  3. 通过ZIP或诸如此类的方式打破非规范化(有趣的是与“道德败坏”有多接近)更新成块。
  4. 我正在寻找尽可能快的SELECT * FROM core,但UPDATE不需要多天。如果UPDATE也给我一些关于其状态的指示(例如,如果我在数据库的1/100上运行了100次更新,那么我会知道大约有多远,例如,以及能够在不丢失所有变化的情况下中止)。磁盘空间并不是一个考虑因素,尽管它总是很好。

    **编辑:执行计划**

    sqlite> EXPLAIN UPDATE core SET zip_pointcountUC = (SELECT zip_pointcountUC FROM clinicCountsByzip WHERE zip = core.zip);
    0|Trace|0|0|0||00|
    1|Goto|0|536|0||00|
    2|Null|0|1|2||00|
    3|OpenRead|0|255|0|494|00|
    4|Rewind|0|8|0||00|
    5|Rowid|0|2|0||00|
    6|RowSetAdd|1|2|0||00|
    7|Next|0|5|0||01|
    8|Close|0|0|0||00|
    9|OpenWrite|0|255|0|494|00|
    10|RowSetRead|1|534|2||00|
    11|NotExists|0|10|2||00|
    12|Null|0|3|496||00|
    13|Column|0|0|3||00|
    14|Column|0|1|4||00|
    15|Column|0|2|5||00|
    16|Column|0|3|6||00|
    17|Column|0|4|7||00|
    18|Column|0|5|8||00|
    19|Column|0|6|9||00|
    20|Column|0|7|10||00|
    21|Column|0|8|11||00|
    22|Column|0|9|12||00|
    23|Column|0|10|13||00|
    24|Column|0|11|14||00|
    25|Column|0|12|15||00|
    26|Column|0|13|16||00|
    27|Column|0|14|17||00|
    28|Column|0|15|18||00|
    29|Column|0|16|19||00|
    30|Column|0|17|20||00|
    31|Column|0|18|21||00|
    32|Column|0|19|22||00|
    33|Column|0|20|23||00|
    34|Column|0|21|24||00|
    35|Column|0|22|25||00|
    36|Column|0|23|26||00|
    37|Column|0|24|27||00|
    38|Column|0|25|28||00|
    39|Column|0|26|29||00|
    40|Column|0|27|30||00|
    41|Column|0|28|31||00|
    42|Column|0|29|32||00|
    43|Column|0|30|33||00|
    44|Column|0|31|34||00|
    45|Column|0|32|35||00|
    46|Column|0|33|36||00|
    47|Column|0|34|37||00|
    48|Column|0|35|38||00|
    49|Column|0|36|39||00|
    50|Column|0|37|40||00|
    51|Column|0|38|41||00|
    52|Column|0|39|42||00|
    53|Column|0|40|43||00|
    54|Column|0|41|44||00|
    55|Column|0|42|45||00|
    56|Column|0|43|46||00|
    57|Column|0|44|47||00|
    58|Column|0|45|48||00|
    59|Column|0|46|49||00|
    60|Column|0|47|50||00|
    61|Column|0|48|51||00|
    62|Column|0|49|52||00|
    63|Column|0|50|53||00|
    64|Column|0|51|54||00|
    65|Column|0|52|55||00|
    66|Column|0|53|56||00|
    67|Column|0|54|57||00|
    68|Column|0|55|58||00|
    69|Column|0|56|59||00|
    70|Column|0|57|60||00|
    71|Column|0|58|61||00|
    72|Column|0|59|62||00|
    73|Column|0|60|63||00|
    74|Column|0|61|64||00|
    75|Column|0|62|65||00|
    76|Column|0|63|66||00|
    77|Column|0|64|67||00|
    78|Column|0|65|68||00|
    79|Column|0|66|69||00|
    80|Column|0|67|70||00|
    81|Column|0|68|71||00|
    82|Column|0|69|72||00|
    83|Column|0|70|73||00|
    84|Column|0|71|74||00|
    85|Column|0|72|75||00|
    86|Column|0|73|76||00|
    87|Column|0|74|77||00|
    88|Column|0|75|78||00|
    89|Column|0|76|79||00|
    90|Column|0|77|80||00|
    91|Column|0|78|81||00|
    92|Column|0|79|82||00|
    93|Column|0|80|83||00|
    94|Column|0|81|84||00|
    95|Column|0|82|85||00|
    96|Column|0|83|86||00|
    97|Column|0|84|87||00|
    98|Column|0|85|88||00|
    99|Column|0|86|89||00|
    100|Column|0|87|90||00|
    101|Column|0|88|91||00|
    102|Column|0|89|92||00|
    103|Column|0|90|93||00|
    104|Column|0|91|94||00|
    105|Column|0|92|95||00|
    106|Column|0|93|96||00|
    107|Column|0|94|97||00|
    108|Column|0|95|98||00|
    109|Column|0|96|99||00|
    110|Column|0|97|100||00|
    111|Column|0|98|101||00|
    112|Column|0|99|102||00|
    113|Column|0|100|103||00|
    114|Column|0|101|104||00|
    115|Column|0|102|105||00|
    116|Column|0|103|106||00|
    117|Column|0|104|107||00|
    118|Column|0|105|108||00|
    119|Column|0|106|109||00|
    120|Column|0|107|110||00|
    121|Column|0|108|111||00|
    122|Column|0|109|112||00|
    123|Column|0|110|113||00|
    124|Column|0|111|114||00|
    125|Column|0|112|115||00|
    126|Column|0|113|116||00|
    127|Column|0|114|117||00|
    128|Column|0|115|118||00|
    129|Column|0|116|119||00|
    130|Column|0|117|120||00|
    131|Column|0|118|121||00|
    132|Column|0|119|122||00|
    133|Column|0|120|123||00|
    134|Column|0|121|124||00|
    135|Column|0|122|125||00|
    136|Column|0|123|126||00|
    137|Column|0|124|127||00|
    138|Column|0|125|128||00|
    139|Column|0|126|129||00|
    140|Column|0|127|130||00|
    141|Column|0|128|131||00|
    142|Column|0|129|132||00|
    143|Column|0|130|133||00|
    144|Column|0|131|134||00|
    145|Column|0|132|135||00|
    146|Column|0|133|136||00|
    147|Column|0|134|137||00|
    148|Column|0|135|138||00|
    149|Column|0|136|139||00|
    150|Column|0|137|140||00|
    151|Column|0|138|141||00|
    152|RealAffinity|141|0|0||00|
    153|Column|0|139|142||00|
    154|Column|0|140|143||00|
    155|Column|0|141|144||00|
    156|Column|0|142|145||00|
    157|Column|0|143|146||00|
    158|Column|0|144|147||00|
    159|Column|0|145|148||00|
    160|Column|0|146|149||00|
    161|Column|0|147|150||00|
    162|Column|0|148|151||00|
    163|Column|0|149|152||00|
    164|Column|0|150|153||00|
    165|Column|0|151|154||00|
    166|Column|0|152|155||00|
    167|Column|0|153|156||00|
    168|Column|0|154|157||00|
    169|Column|0|155|158||00|
    170|Column|0|156|159||00|
    171|Column|0|157|160||00|
    172|Column|0|158|161||00|
    173|Column|0|159|162||00|
    174|Column|0|160|163||00|
    175|Column|0|161|164||00|
    176|Column|0|162|165||00|
    177|Column|0|163|166||00|
    178|Column|0|164|167||00|
    179|Column|0|165|168||00|
    180|Column|0|166|169||00|
    181|Column|0|167|170||00|
    182|Column|0|168|171||00|
    183|Column|0|169|172||00|
    184|Column|0|170|173||00|
    185|Column|0|171|174||00|
    186|Column|0|172|175||00|
    187|Column|0|173|176||00|
    188|Column|0|174|177||00|
    189|Column|0|175|178||00|
    190|Column|0|176|179||00|
    191|Column|0|177|180||00|
    192|Column|0|178|181||00|
    193|Column|0|179|182||00|
    194|Column|0|180|183||00|
    195|Column|0|181|184||00|
    196|Column|0|182|185||00|
    197|Column|0|183|186||00|
    198|Column|0|184|187||00|
    199|Column|0|185|188||00|
    200|Column|0|186|189||00|
    201|Column|0|187|190||00|
    202|Column|0|188|191||00|
    203|Column|0|189|192||00|
    204|Column|0|190|193||00|
    205|Column|0|191|194||00|
    206|Column|0|192|195||00|
    207|Column|0|193|196||00|
    208|Column|0|194|197||00|
    209|Column|0|195|198||00|
    210|Column|0|196|199||00|
    211|Column|0|197|200||00|
    212|Column|0|198|201||00|
    213|Column|0|199|202||00|
    214|Column|0|200|203||00|
    215|Column|0|201|204||00|
    216|Column|0|202|205||00|
    217|Column|0|203|206||00|
    218|Column|0|204|207||00|
    219|Column|0|205|208||00|
    220|Column|0|206|209||00|
    221|Column|0|207|210||00|
    222|Column|0|208|211||00|
    223|Column|0|209|212||00|
    224|Column|0|210|213||00|
    225|Column|0|211|214||00|
    226|Column|0|212|215||00|
    227|Column|0|213|216||00|
    228|Column|0|214|217||00|
    229|Column|0|215|218||00|
    230|Column|0|216|219||00|
    231|Column|0|217|220||00|
    232|Column|0|218|221||00|
    233|Column|0|219|222||00|
    234|Column|0|220|223||00|
    235|Column|0|221|224||00|
    236|Column|0|222|225||00|
    237|Column|0|223|226||00|
    238|Column|0|224|227||00|
    239|Column|0|225|228||00|
    240|Column|0|226|229||00|
    241|Column|0|227|230||00|
    242|Column|0|228|231||00|
    243|Column|0|229|232||00|
    244|Column|0|230|233||00|
    245|Column|0|231|234||00|
    246|Column|0|232|235||00|
    247|Column|0|233|236||00|
    248|Column|0|234|237||00|
    249|Column|0|235|238||00|
    250|Column|0|236|239||00|
    251|Column|0|237|240||00|
    252|Column|0|238|241||00|
    253|Column|0|239|242||00|
    254|Column|0|240|243||00|
    255|Column|0|241|244||00|
    256|Column|0|242|245||00|
    257|Column|0|243|246||00|
    258|Column|0|244|247||00|
    259|Column|0|245|248||00|
    260|Column|0|246|249||00|
    261|Column|0|247|250||00|
    262|Column|0|248|251||00|
    263|Column|0|249|252||00|
    264|Column|0|250|253||00|
    265|Column|0|251|254||00|
    266|Column|0|252|255||00|
    267|Column|0|253|256||00|
    268|Column|0|254|257||00|
    269|Column|0|255|258||00|
    270|Column|0|256|259||00|
    271|Column|0|257|260||00|
    272|Column|0|258|261||00|
    273|Column|0|259|262||00|
    274|Column|0|260|263||00|
    275|Column|0|261|264||00|
    276|Column|0|262|265||00|
    277|Column|0|263|266||00|
    278|Column|0|264|267||00|
    279|Column|0|265|268||00|
    280|Column|0|266|269||00|
    281|Column|0|267|270||00|
    282|Column|0|268|271||00|
    283|Column|0|269|272||00|
    284|Column|0|270|273||00|
    285|Column|0|271|274||00|
    286|Column|0|272|275||00|
    287|Column|0|273|276||00|
    288|Column|0|274|277||00|
    289|RealAffinity|277|0|0||00|
    290|Column|0|275|278||00|
    291|Column|0|276|279||00|
    292|Column|0|277|280||00|
    293|Column|0|278|281||00|
    294|Column|0|279|282||00|
    295|Column|0|280|283||00|
    296|Column|0|281|284||00|
    297|Column|0|282|285||00|
    298|Column|0|283|286||00|
    299|Column|0|284|287||00|
    300|Column|0|285|288||00|
    301|Column|0|286|289||00|
    302|Column|0|287|290||00|
    303|Column|0|288|291||00|
    304|Column|0|289|292||00|
    305|Column|0|290|293||00|
    306|Column|0|291|294||00|
    307|Column|0|292|295||00|
    308|Column|0|293|296||00|
    309|Column|0|294|297||00|
    310|Column|0|295|298||00|
    311|Column|0|296|299||00|
    312|Column|0|297|300||00|
    313|Column|0|298|301||00|
    314|Column|0|299|302||00|
    315|Column|0|300|303||00|
    316|Column|0|301|304||00|
    317|Column|0|302|305||00|
    318|Column|0|303|306||00|
    319|Column|0|304|307||00|
    320|Column|0|305|308||00|
    321|Column|0|306|309||00|
    322|Column|0|307|310||00|
    323|Column|0|308|311||00|
    324|Column|0|309|312||00|
    325|Column|0|310|313||00|
    326|Column|0|311|314||00|
    327|Column|0|312|315||00|
    328|Column|0|313|316||00|
    329|Column|0|314|317||00|
    330|Column|0|315|318||00|
    331|Column|0|316|319||00|
    332|Column|0|317|320||00|
    333|Column|0|318|321||00|
    334|Column|0|319|322||00|
    335|Column|0|320|323||00|
    336|Column|0|321|324||00|
    337|Column|0|322|325||00|
    338|Column|0|323|326||00|
    339|Column|0|324|327||00|
    340|Column|0|325|328||00|
    341|Column|0|326|329||00|
    342|Column|0|327|330||00|
    343|Column|0|328|331||00|
    344|Column|0|329|332||00|
    345|Column|0|330|333||00|
    346|Column|0|331|334||00|
    347|Column|0|332|335||00|
    348|Column|0|333|336||00|
    349|Column|0|334|337||00|
    350|Column|0|335|338||00|
    351|Column|0|336|339||00|
    352|Column|0|337|340||00|
    353|Column|0|338|341||00|
    354|Column|0|339|342||00|
    355|Column|0|340|343||00|
    356|Column|0|341|344||00|
    357|Column|0|342|345||00|
    358|Column|0|343|346||00|
    359|Column|0|344|347||00|
    360|Column|0|345|348||00|
    361|Column|0|346|349||00|
    362|Column|0|347|350||00|
    363|RealAffinity|350|0|0||00|
    364|Column|0|348|351||00|
    365|Column|0|349|352||00|
    366|Column|0|350|353||00|
    367|Column|0|351|354||00|
    368|Column|0|352|355||00|
    369|Column|0|353|356||00|
    370|Column|0|354|357||00|
    371|Column|0|355|358||00|
    372|Column|0|356|359||00|
    373|Column|0|357|360||00|
    374|Column|0|358|361||00|
    375|Column|0|359|362||00|
    376|Column|0|360|363||00|
    377|Column|0|361|364||00|
    378|Column|0|362|365||00|
    379|Column|0|363|366||00|
    380|Column|0|364|367||00|
    381|Column|0|365|368||00|
    382|Column|0|366|369||00|
    383|Column|0|367|370||00|
    384|Column|0|368|371||00|
    385|Column|0|369|372||00|
    386|Column|0|370|373||00|
    387|Column|0|371|374||00|
    388|Column|0|372|375||00|
    389|Column|0|373|376||00|
    390|Column|0|374|377||00|
    391|Column|0|375|378||00|
    392|Column|0|376|379||00|
    393|Column|0|377|380||00|
    394|Column|0|378|381||00|
    395|Column|0|379|382||00|
    396|Column|0|380|383||00|
    397|Column|0|381|384||00|
    398|Column|0|382|385||00|
    399|Column|0|383|386||00|
    400|Column|0|384|387||00|
    401|Column|0|385|388||00|
    402|Column|0|386|389||00|
    403|Column|0|387|390||00|
    404|Column|0|388|391||00|
    405|Column|0|389|392||00|
    406|Column|0|390|393||00|
    407|Column|0|391|394||00|
    408|Column|0|392|395||00|
    409|Column|0|393|396||00|
    410|Column|0|394|397||00|
    411|Column|0|395|398||00|
    412|RealAffinity|398|0|0||00|
    413|Column|0|396|399||00|
    414|Column|0|397|400||00|
    415|Column|0|398|401||00|
    416|Column|0|399|402||00|
    417|Column|0|400|403||00|
    418|RealAffinity|403|0|0||00|
    419|Column|0|401|404||00|
    420|RealAffinity|404|0|0||00|
    421|Column|0|402|405||00|
    422|Column|0|403|406||00|
    423|Column|0|404|407||00|
    424|RealAffinity|407|0|0||00|
    425|Column|0|405|408||00|
    426|RealAffinity|408|0|0||00|
    427|Column|0|406|409||00|
    428|Column|0|407|410||00|
    429|RealAffinity|410|0|0||00|
    430|Column|0|408|411||00|
    431|RealAffinity|411|0|0||00|
    432|Column|0|409|412||00|
    433|RealAffinity|412|0|0||00|
    434|Column|0|410|413|NULL|00|
    435|Column|0|411|414|NULL|00|
    436|Column|0|412|415|NULL|00|
    437|Column|0|413|416|NULL|00|
    438|Column|0|414|417|NULL|00|
    439|Column|0|415|418|NULL|00|
    440|Column|0|416|419|NULL|00|
    441|Column|0|417|420|NULL|00|
    442|Column|0|418|421|NULL|00|
    443|Column|0|419|422|NULL|00|
    444|Column|0|420|423|NULL|00|
    445|Column|0|421|424|NULL|00|
    446|Column|0|422|425|NULL|00|
    447|Column|0|423|426|NULL|00|
    448|Column|0|424|427|NULL|00|
    449|Column|0|425|428|NULL|00|
    450|Column|0|426|429|NULL|00|
    451|Column|0|427|430|NULL|00|
    452|Column|0|428|431|NULL|00|
    453|Column|0|429|432|NULL|00|
    454|Column|0|430|433|NULL|00|
    455|Column|0|431|434|NULL|00|
    456|Column|0|432|435|NULL|00|
    457|Column|0|433|436|NULL|00|
    458|Column|0|434|437|NULL|00|
    459|Column|0|435|438|NULL|00|
    460|Column|0|436|439|NULL|00|
    461|Column|0|437|440|NULL|00|
    462|Column|0|438|441|NULL|00|
    463|Column|0|439|442|NULL|00|
    464|Column|0|440|443|NULL|00|
    465|Column|0|441|444|NULL|00|
    466|Column|0|442|445|NULL|00|
    467|Column|0|443|446|NULL|00|
    468|Column|0|444|447|NULL|00|
    469|Column|0|445|448|NULL|00|
    470|Column|0|446|449|NULL|00|
    471|Column|0|447|450|NULL|00|
    472|Column|0|448|451|NULL|00|
    473|Column|0|449|452|NULL|00|
    474|Column|0|450|453|NULL|00|
    475|Column|0|451|454|NULL|00|
    476|Column|0|452|455|NULL|00|
    477|Column|0|453|456|NULL|00|
    478|Column|0|454|457|NULL|00|
    479|Column|0|455|458|NULL|00|
    480|Column|0|456|459|NULL|00|
    481|Column|0|457|460|NULL|00|
    482|Column|0|458|461|NULL|00|
    483|Column|0|459|462|NULL|00|
    484|Column|0|460|463|NULL|00|
    485|Column|0|461|464|NULL|00|
    486|Column|0|462|465|NULL|00|
    487|Column|0|463|466|NULL|00|
    488|Column|0|464|467|NULL|00|
    489|Column|0|465|468|NULL|00|
    490|Column|0|466|469|NULL|00|
    491|Column|0|467|470|NULL|00|
    492|Column|0|468|471|NULL|00|
    493|Column|0|469|472|NULL|00|
    494|Column|0|470|473|NULL|00|
    495|Column|0|471|474|NULL|00|
    496|Column|0|472|475|NULL|00|
    497|Column|0|473|476|NULL|00|
    498|Column|0|474|477|NULL|00|
    499|Column|0|475|478|NULL|00|
    500|Column|0|476|479|NULL|00|
    501|Column|0|477|480|NULL|00|
    502|Column|0|478|481|NULL|00|
    503|Column|0|479|482|NULL|00|
    504|Column|0|480|483|NULL|00|
    505|Column|0|481|484|NULL|00|
    506|Column|0|482|485|NULL|00|
    507|Column|0|483|486|NULL|00|
    508|Column|0|484|487|NULL|00|
    509|Column|0|485|488|NULL|00|
    510|Column|0|486|489|NULL|00|
    511|Column|0|487|490|NULL|00|
    512|Column|0|488|491|NULL|00|
    513|Column|0|489|492||00|
    514|Column|0|490|493||00|
    515|Column|0|491|494||00|
    516|Null|0|497|0||00|
    517|Integer|1|498|0||00|
    518|OpenRead|3|3609199|0|1|00|
    519|Rewind|3|527|0||00|
    520|Column|3|0|499||00|
    521|Column|0|352|500||00|
    522|Ne|500|526|499|collseq(BINARY)|6a|
    523|Column|0|492|501||00|
    524|Move|501|497|0||00|
    525|IfZero|498|527|-1||00|
    526|Next|3|520|0||01|
    527|Close|3|0|0||00|
    528|SCopy|497|495|0||00|
    529|Column|0|493|496||00|
    530|NotExists|0|531|2||00|
    531|MakeRecord|3|494|500|ddddaddadddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddddddddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadddddddeaaaaaaaaaaaaaaaaaaaaaaaaddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddddddddaaaaaaaddddddddaaddaddddddddddddddddddddddddeddddaddddddddddddddddddddddddddddddddddddddddddddddddddddddaddaaadddddddedaddaddddddddddddddddddddddddddddddddddddddddadedaddeeddeeaeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|00|
    532|Insert|0|500|2|core|05|
    533|Goto|0|10|0||00|
    534|Close|0|0|0||00|
    535|Halt|0|0|0||00|
    536|Transaction|0|1|0||00|
    537|VerifyCookie|0|171|0||00|
    538|TableLock|0|255|1|core|00|
    539|TableLock|0|3609199|0|clinicCountsByzip|00|
    540|Goto|0|2|0||00|
    

1 个答案:

答案 0 :(得分:1)

不幸的是,如果您使用一个简单的查询,例如您在24小时后杀死的示例,那么您将永远不会得到任何有关完成的距离或距离的反馈。

我有一些与此相似的经验,但记录少得多(在30,000ish范围内),并且在一个包含超过150列的表中(我知道很多)。

当我尝试你基本上做的事情时,我等待了永远,然后最终得到了一个内存异常。我的问题是我在一个事务中加载了30,000多个Update命令,试图加快更新速度,这会占用太多内存。

现在在你的情况下我使用两个循环。第一个循环从表中获取Update查询所需的所有数据(主键,以及设置要修改的列的值所需的任何其他内容)。

在开始第二个循环之前,我声明一个等于0的整数,然后说“Begin Transaction”。每次我运行循环时,我都会向该整数添加1。每当整数命中数为1,000时,我提交事务(并释放它现在正在吃的内存)并启动一个全新的,并将整数设置回0.当我最终退出第二个循环时,我提交了最后一笔交易。

我相信你可以做同样的事情来更新你的1300万行。您甚至可以使代码一次仅更新50万条左右的记录,如果整个数据库需要24小时以上来更新那么多记录,那么每天都要做很多。