Skip to content

Releases: larspl/sqlwatch

SQLWATCH Latest 20250814153613

14 Aug 13:39

Choose a tag to compare

Solution Implemented:

Added a comprehensive [SanitizeSqlIdentifier()] method that:

Converts ALL non-alphanumeric characters to underscores
Ensures identifiers start with a letter or underscore (prepends _ if starting with digit)
Limits length to 50 characters to leave room for prefixes/suffixes
Handles null/empty inputs gracefully
Updated both staging table name generation points:

Initial table name creation (line ~377)
Retry logic table name creation (line ~950)
Simplified the unique suffix generation to remove unnecessary complexity while maintaining uniqueness

20250808

07 Aug 18:14

Choose a tag to compare

Hybrid Approach Implementation Complete

  1. Enhanced Configuration (App.config)
    Added GlobalConcurrencyLimit (20) - prevents overwhelming the database
    Added table-specific concurrency: Logger (6), Meta (2), Default (3)
    Added staging control and merge batch sizes
    Added stagger delays to spread peak load
  2. New HybridImportManager Class
    Global throttling with SemaphoreSlim to limit total concurrent operations
    Table-specific throttling to reduce lock contention per table type
    Intelligent concurrency based on table patterns (logger vs meta)
    Staggered execution to smooth load distribution
    Monitoring capabilities to track concurrency usage
  3. Enhanced SqlWatchInstance.cs
    Dependency-level processing with hybrid control
    Unique staging tables per session to avoid conflicts
    Optimized bulk copy options based on table type
    Better lock hints for merge operations (ROWLOCK, READPAST)
    Automatic cleanup of staging tables
  4. Improved Program.cs
    Conservative thread management instead of unlimited auto-scaling
    Async/await pattern instead of Parallel.ForEach for better control
    Resource cleanup and better error handling
    Success tracking and reporting
    Key Benefits for 100 Instances:
    🚦 Controlled Concurrency: Max 20 global operations prevent database overwhelming
    🎯 Table-Specific Optimization: Logger tables (6 concurrent) vs Meta tables (2 concurrent)
    📊 Reduced Lock Contention: ROWLOCK hints and staging approach for meta tables
    ⏱️ Load Distribution: Random stagger delays smooth peak loads
    🔧 Fine-Tunable: All limits configurable based on your hardware
    📈 Monitoring: Built-in concurrency statistics for performance tuning
    Recommended Settings for 100 Instances:
    The implementation is ready to handle your 100-instance scenario with much better performance and reduced lock contention compared to the original approach!

SqlWatchImport-20250802-11

07 Aug 21:01

Choose a tag to compare

Dramatic Performance Gains

Up to 70% faster import times for large datasets
Intelligent resource utilization based on data volume
Prevents timeout failures on very large imports

SqlWatchImport-20250802-10

07 Aug 20:56

Choose a tag to compare

SqlWatchImport-20250802-10

SqlWatchImport-20250802-09

07 Aug 20:48

Choose a tag to compare

SqlWatchImport-20250802-09

SqlWatchImport-20250802-08

07 Aug 20:42

Choose a tag to compare

SqlWatchImport-20250802-08

SqlWatchImport-20250802-07

07 Aug 20:31

Choose a tag to compare

Refined Conflict Resolution for Meta Tables

Key Improvements:
Precision-Based Deletion for sqlwatch_meta_table:

Old approach: Deleted ALL rows for the SQL instance (too broad)
New approach: Deletes only the specific conflicting database/table combinations
Uses explicit join on sql_instance, sqlwatch_database_id, and sqlwatch_table_id
This ensures only the exact tables being imported are refreshed
Enhanced Fallback Strategy:

If the primary deletion approach fails, attempts a fallback using IN clause
Fallback targets only the specific database/table IDs present in the staging data
Provides additional resilience while maintaining precision
Improved Column Handling:

method to properly handle bracketed column names
Strips and re-adds brackets for consistent SQL formatting
More robust handling of complex primary key definitions
How the Refined Logic Works:
For sqlwatch_meta_table:
For Other Meta Tables:
Benefits:
Surgical Precision: Only removes the exact objects being updated, not entire instance data
Data Safety: Preserves unrelated meta data for the same instance
Performance: More efficient than broad deletions followed by large inserts
Resilience: Fallback mechanism ensures operation succeeds even with schema variations
Detailed Logging: Tracks exactly how many rows were removed and why
Example Scenario:
If your source has tables A, B, and C, but the destination has tables A, B, C, D, and E:

Old approach: Would delete ALL tables (A, B, C, D, E) then insert (A, B, C) - losing D and E
New approach: Only refreshes tables A, B, and C, leaving D and E intact
This refined approach ensures that sqlwatch_meta_table accurately reflects the source while being much safer and more precise in its conflict resolution.

SqlWatchImport-20250802-06

07 Aug 20:12

Choose a tag to compare

SqlWatchImport-20250802-06

SqlWatchImport-20250802-05

07 Aug 19:55

Choose a tag to compare

fix SqlWatchImport-20250802-04

20250808-004

07 Aug 19:12

Choose a tag to compare

bug fix 20250808-004