@nahisaho/yata-local 1.6.6 → 1.7.0
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-optimizer.d.ts +254 -0
- package/dist/index-optimizer.d.ts.map +1 -0
- package/dist/index-optimizer.js +525 -0
- package/dist/index-optimizer.js.map +1 -0
- package/dist/index.d.ts +35 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -1
- package/dist/index.js.map +1 -1
- package/dist/io.d.ts +143 -0
- package/dist/io.d.ts.map +1 -1
- package/dist/io.js +553 -0
- package/dist/io.js.map +1 -1
- package/dist/sync.d.ts +221 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +404 -0
- package/dist/sync.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index Optimizer for YATA Local
|
|
3
|
+
*
|
|
4
|
+
* Analyzes database indexes and provides optimization recommendations.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module @nahisaho/yata-local/index-optimizer
|
|
8
|
+
*
|
|
9
|
+
* @see REQ-YI-IDX-001 - Index Analysis
|
|
10
|
+
* @see REQ-YI-IDX-002 - Composite Index Generation
|
|
11
|
+
* @see REQ-YI-IDX-003 - Query Performance Monitoring
|
|
12
|
+
* @see DES-YATA-IMPROVEMENTS-001 - Design Document
|
|
13
|
+
*/
|
|
14
|
+
import type Database from 'better-sqlite3';
|
|
15
|
+
/**
|
|
16
|
+
* Information about a database index
|
|
17
|
+
*/
|
|
18
|
+
export interface IndexInfo {
|
|
19
|
+
/** Index name */
|
|
20
|
+
name: string;
|
|
21
|
+
/** Table name */
|
|
22
|
+
table: string;
|
|
23
|
+
/** Columns in the index */
|
|
24
|
+
columns: string[];
|
|
25
|
+
/** Whether the index is unique */
|
|
26
|
+
unique: boolean;
|
|
27
|
+
/** Estimated number of rows */
|
|
28
|
+
rowCount: number;
|
|
29
|
+
/** SQLite internal sequential number */
|
|
30
|
+
seq: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Index recommendation
|
|
34
|
+
*/
|
|
35
|
+
export interface IndexRecommendation {
|
|
36
|
+
/** Recommendation type */
|
|
37
|
+
type: 'create' | 'drop' | 'modify';
|
|
38
|
+
/** Target table */
|
|
39
|
+
table: string;
|
|
40
|
+
/** Columns to index */
|
|
41
|
+
columns: string[];
|
|
42
|
+
/** Reason for recommendation */
|
|
43
|
+
reason: string;
|
|
44
|
+
/** Estimated improvement percentage */
|
|
45
|
+
estimatedImprovement: number;
|
|
46
|
+
/** SQL statement to execute */
|
|
47
|
+
sql: string;
|
|
48
|
+
/** Priority (1-5, 1 is highest) */
|
|
49
|
+
priority: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Query statistics from monitoring
|
|
53
|
+
*/
|
|
54
|
+
export interface QueryStats {
|
|
55
|
+
/** Query pattern (normalized) */
|
|
56
|
+
queryPattern: string;
|
|
57
|
+
/** Query hash for grouping */
|
|
58
|
+
queryHash: string;
|
|
59
|
+
/** Average execution time in milliseconds */
|
|
60
|
+
avgTimeMs: number;
|
|
61
|
+
/** Minimum execution time */
|
|
62
|
+
minTimeMs: number;
|
|
63
|
+
/** Maximum execution time */
|
|
64
|
+
maxTimeMs: number;
|
|
65
|
+
/** Total execution count */
|
|
66
|
+
executionCount: number;
|
|
67
|
+
/** Average rows examined */
|
|
68
|
+
avgRowsExamined: number;
|
|
69
|
+
/** Indexes used (if available) */
|
|
70
|
+
indexesUsed: string[];
|
|
71
|
+
/** Last execution timestamp */
|
|
72
|
+
lastExecuted: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Complete index analysis result
|
|
76
|
+
* @see REQ-YI-IDX-001
|
|
77
|
+
*/
|
|
78
|
+
export interface IndexAnalysisResult {
|
|
79
|
+
/** List of existing indexes */
|
|
80
|
+
indexes: IndexInfo[];
|
|
81
|
+
/** Optimization recommendations */
|
|
82
|
+
recommendations: IndexRecommendation[];
|
|
83
|
+
/** Query statistics (if monitoring enabled) */
|
|
84
|
+
queryStats: QueryStats[];
|
|
85
|
+
/** Analysis timestamp */
|
|
86
|
+
analyzedAt: string;
|
|
87
|
+
/** Analysis duration in milliseconds */
|
|
88
|
+
analysisTimeMs: number;
|
|
89
|
+
/** Database file path */
|
|
90
|
+
databasePath: string;
|
|
91
|
+
/** Total entities count */
|
|
92
|
+
entityCount: number;
|
|
93
|
+
/** Total relationships count */
|
|
94
|
+
relationshipCount: number;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Options for index analysis
|
|
98
|
+
*/
|
|
99
|
+
export interface AnalysisOptions {
|
|
100
|
+
/** Include query statistics */
|
|
101
|
+
includeQueryStats?: boolean;
|
|
102
|
+
/** Maximum recommendations to return */
|
|
103
|
+
maxRecommendations?: number;
|
|
104
|
+
/** Minimum improvement threshold for recommendations */
|
|
105
|
+
minImprovementThreshold?: number;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Options for creating composite index
|
|
109
|
+
*/
|
|
110
|
+
export interface CompositeIndexOptions {
|
|
111
|
+
/** Index name (auto-generated if not provided) */
|
|
112
|
+
name?: string;
|
|
113
|
+
/** Whether to create unique index */
|
|
114
|
+
unique?: boolean;
|
|
115
|
+
/** Execute immediately or return SQL only */
|
|
116
|
+
execute?: boolean;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Schema for query logging table
|
|
120
|
+
* @see REQ-YI-IDX-003
|
|
121
|
+
*/
|
|
122
|
+
export declare const QUERY_LOG_SCHEMA = "\n-- Query log table for performance monitoring\nCREATE TABLE IF NOT EXISTS query_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n query_hash TEXT NOT NULL,\n query_pattern TEXT NOT NULL,\n execution_time_ms INTEGER NOT NULL,\n rows_examined INTEGER,\n indexes_used TEXT,\n timestamp TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_query_log_hash ON query_log(query_hash);\nCREATE INDEX IF NOT EXISTS idx_query_log_timestamp ON query_log(timestamp);\nCREATE INDEX IF NOT EXISTS idx_query_log_time ON query_log(execution_time_ms);\n";
|
|
123
|
+
/**
|
|
124
|
+
* Index Optimizer for YATA Local database
|
|
125
|
+
*
|
|
126
|
+
* Provides index analysis, recommendations, and monitoring capabilities.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const optimizer = new IndexOptimizer(db);
|
|
131
|
+
* const result = await optimizer.analyzeIndexes();
|
|
132
|
+
* console.log(result.recommendations);
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* @see REQ-YI-IDX-001
|
|
136
|
+
* @see REQ-YI-IDX-002
|
|
137
|
+
* @see REQ-YI-IDX-003
|
|
138
|
+
*/
|
|
139
|
+
export declare class IndexOptimizer {
|
|
140
|
+
private db;
|
|
141
|
+
private monitoringEnabled;
|
|
142
|
+
constructor(db: Database.Database);
|
|
143
|
+
/**
|
|
144
|
+
* Analyze database indexes and generate recommendations
|
|
145
|
+
*
|
|
146
|
+
* Performance target: Complete within 5 seconds for up to 100,000 entities
|
|
147
|
+
*
|
|
148
|
+
* @param options - Analysis options
|
|
149
|
+
* @returns Index analysis result with recommendations
|
|
150
|
+
*
|
|
151
|
+
* @see REQ-YI-IDX-001
|
|
152
|
+
*/
|
|
153
|
+
analyzeIndexes(options?: AnalysisOptions): Promise<IndexAnalysisResult>;
|
|
154
|
+
/**
|
|
155
|
+
* Get all existing indexes in the database
|
|
156
|
+
*/
|
|
157
|
+
private getExistingIndexes;
|
|
158
|
+
/**
|
|
159
|
+
* Generate index recommendations based on analysis
|
|
160
|
+
*/
|
|
161
|
+
private generateRecommendations;
|
|
162
|
+
/**
|
|
163
|
+
* Get row count for a table
|
|
164
|
+
*/
|
|
165
|
+
private getTableRowCount;
|
|
166
|
+
/**
|
|
167
|
+
* Create a composite index on the specified table and columns
|
|
168
|
+
*
|
|
169
|
+
* @param table - Table name
|
|
170
|
+
* @param columns - Column names for the composite index
|
|
171
|
+
* @param options - Creation options
|
|
172
|
+
* @returns SQL statement (and executes if options.execute is true)
|
|
173
|
+
*
|
|
174
|
+
* @see REQ-YI-IDX-002
|
|
175
|
+
*/
|
|
176
|
+
createCompositeIndex(table: string, columns: string[], options?: CompositeIndexOptions): string;
|
|
177
|
+
/**
|
|
178
|
+
* Apply all recommended indexes
|
|
179
|
+
*
|
|
180
|
+
* @param recommendations - List of recommendations to apply
|
|
181
|
+
* @returns Applied index names
|
|
182
|
+
*/
|
|
183
|
+
applyRecommendations(recommendations: IndexRecommendation[]): string[];
|
|
184
|
+
/**
|
|
185
|
+
* Enable query performance monitoring
|
|
186
|
+
*
|
|
187
|
+
* Creates query_log table if it doesn't exist.
|
|
188
|
+
*
|
|
189
|
+
* @see REQ-YI-IDX-003
|
|
190
|
+
*/
|
|
191
|
+
enableMonitoring(): void;
|
|
192
|
+
/**
|
|
193
|
+
* Disable query performance monitoring
|
|
194
|
+
*/
|
|
195
|
+
disableMonitoring(): void;
|
|
196
|
+
/**
|
|
197
|
+
* Check if monitoring is enabled
|
|
198
|
+
*/
|
|
199
|
+
isMonitoringEnabled(): boolean;
|
|
200
|
+
/**
|
|
201
|
+
* Log a query execution for monitoring
|
|
202
|
+
*
|
|
203
|
+
* @param queryPattern - Normalized query pattern
|
|
204
|
+
* @param executionTimeMs - Execution time in milliseconds
|
|
205
|
+
* @param rowsExamined - Number of rows examined (optional)
|
|
206
|
+
* @param indexesUsed - List of indexes used (optional)
|
|
207
|
+
*/
|
|
208
|
+
logQuery(queryPattern: string, executionTimeMs: number, rowsExamined?: number, indexesUsed?: string[]): void;
|
|
209
|
+
/**
|
|
210
|
+
* Get query statistics from monitoring data
|
|
211
|
+
*
|
|
212
|
+
* @param limit - Maximum number of query patterns to return
|
|
213
|
+
* @returns Aggregated query statistics
|
|
214
|
+
*/
|
|
215
|
+
getQueryStats(limit?: number): QueryStats[];
|
|
216
|
+
/**
|
|
217
|
+
* Get slow queries (queries exceeding threshold)
|
|
218
|
+
*
|
|
219
|
+
* @param thresholdMs - Minimum execution time to consider slow
|
|
220
|
+
* @param limit - Maximum results to return
|
|
221
|
+
* @returns Slow query entries
|
|
222
|
+
*/
|
|
223
|
+
getSlowQueries(thresholdMs?: number, limit?: number): QueryStats[];
|
|
224
|
+
/**
|
|
225
|
+
* Clear query log (older than specified days)
|
|
226
|
+
*
|
|
227
|
+
* @param olderThanDays - Delete logs older than this many days (0 = all)
|
|
228
|
+
* @returns Number of deleted entries
|
|
229
|
+
*/
|
|
230
|
+
clearQueryLog(olderThanDays?: number): number;
|
|
231
|
+
/**
|
|
232
|
+
* Check if query_log table exists
|
|
233
|
+
*/
|
|
234
|
+
private isQueryLogTableExists;
|
|
235
|
+
/**
|
|
236
|
+
* Generate a hash for query pattern grouping
|
|
237
|
+
*/
|
|
238
|
+
private hashQuery;
|
|
239
|
+
/**
|
|
240
|
+
* Run ANALYZE to update SQLite statistics
|
|
241
|
+
*/
|
|
242
|
+
runAnalyze(): void;
|
|
243
|
+
/**
|
|
244
|
+
* Get database statistics summary
|
|
245
|
+
*/
|
|
246
|
+
getDatabaseStats(): {
|
|
247
|
+
entityCount: number;
|
|
248
|
+
relationshipCount: number;
|
|
249
|
+
patternCount: number;
|
|
250
|
+
indexCount: number;
|
|
251
|
+
dbSizeBytes: number;
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=index-optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-optimizer.d.ts","sourceRoot":"","sources":["../src/index-optimizer.ts"],"names":[],"mappings":"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"}
|