Most active commenters

    ←back to thread

    353 points HunOL | 11 comments | | HN request time: 0.001s | source | bottom
    Show context
    mickeyp ◴[] No.45781619[source]
    SQLite is a cracking database -- I love it -- that is let down by its awful defaults in service of 'backwards compatibility.'

    You need a brace of PRAGMAs to get it to behave reasonably sanely if you do anything serious with it.

    replies(2): >>45781956 #>>45781998 #
    1. tejinderss ◴[] No.45781956[source]
    Do you know any good default PRAGMAs that one should enable?
    replies(3): >>45782017 #>>45782031 #>>45782813 #
    2. mickeyp ◴[] No.45782017[source]
    These are my PRAGMAs and not your PRAGMAs. Be very careful about blindly copying something that may or may not match your needs.

        PRAGMA foreign_keys=ON
        PRAGMA recursive_triggers=ON
        PRAGMA journal_mode=WAL
        PRAGMA busy_timeout=30000
        PRAGMA synchronous=NORMAL
        PRAGMA cache_size=10000
        PRAGMA temp_store=MEMORY
        PRAGMA wal_autocheckpoint=1000
        PRAGMA optimize <- run on tx start
    
    Note that I do not use auto_vacuum for DELETEs are uncommon in my workflows and I am fine with the trade-off and if I do need it I can always PRAGMA it.

    defer_foreign_keys is useful if you understand the pros and cons of enabling it.

    replies(3): >>45782120 #>>45782365 #>>45782487 #
    3. leetrout ◴[] No.45782031[source]
    Explanation of sqlite performance PRAGMAs

    https://kerkour.com/sqlite-for-servers

    4. adzm ◴[] No.45782120[source]
    Really, no mmap?
    replies(1): >>45782274 #
    5. metrix ◴[] No.45782274{3}[source]
    I'm curious what your suggest mmap pragma would be.
    replies(1): >>45793234 #
    6. mikeocool ◴[] No.45782365[source]
    Using strict tables is also a good thing to do, if you value your sanity.
    7. porridgeraisin ◴[] No.45782487[source]
    You should pragna optimize before TX end, not at tx start.

    Except for long lived connections where you do it periodically.

    https://www.sqlite.org/lang_analyze.html#periodically_run_pr...

    replies(1): >>45782976 #
    8. e2le ◴[] No.45782813[source]
    Although not what you asked for, the SQLite authors maintain a list of recommended compilation options that should be used where applicable.

    https://sqlite.org/compile.html#recommended_compile_time_opt...

    9. masklinn ◴[] No.45782976{3}[source]
    Also foreign_keys has to be set per connection but journal_mode is sticky (it changes the database itself).
    replies(1): >>45783383 #
    10. porridgeraisin ◴[] No.45783383{4}[source]
    Yes, if journal_mode was not sticky, a new process opening the db would not know to look for the wal and shm files and read the unflushed latest data from there. On the other hand, foreign key enforcement has nothing to do with the file itself, it's a transaction level thing.

    In any case, there is no harm in setting sticky pragmas every connection.

    11. adzm ◴[] No.45793234{4}[source]
    PRAGMA mmap_size=268435456;

    for example? I'm surprised by the downvotes. Using mmap significantly reduced my average read query time; durations about 70% the length!