sql >> Database >  >> RDS >> Mysql

Opgeslagen mysql-procedure is 20 keer langzamer dan standaardquery

Gewoon een gok:

Wanneer u de query handmatig uitvoert, wordt de uitdrukking WHERE ('test' IS NULL or COL1 = 'test') kan worden geoptimaliseerd wanneer de query wordt geparseerd. De parser kan zien dat de string 'test' is niet null, dus het converteert de test naar WHERE COL1 = 'test' . En als er een index is op COL1 dit wordt gebruikt.

Wanneer u echter een opgeslagen procedure maakt, vindt parsering plaats wanneer de procedure wordt gemaakt. Op dat moment weet het niet wat @param zal zijn, en moet de query implementeren als een sequentiële scan van de tabel.

Probeer uw procedure te wijzigen in:

IF @param IS NULL
THEN BEGIN
  SELECT * FROM table1
  UNION ALL
  SELECT * FROM table2
  ...
END;
ELSE BEGIN
  SELECT * FROM table1 WHERE col1 = @param
  UNION ALL
  SELECT * FROM table2 WHERE col1 = @param
  ...
END;
END IF;

Ik heb niet veel ervaring met opgeslagen MySQL-procedures, dus ik weet niet zeker of dat de juiste syntaxis is.



  1. Een overzicht van Just-in-Time Compilation (JIT) voor PostgreSQL

  2. Zoek de afstand tussen twee punten met behulp van de lengte- en breedtegraad in mysql

  3. PHP PDO:charset, setnamen?

  4. Waarom krijg ik deze SQLSyntaxErrorException:ORA-00933:SQL-opdracht is niet correct beëindigd wanneer ik deze JDBC-query probeer uit te voeren?