*Background:*

I am using a multi-shard MySQL setup (multiple db hosts, each host holding 
many databases, a.k.a. "shards"). My Python application is creating engines 
to many of these shards. For performance reasons, the application utilizes 
bakery and BakedQuery to avoid compiling SQL statements on every ORM call.

*Issue:*

I have 100+ BakedQuery and 100+ shards. It appears it needs a bakery 
(LRUCache) of size = (N BakedQuery * M shards) to cache all of the queries 
for all shards because the cache key for the compiled SQL (not the 
BakedQuery) contains the dialect object. Please see _execute_clauseelement 
in sqlalchemy.engine.base. 

key = (
    dialect,
    elem,
    tuple(sorted(keys)),
    self.schema_for_object.hash_key,
    len(distilled_params) > 1,
)
compiled_sql = self._execution_options["compiled_cache"].get(key)
if compiled_sql is None:
    compiled_sql = elem.compile(
        dialect=dialect,
        column_keys=keys,
        inline=len(distilled_params) > 1,
        schema_translate_map=self.schema_for_object
        if not self.schema_for_object.is_default
        else None,
    )
    self._execution_options["compiled_cache"][key] = compiled_sql


When the cache capacity is small, it keeps evicting cache entries and 
compiling queries, using a lot of CPU. Also if it takes N*M for cache 
capacity, it is bad for memory.

*Question:*

1. Any good suggestions on fixing the performance and memory issue? e.g. by 
sharing the cache key
2. To share the cache key, do we implement a __eq__ for the Dialect object 
or make all the shards (engines) share the same Dialect object?
3. Is sharing a Dialect object dangerous? I see default_schema_name in the 
Dialect object.
3. This not only affects bakedquery, but also compiled_cache of engines 
(non-BakedQuery). Is there a good universal fix for the issue (like Q2, 
sharing dialect)?


-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/d1e7f3ce-4cd8-4d9d-b774-44175a4e523b%40googlegroups.com.

Reply via email to