sql >> Databasteknik >  >> RDS >> Mysql

mysql lagrad procedur är långsammare 20 gånger än standardfrågan

Bara en gissning:

När du kör frågan för hand, uttrycket WHERE ('test' IS NULL or COL1 = 'test') kan optimeras när frågan tolkas. Parsern kan se att strängen 'test' är inte null, så det konverterar testet till WHERE COL1 = 'test' . Och om det finns ett index på COL1 detta kommer att användas.

Men när du skapar en lagrad procedur, sker analys när proceduren skapas. Vid den tiden vet den inte vad @param kommer att vara och måste implementera frågan som en sekventiell genomsökning av tabellen.

Försök att ändra din procedur till:

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;

Jag har inte mycket erfarenhet av MySQL-lagrade procedurer, så jag är inte säker på att det är rätt syntax.



  1. Hur kan jag avgöra i SQL Server om ett dateTime-intervall överlappar ett annat

  2. HikariCP:Vilka tidsgränser på databasnivå bör övervägas för att ställa in maxLifetime för Oracle 11g

  3. Förstå SQL Server alltid krypterad

  4. Hur man jämför två kolumner i MySQL