diff --git a/debug_toolbar/panels/sql/utils.py b/debug_toolbar/panels/sql/utils.py
index 7b04f0346..be607cec6 100644
--- a/debug_toolbar/panels/sql/utils.py
+++ b/debug_toolbar/panels/sql/utils.py
@@ -1,4 +1,5 @@
import re
+from functools import lru_cache
import sqlparse
from django.utils.html import escape
@@ -32,8 +33,23 @@ def reformat_sql(sql, with_toggle=False):
def parse_sql(sql, aligned_indent=False):
+ return _parse_sql(
+ sql,
+ dt_settings.get_config()["PRETTIFY_SQL"],
+ aligned_indent,
+ )
+
+
+@lru_cache(maxsize=128)
+def _parse_sql(sql, pretty, aligned_indent):
+ stack = get_filter_stack(pretty, aligned_indent)
+ return "".join(stack.run(sql))
+
+
+@lru_cache(maxsize=None)
+def get_filter_stack(prettify, aligned_indent):
stack = sqlparse.engine.FilterStack()
- if dt_settings.get_config()["PRETTIFY_SQL"]:
+ if prettify:
stack.enable_grouping()
if aligned_indent:
stack.stmtprocess.append(
@@ -41,13 +57,14 @@ def parse_sql(sql, aligned_indent=False):
)
stack.preprocess.append(BoldKeywordFilter()) # add our custom filter
stack.postprocess.append(sqlparse.filters.SerializerUnicode()) # tokens -> strings
- return "".join(stack.run(sql))
+ return stack
+
+
+simplify_re = re.compile(r"SELECT (...........*?) FROM")
def simplify(sql):
- expr = r"SELECT (...........*?) FROM"
- sub = r"SELECT ••• FROM"
- return re.sub(expr, sub, sql)
+ return simplify_re.sub(r"SELECT ••• FROM", sql)
def contrasting_color_generator():
diff --git a/docs/changes.rst b/docs/changes.rst
index 5433326c1..3be8dad78 100644
--- a/docs/changes.rst
+++ b/docs/changes.rst
@@ -11,7 +11,7 @@ Next version
* Reset settings when overridden in tests. Packages or projects using
django-debug-toolbar can now use Django’s test settings tools, like
``@override_settings``, to reconfigure the toolbar during tests.
-* Optimize rendering of SQL panel, saving about 15% of its run time.
+* Optimize rendering of SQL panel, saving about 30% of its run time.
3.2.4 (2021-12-15)
------------------