Skip to content

Commit abd2ca5

Browse files
authored
refactor(schema): drop EstimateRowCount from source table change-tracking query (#99)
Use a single SELECT over change-tracking metadata; remove temp tables, cursor, and COUNT(*) batch. Remove EstimateRowCount from SourceTableChangeTrackingInfo.
1 parent 4357e9c commit abd2ca5

2 files changed

Lines changed: 2 additions & 53 deletions

File tree

src/SqlBulkSyncFunction/Helpers/SchemaExtensions.cs

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -36,69 +36,20 @@ FROM sys.change_tracking_databases
3636

3737
/// <summary>
3838
/// Query to retrieve change tracking metadata for all tracked tables in the database.
39-
/// Uses COUNT(*) per table so only SELECT on each table is required; no VIEW DATABASE PERFORMANCE STATE.
40-
/// EstimateRowCount is exact but may be slow on very large tables.
4139
/// </summary>
4240
public const string SourceTableChangeTrackingInfoQuery =
4341
"""
44-
CREATE TABLE #Base (
45-
TableObjectId INT NOT NULL,
46-
SchemaName SYSNAME NOT NULL,
47-
TableName SYSNAME NOT NULL,
48-
TrackColumnsUpdated BIT NOT NULL,
49-
MinValidVersion BIGINT NOT NULL,
50-
CurrentDatabaseVersion BIGINT NOT NULL
51-
);
52-
INSERT #Base
5342
SELECT
5443
t.object_id AS TableObjectId,
5544
s.name AS SchemaName,
5645
t.name AS TableName,
57-
CAST(ctt.is_track_columns_updated_on AS bit) AS TrackColumnsUpdated,
46+
CAST(ctt.is_track_columns_updated_on as bit) AS TrackColumnsUpdated,
5847
CHANGE_TRACKING_MIN_VALID_VERSION(t.object_id) AS MinValidVersion,
5948
CHANGE_TRACKING_CURRENT_VERSION() AS CurrentDatabaseVersion
6049
FROM sys.change_tracking_tables AS ctt
6150
JOIN sys.tables AS t ON t.object_id = ctt.object_id
6251
JOIN sys.schemas AS s ON s.schema_id = t.schema_id
6352
ORDER BY s.name, t.name;
64-
65-
CREATE TABLE #Counts (TableObjectId INT NOT NULL, EstimateRowCount BIGINT NULL);
66-
67-
DECLARE @object_id INT, @schema SYSNAME, @table SYSNAME, @sql NVARCHAR(MAX);
68-
DECLARE c CURSOR LOCAL FAST_FORWARD FOR
69-
SELECT TableObjectId, SchemaName, TableName FROM #Base;
70-
OPEN c;
71-
FETCH NEXT FROM c INTO @object_id, @schema, @table;
72-
WHILE @@FETCH_STATUS = 0
73-
BEGIN
74-
BEGIN TRY
75-
SET @sql = N'SELECT ' + CAST(@object_id as nvarchar(max)) + N' , COUNT(*)
76-
FROM ' + QUOTENAME(@schema) + N'.' + QUOTENAME(@table) + 'WITH(NOLOCK)';
77-
INSERT INTO #Counts (TableObjectId, EstimateRowCount)
78-
EXEC(@sql)
79-
END TRY
80-
BEGIN CATCH
81-
INSERT #Counts (TableObjectId, EstimateRowCount) VALUES (@object_id, NULL);
82-
END CATCH
83-
FETCH NEXT FROM c INTO @object_id, @schema, @table;
84-
END
85-
CLOSE c;
86-
DEALLOCATE c;
87-
88-
SELECT
89-
b.TableObjectId AS TableObjectId,
90-
b.SchemaName AS SchemaName,
91-
b.TableName AS TableName,
92-
b.TrackColumnsUpdated AS TrackColumnsUpdated,
93-
b.MinValidVersion AS MinValidVersion,
94-
b.CurrentDatabaseVersion AS CurrentDatabaseVersion,
95-
c.EstimateRowCount AS EstimateRowCount
96-
FROM #Base b
97-
LEFT JOIN #Counts c ON c.TableObjectId = b.TableObjectId
98-
ORDER BY b.SchemaName, b.TableName;
99-
100-
DROP TABLE #Counts;
101-
DROP TABLE #Base;
10253
""";
10354

10455
public static void PersistsSourceTargetVersionState(

src/SqlBulkSyncFunction/Models/Schema/SourceTableChangeTrackingInfo.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@ namespace SqlBulkSyncFunction.Models.Schema;
99
/// <param name="TrackColumnsUpdated">Whether column-level change tracking is enabled.</param>
1010
/// <param name="MinValidVersion">Minimum valid change tracking version for the table.</param>
1111
/// <param name="CurrentDatabaseVersion">Current change tracking version of the database.</param>
12-
/// <param name="EstimateRowCount">Estimated row count for the table.</param>
1312
public record SourceTableChangeTrackingInfo(
1413
int TableObjectId,
1514
string SchemaName,
1615
string TableName,
1716
bool TrackColumnsUpdated,
1817
long MinValidVersion,
19-
long CurrentDatabaseVersion,
20-
long? EstimateRowCount
18+
long CurrentDatabaseVersion
2119
);

0 commit comments

Comments
 (0)