sql >> Database >  >> RDS >> Mysql

De kolom rand() van de subquery opnieuw geëvalueerd voor elke herhaalde selectie in MySQL 5.7/8.0 versus MySQL 5.6

Zoals vermeld in The MySQL 8.0.0 Milestone Release is beschikbaar ,

Ik veronderstel dat dit de oorzaak is van het gedrag dat ik waarneem in nieuwere versies van MySQL. De genoemde hint kan worden gebruikt met MySQL 8.0 om te forceren dat RAND() slechts één keer wordt aangeroepen:

SELECT  /* NO_MERGE(q) */
        q.i,
        q.r,
        q.r
FROM    (
        SELECT 
                id AS i,
                (FLOOR(RAND(100) * 4)) AS r
        FROM t
        ) AS q;

+---+-----+-----+
| i |  r  |  r  |
+---+-----+-----+
| 1 |   0 |   0 |
| 2 |   2 |   2 |
| 3 |   3 |   3 |
| 4 |   2 |   2 |
| 5 |   1 |   1 |
+---+-----+-----+

Dit is echter niet beschikbaar in 5.7. Om het gewenste gedrag met 5.7 te bereiken, voegt u LIMIT <a very high number> toe naar de afgeleide tabeldefinitie (ik gebruik hieronder ondertekend LONG_MAX). Met dank aan Roy Lyseng voor deze oplossing .

SELECT
        q.i,
        q.r,
        q.r
FROM    (
        SELECT 
                id AS i,
                (FLOOR(RAND(100) * 4)) AS r
        FROM t LIMIT 9223372036854775807
        ) AS q;

+---+-----+-----+
| i |  r  |  r  |
+---+-----+-----+
| 1 |   0 |   0 |
| 2 |   2 |   2 |
| 3 |   3 |   3 |
| 4 |   2 |   2 |
| 5 |   1 |   1 |
+---+-----+-----+

Als philipxy vermeld in de opmerking, moet het resultaat van een query-expressie strikt worden gedefinieerd, ongeacht eventuele optimalisaties die worden toegepast. Wat betekent dat het een optimalisatiefout is in MySQL 5.7/8.0.




  1. mysql ophaalarray

  2. Wat er ook gebeurt, ik kan MySQL INSERT-instructies niet batchgewijs in Hibernate

  3. Schrijven in ExcelSheet met UTL_FILE-pakket in Oracle

  4. Hoe Unicode() werkt in SQLite