Skip to content

Commit bd2a245

Browse files
ssreeramaCopilot
andauthored
[Perf]: Remove unnecessary T-SQL parsing to improve project load time (#22057)
* Removing T-SQL parsing logic for whole project causing the latency * changelog updates Co-authored-by: Copilot <copilot@github.com> --------- Co-authored-by: Copilot <copilot@github.com>
1 parent b618976 commit bd2a245

8 files changed

Lines changed: 3 additions & 81 deletions

File tree

extensions/sql-database-projects/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ _The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
99
## [1.5.10] - 2026-06-02
1010

1111
- Improved Publish Project dialog performance for faster initial loading, and improved port number validation in Publish Project dialog to correctly show available port.
12+
- Improved SQL project loading performance.
1213

1314
## [1.5.9] - 2026-04-22
1415

extensions/sql-database-projects/src/common/constants.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,6 @@ export enum DatabaseProjectItemType {
769769
folder = "databaseProject.itemType.folder",
770770
file = "databaseProject.itemType.file",
771771
externalStreamingJob = "databaseProject.itemType.file.externalStreamingJob",
772-
table = "databaseProject.itemType.file.table",
773772
referencesRoot = "databaseProject.itemType.referencesRoot",
774773
reference = "databaseProject.itemType.reference",
775774
sqlProjectReference = "databaseProject.itemType.reference.sqlProject",

extensions/sql-database-projects/src/controllers/projectController.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,7 +1111,6 @@ export class ProjectsController {
11111111

11121112
switch (node.type) {
11131113
case constants.DatabaseProjectItemType.sqlObjectScript:
1114-
case constants.DatabaseProjectItemType.table:
11151114
case constants.DatabaseProjectItemType.externalStreamingJob:
11161115
await project.excludeSqlObjectScript(node.entryKey);
11171116
break;
@@ -1186,7 +1185,6 @@ export class ProjectsController {
11861185
} else if (node instanceof FileNode) {
11871186
switch (node.type) {
11881187
case constants.DatabaseProjectItemType.sqlObjectScript:
1189-
case constants.DatabaseProjectItemType.table:
11901188
case constants.DatabaseProjectItemType.externalStreamingJob:
11911189
await project.deleteSqlObjectScript(node.entryKey);
11921190
break;

extensions/sql-database-projects/src/models/project.ts

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -442,49 +442,12 @@ export class Project implements ISqlProject {
442442
const sqlObjectScriptEntries: FileProjectEntry[] = [];
443443

444444
for (let f of Array.from(filesSet.values())) {
445-
const containsCreateTableStatement = await this.checkForCreateTableStatement(f);
446-
447-
sqlObjectScriptEntries.push(
448-
this.createFileProjectEntry(
449-
f,
450-
EntryType.File,
451-
undefined,
452-
containsCreateTableStatement,
453-
),
454-
);
445+
sqlObjectScriptEntries.push(this.createFileProjectEntry(f, EntryType.File, undefined));
455446
}
456447

457448
this._sqlObjectScripts = sqlObjectScriptEntries;
458449
}
459450

460-
/**
461-
* Checks if a SQL script file contains a CREATE TABLE statement
462-
* @param relativePath Relative path to the script file
463-
* @returns true if the file contains a CREATE TABLE statement, false otherwise
464-
*/
465-
private async checkForCreateTableStatement(relativePath: string): Promise<boolean> {
466-
const fullPath = path.join(
467-
utils.getPlatformSafeFileEntryPath(this.projectFolderPath),
468-
utils.getPlatformSafeFileEntryPath(relativePath),
469-
);
470-
471-
if (!(await utils.exists(fullPath))) {
472-
return false;
473-
}
474-
475-
try {
476-
const dacFxService = await utils.getDacFxService();
477-
const parseResult = await dacFxService.parseTSqlScript(
478-
fullPath,
479-
this._databaseSchemaProvider,
480-
);
481-
return parseResult.containsCreateTableStatement;
482-
} catch {
483-
// If parsing fails, silently default to false
484-
return false;
485-
}
486-
}
487-
488451
private async readFolders(): Promise<void> {
489452
var result: GetFoldersResult = await this.sqlProjService.getFolders(this.projectFilePath);
490453
utils.throwIfFailed(result);
@@ -1397,15 +1360,13 @@ export class Project implements ISqlProject {
13971360
relativePath: string,
13981361
entryType: EntryType,
13991362
sqlObjectType?: string,
1400-
containsCreateTableStatement?: boolean,
14011363
): FileProjectEntry {
14021364
let platformSafeRelativePath = utils.getPlatformSafeFileEntryPath(relativePath);
14031365
return new FileProjectEntry(
14041366
Uri.file(path.join(this.projectFolderPath, platformSafeRelativePath)),
14051367
utils.convertSlashesForSqlProj(relativePath),
14061368
entryType,
14071369
sqlObjectType,
1408-
containsCreateTableStatement,
14091370
);
14101371
}
14111372

extensions/sql-database-projects/src/models/projectEntry.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,12 @@ export class FileProjectEntry extends ProjectEntry implements IFileProjectEntry
3333
fsUri: Uri;
3434
relativePath: string;
3535
sqlObjectType: string | undefined;
36-
containsCreateTableStatement: boolean | undefined;
3736

38-
constructor(
39-
uri: Uri,
40-
relativePath: string,
41-
entryType: EntryType,
42-
sqlObjectType?: string,
43-
containsCreateTableStatement?: boolean,
44-
) {
37+
constructor(uri: Uri, relativePath: string, entryType: EntryType, sqlObjectType?: string) {
4538
super(entryType);
4639
this.fsUri = uri;
4740
this.relativePath = relativePath;
4841
this.sqlObjectType = sqlObjectType;
49-
this.containsCreateTableStatement = containsCreateTableStatement;
5042
}
5143

5244
public override toString(): string {

extensions/sql-database-projects/src/models/tree/fileFolderTreeItem.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -105,19 +105,6 @@ export class ExternalStreamingJobFileNode extends SqlObjectFileNode {
105105
}
106106
}
107107

108-
export class TableFileNode extends SqlObjectFileNode {
109-
public override get treeItem(): vscode.TreeItem {
110-
const treeItem = super.treeItem;
111-
treeItem.contextValue = this.type;
112-
113-
return treeItem;
114-
}
115-
116-
public override get type(): DatabaseProjectItemType {
117-
return DatabaseProjectItemType.table;
118-
}
119-
}
120-
121108
export class PreDeployNode extends FileNode {
122109
public override get treeItem(): vscode.TreeItem {
123110
const treeItem = super.treeItem;

extensions/sql-database-projects/src/models/tree/projectTreeItem.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,6 @@ export class ProjectRootTreeItem extends BaseProjectTreeItem {
156156
this.projectFileUri,
157157
entry.relativePath,
158158
);
159-
} else if (entry.containsCreateTableStatement) {
160-
newNode = new fileTree.TableFileNode(
161-
entry.fsUri,
162-
this.projectFileUri,
163-
entry.relativePath,
164-
);
165159
} else {
166160
newNode = new fileTree.SqlObjectFileNode(
167161
entry.fsUri,

extensions/sql-database-projects/test/projectController.test.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,11 +1366,6 @@ suite("ProjectsController", function (): void {
13661366
}
13671367
return <any>{ exports: dataWorkspaceMock };
13681368
});
1369-
sandbox.stub(utils, "getDacFxService").returns(<any>{
1370-
parseTSqlScript: (_: string, __: string) => {
1371-
return Promise.resolve({ containsCreateTableStatement: true });
1372-
},
1373-
});
13741369

13751370
// add project reference from project1 to project2
13761371
await projController.addDatabaseReferenceCallback(
@@ -1428,11 +1423,6 @@ suite("ProjectsController", function (): void {
14281423
}
14291424
return <any>{ exports: dataWorkspaceMock };
14301425
});
1431-
sandbox.stub(utils, "getDacFxService").returns(<any>{
1432-
parseTSqlScript: (_: string, __: string) => {
1433-
return Promise.resolve({ containsCreateTableStatement: true });
1434-
},
1435-
});
14361426
// add dacpac reference to something in the same folder
14371427
expect(project1.databaseReferences.length).to.equal(
14381428
0,

0 commit comments

Comments
 (0)