Autor Zpráva
Kcko
Profil
Mám 3 tabulky

a dotaz složený v Nette (NDTB)

Dlouhý je jen díky Idčkům ....

Vyhazuje mi dosti zvláštní chybu
Duplicate entry '10071' for key 'group_key'


Přiznám se, že jsem z toho na větvi. Pokud umažu většinu těch IDček tak to funguje. Samostatný explain je rychlý. Napadně někoho jak to přepsat (klidně ručně).

Kajman?



SELECT `eshop_item_variant`.*, SUM(`eshop_item_variant_warehouse`.`amount`) AS `amount1` 
FROM `eshop_item_variant` 
INNER JOIN `eshop_item_variant_warehouse` ON `eshop_item_variant`.`id` =
`eshop_item_variant_warehouse`.`eshop_item_variant_id` 
INNER JOIN `warehouse` ON `eshop_item_variant_warehouse`.`warehouse_id` = `warehouse`.`id` 
WHERE (`warehouse`.`supplier_id` = `eshop_item_variant`.`supplier_id`) AND (`navigation_id` IN (715,
714, 713, 593, 712, 1201, 711, 586, 1200, 584, 865, 641, 700, 859, 833, 858, 832, 640, 699, 847,
864, 831, 1199, 698, 639, 863, 846, 857, 1021, 836, 830, 1196, 638, 583, 697, 845, 627, 856, 850,
716, 731, 862, 1036, 1020, 829, 835, 1035, 849, 844, 855, 861, 1195, 1190, 626, 730, 637, 582, 696,
585, 710, 1209, 108, 393, 779, 809, 799, 789, 741, 749, 788, 107, 798, 838, 778, 808, 405, 740,
1046, 777, 1010, 659, 797, 837, 748, 807, 404, 787, 106, 658, 747, 796, 241, 353, 806, 786, 105,
646, 1048, 739, 722, 1024, 776, 828, 657, 1117, 775, 631, 618, 738, 683, 721, 834, 104, 1157, 746,
1023, 785, 805, 352, 915, 689, 795, 1045, 645, 79, 11, 469, 827, 682, 737, 942, 720, 774, 851, 1116,
630, 877, 656, 794, 351, 914, 13, 78, 688, 1156, 1047, 784, 644, 621, 103, 804, 1022, 745, 629, 736,
643, 468, 687, 941, 876, 783, 843, 744, 483, 655, 955, 619, 681, 1034, 793, 826, 636, 102, 390,
1115, 719, 12, 803, 913, 1019, 733, 564, 453, 350, 1155, 773, 628, 661, 940, 802, 581, 1033, 1208,
622, 426, 463, 476, 792, 207, 1198, 485, 56, 933, 743, 686, 912, 635, 701, 538, 642, 772, 349, 782,
558, 882, 1029, 1267, 1114, 767, 885, 763, 879, 854, 992, 848, 653, 718, 735, 825, 680, 563, 924,
1154, 1018, 760, 101, 321, 732, 801, 911, 860, 1189, 884, 1191, 791, 224, 1265, 55, 881, 878, 10034,
346, 695, 226, 842, 344, 425, 1032, 980, 824, 990, 951, 1017, 939, 766, 937, 100, 1205, 1041, 956,
530, 742, 709, 482, 685, 1028, 679, 781, 1217, 1049, 1051, 1197, 1243, 771, 206, 1177, 979, 595,
1216, 734, 580, 1229, 562, 647, 557, 1230, 762, 927, 759, 991, 617, 948, 729, 1166, 1113, 949, 947,
660, 634, 633, 652, 573, 932, 625, 623, 387, 348, 693, 378, 389, 388, 376, 692, 624, 243, 386, 691,
632, 17, 690, 294, 242, 1147, 77, 76, 399, 607, 651, 293, 36, 19, 1146, 728, 184, 38, 282, 183, 717,
403, 176, 398, 495, 1145, 526, 75, 606, 231, 205, 195, 292, 230, 291, 15, 515, 99, 677, 397, 823,
903, 494, 182, 92, 503, 1144, 605, 37, 649, 83, 74, 650, 95, 197, 331, 16, 648, 1143, 154, 396,
10041, 1227, 338, 815, 654, 902, 707, 91, 290, 288, 1043, 82, 330, 40, 98, 229, 514, 1100, 94, 493,
181, 614, 676, 502, 670, 268, 73, 524, 668, 10044, 228, 153, 965, 337, 18, 276, 492, 1099, 1203,
883, 80, 159, 612, 694, 1009, 1226, 754, 1142, 138, 267, 727, 97, 1119, 501, 287, 1039, 1211, 39,
971, 379, 706, 841, 675, 281, 901, 513, 289, 561, 180, 204, 1060, 811, 266, 10039, 1165, 227, 275,
481, 320, 272, 35, 1118, 705, 757, 726, 874, 819, 684, 137, 546, 512, 311, 343, 769, 1059, 800, 203,
900, 616, 470, 1098, 674, 853, 500, 504, 286, 1040, 970, 603, 1141, 280, 179, 336, 1013, 753, 152,
964, 871, 1210, 142, 1003, 667, 1202, 1008, 1225, 460, 1171, 491, 158, 611, 14, 1164, 1007, 790,
1170, 1002, 358, 818, 1207, 279, 756, 1025, 10040, 752, 768, 285, 945, 459, 202, 1097, 490, 413,
613, 969, 673, 704, 497, 905, 1042, 602, 1050, 1140, 1194, 190, 265, 225, 678, 511, 271, 520, 525,
531, 666, 987, 1011, 54, 908, 963, 479, 370, 366, 545, 394, 1105, 875, 1261, 318, 121, 475, 127,
1158, 725, 362, 1112, 130, 136, 572, 899, 335, 1057, 375, 1058, 938, 1126, 1224, 869, 141, 151, 157,
440, 428, 923, 917, 1241, 708, 672, 968, 962, 262, 986, 270, 264, 1006, 1001, 703, 724, 1239, 761,
448, 984, 443, 1223, 474, 273, 1206, 278, 341, 334, 1031, 480, 1179, 1056, 484, 817, 868, 223, 53,
1193, 610, 510, 518, 189, 665, 1178, 579, 1186, 201, 898, 892, 156, 150, 935, 315, 1096, 601, 499,
909, 381, 196, 412, 369, 365, 361, 532, 1130, 944, 1150, 1125, 1139, 357, 1169, 590, 575, 1260,
1219, 1104, 544, 1160, 1153, 1111, 140, 907, 10043, 119, 135, 120, 755, 129, 839, 1038, 126, 765,
751, 880, 780, 1259, 407, 128, 556, 194, 591, 509, 222, 758, 1110, 1218, 1103, 125, 589, 560, 1012,
1176, 993, 249, 517, 1014, 1102, 994, 664, 671, 380, 467, 822, 118, 188, 1228, 723, 458, 1162, 985,
277, 1271, 750, 959, 961, 967, 34, 1129, 28, 1124, 916, 931, 918, 816, 1204, 1149, 10046, 1249, 372,
10042, 274, 1168, 565, 1159, 702, 10009, 1167, 910, 1005, 356, 1264, 368, 411, 1037, 364, 10045,
360, 1000, 543, 10047, 478, 897, 10036, 10035, 1044, 333, 340, 139, 1242, 200, 1095, 1222, 498, 943,
473, 1252, 1030, 770, 462, 934, 149, 1250, 438, 465, 247, 1185, 1240, 52, 852, 345, 1188, 1192, 870,
260, 50, 442, 891, 1272, 615, 134, 888, 155, 574, 457, 342, 540, 1221, 550, 1152, 339, 547, 764,
548, 332, 559, 813, 477, 245, 555, 10023, 449, 1187, 814, 445, 1136, 1122, 10, 471, 10022, 218, 821,
549, 244, 284, 1251, 896, 269, 570, 240, 217, 820, 60, 1248, 401, 972, 599, 596, 535, 27, 9, 472,
84, 1127, 1232, 567, 1138, 305, 895, 246, 59, 598, 239, 928, 810, 371, 8, 926, 307, 402, 461, 304,
238, 1151, 71, 1134, 410, 431, 26, 894, 58, 1086, 571, 906, 214, 597, 303, 237, 569, 57, 221, 306,
215, 25, 976, 7, 446, 594, 1067, 385, 317, 893, 400, 1135, 1094, 367, 523, 966, 576, 1085, 998, 213,
533, 1084, 329, 1263, 169, 554, 522, 568, 406, 316, 464, 48, 33, 111, 592, 283, 1128, 537, 1148,
418, 252, 925, 427, 975, 1066, 236, 300, 960, 1093, 952, 890, 447, 1083, 322, 414, 996, 259, 1071,
974, 408, 1065, 553, 96, 889, 867, 211, 1092, 47, 1079, 1247, 1220, 220, 72, 439, 542, 165, 536,
363, 384, 588, 65, 1004, 328, 1123, 32, 199, 235, 958, 193, 872, 298, 534, 1137, 521, 171, 417, 23,
122, 999, 1078, 1091, 957, 161, 395, 887, 983, 234, 10073, 299, 973, 1064, 382, 1069, 143, 49, 6,
146, 1107, 437, 1121, 600, 1238, 409, 93, 1182, 441, 70, 258, 566, 191, 164, 326, 519, 1082, 62,
219, 1246, 452, 1132, 507, 46, 359, 212, 31, 170, 1163, 1183, 163, 110, 168, 1237, 1120, 1161, 310,
187, 248, 541, 64, 30, 5, 1257, 1269, 22, 355, 1131, 516, 325, 1081, 429, 1077, 1090, 51, 422, 1245,
1174, 1235, 233, 45, 1184, 489, 1063, 423, 117, 124, 255, 160, 133, 977, 886, 145, 1215, 1213, 89,
1027, 69, 90, 1054, 1016, 997, 506, 982, 416, 210, 175, 309, 456, 297, 314, 10064, 1055, 1053, 44,
1133, 486, 1234, 167, 488, 415, 1212, 455, 1214, 10011, 1270, 662, 21, 1015, 989, 10029, 1109, 539,
527, 261, 663, 10072, 68, 1258, 1026, 178, 508, 1180, 1181, 4, 1273, 10069, 995, 324, 88, 63, 466,
1173, 1089, 981, 421, 216, 132, 1076, 435, 1073, 1266, 1256, 978, 420, 174, 904, 1175, 254, 296,
496, 1268, 450, 123, 116, 1074, 1231, 953, 1244, 313, 954, 1052, 505, 988, 444, 946, 198, 433, 391,
10016, 866, 1068, 10030, 319, 392, 308, 10031, 253, 434, 432, 436, 528, 454, 295, 10017, 1080, 1274,
10049, 1106, 1075, 312, 430, 10048, 577, 173, 1087, 302, 10057, 587, 10054, 209, 251, 301, 10056,
354, 1262, 327, 1088, 10059, 172, 10052, 323, 186, 208, 1108, 166, 10063, 24, 552, 1101, 144, 10051,
383, 10058, 162, 131, 578, 61, 263, 10060, 10071, 109, 115, 10024, 373, 1062, 10067, 10055, 256,
192, 29, 1255, 113, 87, 419, 10068, 10019, 10066, 177, 257, 43, 20, 487, 1070, 1, 67, 10032, 114,
42, 1172, 148, 1254, 10070, 86, 10015, 1236, 1253, 147, 185, 250, 112, 551, 66, 41, 3, 10000, 10001,
10002, 10003, 10004, 10012, 10013, 10020, 10018, 10025, 10026, 10027, 10028, 10033, 10037, 10038,
10050, 10053, 10062, 10061, 10065, 10021, 10074, 0)) 
GROUP BY `eshop_item_variant`.`id` 
HAVING `valid_price_group_to` < "2014-12-05 04:37:53" OR (`eshop_item_variant`.`valid_price_group_to_sold_out` = 1 AND `amount1` = 0) 
ORDER BY `id` DESC 
LIMIT 1000 
OFFSET 0;
Karel N.
Profil
máš volné místo na disku? Jaké hodnoty máš nastavené pro max_heap_table_size a tmp_table_size (*)? Tahle chyba znamená, že mysql nemohlo do temp tabulky uložit další záznamy při agregraci dat. V praxi buď dělám nevhodný dotaz nad moc velkou tabulkou nebo nemám místo na disku či mám nastavený příliš malé limity pro práci s takhle velkými datasety.


*) zjistíš je přes sql dotaz SHOW VARIABLES LIKE '%table_size%'
Kcko
Profil
Karel N.:
obojí 33554432

Admin mě upozorňoval, že ten dotaz žere dost paměti, ale momentálně nevím jak to přepsat lépe a s konfigurační direktivou už hýbat nejde.
Karel N.
Profil
musíš zoptimalizovat dotaz, dají se samozřejmě změnit direktivy na serveru, ale je to cesta do pekel, pak ti nebude databáze stíhat.

Problém vidím v podobě having a limitu, kvůli tomu nejspíš musí databáze uložit do tmp tabulky až příliš dat. Databáze totiž do tmp tabulky musí vygenerovat vše a poté ti pošle nazpátek jen část, která je omezena limitem.

Zkus s tím více experimentovat, limit se dá přepsat do bloku where nebo zjistit dopředu. Začni s tím, že místo limitu dáš omezení na `eshop_item_variant`.`id`, tak aby to přibližně odpovídalo 1000 položkám (WHERE `eshop_item_variant`.`id` BETWEEN x, y AND ...), pokud se dotaz výrazně zrychlí. Můžeš si id pro limit vypočítat dotazem dopředu. V opačném případě půjde také dotaz rozdělit na dvě části, tak abys zrušil having.
Kcko
Profil
Karel N.:
Ok, díky zítra se na to ještě podívám.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: