@query-doctor/core 0.1.8 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +45 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -1
- package/dist/optimizer/genalgo.d.ts +14 -0
- package/dist/optimizer/genalgo.d.ts.map +1 -1
- package/dist/optimizer/statistics.d.ts +1 -0
- package/dist/optimizer/statistics.d.ts.map +1 -1
- package/dist/sql/nudges.d.ts +1 -1
- package/dist/sql/nudges.d.ts.map +1 -1
- package/dist/sql/walker.test.d.ts +2 -0
- package/dist/sql/walker.test.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -189,6 +189,23 @@ function parseNudges(node, stack) {
|
|
|
189
189
|
});
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
|
+
if (is(node, "A_Expr")) {
|
|
193
|
+
if (node.A_Expr.kind === "AEXPR_IN") {
|
|
194
|
+
let list;
|
|
195
|
+
if (node.A_Expr.lexpr && is(node.A_Expr.lexpr, "List")) {
|
|
196
|
+
list = node.A_Expr.lexpr.List;
|
|
197
|
+
} else if (node.A_Expr.rexpr && is(node.A_Expr.rexpr, "List")) {
|
|
198
|
+
list = node.A_Expr.rexpr.List;
|
|
199
|
+
}
|
|
200
|
+
if (list?.items && list.items.length >= 10) {
|
|
201
|
+
nudges.push({
|
|
202
|
+
kind: "REPLACE_LARGE_IN_TUPLE_WITH_ANY_ARRAY",
|
|
203
|
+
message: "`in (...)` queries with large tuples can often be replaced with `= ANY($1)` using a single parameter",
|
|
204
|
+
severity: "INFO"
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
192
209
|
return nudges;
|
|
193
210
|
}
|
|
194
211
|
function containsColumnRef(args) {
|
|
@@ -1165,6 +1182,24 @@ var _IndexOptimizer = class _IndexOptimizer {
|
|
|
1165
1182
|
await this.dropExistingIndexes(tx);
|
|
1166
1183
|
});
|
|
1167
1184
|
}
|
|
1185
|
+
/**
|
|
1186
|
+
* Given the current indexes in the optimizer, transform them in some
|
|
1187
|
+
* way to change which indexes will be assumed to exist when optimizing
|
|
1188
|
+
*
|
|
1189
|
+
* @example
|
|
1190
|
+
* ```
|
|
1191
|
+
* // resets indexes
|
|
1192
|
+
* optimizer.transformIndexes(() => [])
|
|
1193
|
+
*
|
|
1194
|
+
* // adds new index
|
|
1195
|
+
* optimizer.transformIndexes(indexes => [...indexes, newIndex])
|
|
1196
|
+
* ```
|
|
1197
|
+
*/
|
|
1198
|
+
transformIndexes(f) {
|
|
1199
|
+
const newIndexes = f(this.existingIndexes);
|
|
1200
|
+
this.existingIndexes = newIndexes;
|
|
1201
|
+
return this;
|
|
1202
|
+
}
|
|
1168
1203
|
/**
|
|
1169
1204
|
* Postgres has a limit of 63 characters for index names.
|
|
1170
1205
|
* So we use this to make sure we don't derive it from a list of columns that can
|
|
@@ -1520,6 +1555,16 @@ var _Statistics = class _Statistics {
|
|
|
1520
1555
|
restoreStats(tx) {
|
|
1521
1556
|
return this.restoreStats17(tx);
|
|
1522
1557
|
}
|
|
1558
|
+
approximateTotalRows() {
|
|
1559
|
+
if (!this.exportedMetadata) {
|
|
1560
|
+
return 0;
|
|
1561
|
+
}
|
|
1562
|
+
let totalRows = 0;
|
|
1563
|
+
for (const table of this.exportedMetadata) {
|
|
1564
|
+
totalRows += table.reltuples;
|
|
1565
|
+
}
|
|
1566
|
+
return totalRows;
|
|
1567
|
+
}
|
|
1523
1568
|
/**
|
|
1524
1569
|
* We have to cast stavaluesN to the correct type
|
|
1525
1570
|
* This derives that type for us so it can be used in `array_in`
|