Commit 03c5dbd
committed
perf(rls): sale_write pasa de FOR ALL a por-operacion; la rejilla baja 1,0 s
Migracion F. Una tabla: sale. Ninguna funcion de RLS tocada.
menu_item_channel_economics sigue en a3600331debb4402709f2f05e43ac173.
Sin cambios de cliente: sin OTA.
EL CAMBIO
sale_write era FOR ALL, y en Postgres FOR ALL incluye SELECT. Al combinarse con
OR con sale_read, cada fila leida evaluaba current_user_is_admin_of(account_id),
que recibiendo una COLUMNA no puede resolverse una vez y se paga por fila.
Ahora son tres politicas por operacion con la MISMA expresion. El WITH CHECK de
sale_write era explicito, no heredado del USING, y se conserva en insert y
update: si se hubiera perdido, el INSERT dejaria de validarse.
RESULTADO, medido como authenticated con uid real
usage_30d suelto, 2.632 filas 46,20 ms -> 4,53 ms
brand_price_grid entera 3.530 ms -> 2.529 / 2.524 ms
El plan explica el salto: desaparece el Filter y la condicion de RLS entra en el
Index Cond junto a cuenta y fecha. El indice de la migracion E, que por si solo
valia un 6 %, es lo que permite esto.
Sigue por encima de 1,5 s. Se para aqui: la regla es volver a medir antes de
volver a tocar.
NEUTRALIDAD, DEMOSTRADA Y COMPROBADA
current_user_is_admin_of(X) implica X = ANY(current_user_account_ids()) por sus
dos ramas, asi que para el SELECT la politica de escritura concedia un
subconjunto estricto de la de lectura. Los dos huecos de esa demostracion se
cerraron con datos ANTES de aplicar: account_id es NOT NULL con 0 nulos, y hay 0
filas huerfanas. No hay clave ajena de sale.account_id a accounts, asi que lo
segundo es cierto hoy pero no esta impuesto: queda anotado.
Y comprobado sobre datos, no solo sobre logica: 12 usuarios reales x 3 cuentas
con ventas, 0 casos en que la expresion de escritura concediera una fila que la
de lectura no concediera.
VERIFICADO ANTES Y DESPUES
- Visibilidad: admin de Foodint 6.727, worker de Foodint 6.727. Identico.
- Escritura del NO admin: INSERT rechazado por RLS, UPDATE 0 filas, DELETE 0
filas. Identico. Es la mitad que cambia de forma aunque no de efecto, y es la
que mandaba revertir si fallaba.
- Escritura del admin: INSERT 1, UPDATE 1, DELETE 1. Sigue funcionando.
- Rejilla: 297 filas, huella completa 7a210315c250570fe29573e08d536f3c y huella
de margenes c0249f056f9e5789d3934691efaf1e65 IDENTICAS, suma de recuentos
70956, 216 combinaciones permitidas.
- sale con 4 politicas: sale_read(r), sale_insert(a), sale_update(w),
sale_delete(d).
- 7.636 ventas y 62 overrides intactos. Cola de pg_net vacia, 0 publicaciones.
PARA EL PROXIMO ENCARGO, CON DATO
El mismo patron FOR ALL + current_user_is_admin_of existe en mas tablas de las
que estaban en la lista. Por tamano: sale_line (11 MB, no estaba en la lista),
external_catalog_product (7,9 MB), channel_settlement_order (7,0 MB), menu_item
(1,4 MB), menu_item_override (624 kB). Aviso: appcc_audit_items_write NO tiene
la expresion mecanica sino una con joins a plantillas, asi que la demostracion
del subconjunto hay que rehacerla ahi, no darla por buena.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vy4yW6xBAtXcaSGgKybquB1 parent a85c397 commit 03c5dbd
1 file changed
Lines changed: 81 additions & 0 deletions
Lines changed: 81 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
0 commit comments