Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-20968

Possible performance issue when querying DB metadata (constraints, fkeys)

    XMLWordPrintable

Details

    Description

      When running queries to load constraints, there is a possible performance issue. it takes a long time to execute and load data from system tables:

      How to reproduce:
      1. create 100 databases, each db contains 1000 tables, each table contains 6 columns.
      2. execute these queries:

      SELECT CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
      	SELECT
      		CONSTRAINT_NAME,
      		COLUMN_NAME,
      		TABLE_NAME,
      		TABLE_SCHEMA,
      		REFERENCED_COLUMN_NAME,
      		REFERENCED_TABLE_NAME,
      		REFERENCED_TABLE_SCHEMA
      	FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE;
      

      it takes ages to finish.

      procs to generate env:

      CREATE DEFINER = `root`@`localhost` PROCEDURE db1.gendbs  ()  LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN
         DECLARE x     INT;
         DECLARE str   VARCHAR(255);
       
         SET x = 0;
         SET str = '';
       
        loop_label:
         LOOP
            IF x > 99
            THEN
               LEAVE loop_label;
            END IF;
       
            SET x = x + 1;
       
            SET str = CONCAT('CREATE DATABASE gendb',x);
            
            EXECUTE IMMEDIATE             str;
            
            
         END LOOP;
      END;
       
       
      CREATE DEFINER = `root`@`localhost` PROCEDURE db1.gentables  ()  LANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN
         DECLARE x      INT;
         DECLARE y      INT;
         DECLARE str    VARCHAR(255);
         DECLARE str2   VARCHAR(255);
       
         SET x = 0;
         SET y =0;
         SET str = '';
         SET str2 =
                ' ( id          INT NOT NULL,  name        CHAR(50) NOT NULL,  address     CHAR(50),  city        CHAR(50),  state       CHAR(25), zip_code    CHAR(10) )';
       
        OUTER_LOOP:
         LOOP
            IF y > 99
            THEN
               LEAVE OUTER_LOOP;
            END IF;
       
            SET y = y + 1;
       
           NESTED_LOOP:
            LOOP
               IF x >999
               THEN
                  LEAVE NESTED_LOOP;
               END IF;
       
               SET x = x + 1;
       
       
       
               SET str = CONCAT('CREATE table ','gendb',y,'.','employee', x, str2);
       
               EXECUTE IMMEDIATE          str;
            END LOOP;
             SET x =0;
         END LOOP;
      END;
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            mstanik Miroslav Stanik
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Git Integration

                Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.