|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
White Owl, в общем я хочу получить: в гриде список товаров, сгруппированых по категории, с фильтрацией по атрибутам. Т.е. мне нужны данные: Название, Цена, Атрибуты(если упростить). Я поколдовал, посмотрел, читал "кое-чего в интернете". После экспериментов пришёл к выводу, который уже написан: >> Перед созданием таблицы "TOBAPbl" выполняется запрос к базе данных и берутся все атрибуты, и из них создаётся приписка, которая создаёт дополнительные колонки для таблицы "TOBAPbl". Т.е. эта таблица имеет колонки-атрибуты. >> Самое быстрое решение. В общем. Тестовый SQL Запрос на вывод товаров категории(Ограничил атрибуты до 3 шт.): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67.
, где "KOLOHKA" - атрибуты. LIMIT - Для деления на многопоточность(количество потоков определяет интервал). Я конечно понимаю: плохо выглядит запрос. Но речь идёт об "списке товаров раздела". Т.е. "куча категорий". Может и 50 шт. Может и больше. Категории записаны(кому-что принадлежит) в таблице товаров. Имеет смысл что-то менять в структуре базы? Или может другой запрос надо писать? Можно пример? Приму любые комментарии по моему ужасу. Дополнение: 1) Цикл: 1. Результат запроса(из 1-й таблицы(проходимся по каждому товару, для записи его данных на вывод), конкретный товар) 2. По его id я делаю запрос в этом же соединении на "список атрибутов" 3. Записываю в массив на вывод Не вариант. Медленно. 2) Колонка "KATEGOPuia" в таблице "TOBAPbl" - проиндексирована. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2017, 20:07 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
47911, даа.... Знатное извращение. Про соединение таблиц ты не слышал ни разу? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
И все... Только убедись что у тебя по всем полям используемым для соединений есть индексы. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2017, 21:53 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
Очень благодарен за такой ответ. Но есть ещё вопросы. White Owl47911, даа.... Знатное извращение. Про соединение таблиц ты не слышал ни разу? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
И все... Только убедись что у тебя по всем полям используемым для соединений есть индексы. Сер. А "k.criteria_for_KATEGOPuu = 'моя крутая категория'" годится, если я правильно понимаю и меня не обманывает мой мозг: годиться для 1 категории?(k.criteria_for_KATEGOPuu = '62') Или имеется ввиду что: вместо "k.criteria_for_KATEGOPuu = 'моя крутая категория'" будет то самое "Знатное извращение." вида "`KATEGOPuia`='2590' OR `KATEGOPuia`='2626' OR "? У меня в таблице категорий - именно иерархия: Код: sql 1. 2. 3. 4. 5. 6. 7.
А у товаров прописывается только категория, в которой они лежат. Или лучше иметь доп.колонку - с id раздела?(что-то мне подсказывает - это ускорит выдачу. Только щас об этом подумал. . .) Поясните: при обращении T["ta1.ZHA4eHue"](в шарпе, каждый проход цикла имеет массив "T", в нём результат прохода) я получу "аттрибут KOLOHKA1239 товара(значение атрибута)"? Т.е. как получить результат обращения-> конкретный атрибут? Также поясните(проговорите словами) эту конструкцию: Код: sql 1. 2. 3. 4. 5. 6. 7.
Про join я слышал\видел как пользуются. Но до сегоднешнего дня я не вникал в него. У меня лишь поверхностное понимание: позволяет реализовывать сложные условия выборки. Но без подробностей, т.к. обходился без него. Т.к. я за эти несколько дней "что-то менял в базе"(при создании таблиц) я пишу полную инфу(на какой базе щас делаю тесты) ниже(чтобы была исчерпывающая инфа по вопросу, для которого я эту тему и создал). Вот что создаёт базу(SQL запрос в SQLite3): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
$DOn_KOLOHKu - место, где я комментируя строку - отменяю создание колонок-атрибутов у таблицы. Ключи "references" пока не использую, т.к. есть данные(в базе-доноре) которые являются мусором. Пока пусть будут. Для них обработка будет придумана позже. И, как следствие: я с этой базой и работаю. Жду ответы на вопросы, от White Owl. Огромная благодарность за то, что ещё тратите на меня время. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2017, 10:39 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
47911Сер. А "k.criteria_for_KATEGOPuu = 'моя крутая категория'" годится, если я правильно понимаю и меня не обманывает мой мозг: годиться для 1 категории?Да. k.HAZBAHuE = 'моя крутая категория' это выборка одной строки. Для нескольких будет k.HAZBAHuE in('a', 'b', 'c') 47911Поясните: при обращении T["ta1.ZHA4eHue"](в шарпе, каждый проход цикла имеет массив "T", в нём результат прохода) я получу "аттрибут KOLOHKA1239 товара(значение атрибута)"? Т.е. как получить результат обращения-> конкретный атрибут?C# здесь нет ни грамма. Это все один цельный запрос отсылаемый в СУБД и возвращающий один единственный резалтсет. 47911Про join я слышал\видел как пользуются. Но до сегоднешнего дня я не вникал в него. У меня лишь поверхностное понимание: позволяет реализовывать сложные условия выборки. Но без подробностей, т.к. обходился без него.Ну значит пора читать учебники. Это описано во всех учебниках, даже в желтых книжках типа "за 21 день для идиотов". 47911Т.к. я за эти несколько дней "что-то менял в базе"(при создании таблиц) я пишу полную инфу(на какой базе щас делаю тесты) ниже(чтобы была исчерпывающая инфа по вопросу, для которого я эту тему и создал). Вот что создаёт базу(SQL запрос в SQLite3):Забыл первичные ключи задать. И перейди уже на английский, сколько ты еще собираешься себе глаза ломать? 47911$DOn_KOLOHKu - место, где я комментируя строку - отменяю создание колонок-атрибутов у таблицы.Это совершенно не нужно. У тебя уже есть нормализованная структура. Ну так и пользуйся ею. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2017, 17:44 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
White Owl47911Сер. А "k.criteria_for_KATEGOPuu = 'моя крутая категория'" годится, если я правильно понимаю и меня не обманывает мой мозг: годиться для 1 категории?Да. k.HAZBAHuE = 'моя крутая категория' это выборка одной строки. Для нескольких будет k.HAZBAHuE in('a', 'b', 'c') 47911Поясните: при обращении T["ta1.ZHA4eHue"](в шарпе, каждый проход цикла имеет массив "T", в нём результат прохода) я получу "аттрибут KOLOHKA1239 товара(значение атрибута)"? Т.е. как получить результат обращения-> конкретный атрибут?C# здесь нет ни грамма. Это все один цельный запрос отсылаемый в СУБД и возвращающий один единственный резалтсет. 47911Про join я слышал\видел как пользуются. Но до сегоднешнего дня я не вникал в него. У меня лишь поверхностное понимание: позволяет реализовывать сложные условия выборки. Но без подробностей, т.к. обходился без него.Ну значит пора читать учебники. Это описано во всех учебниках, даже в желтых книжках типа "за 21 день для идиотов". 47911Т.к. я за эти несколько дней "что-то менял в базе"(при создании таблиц) я пишу полную инфу(на какой базе щас делаю тесты) ниже(чтобы была исчерпывающая инфа по вопросу, для которого я эту тему и создал). Вот что создаёт базу(SQL запрос в SQLite3):Забыл первичные ключи задать. И перейди уже на английский, сколько ты еще собираешься себе глаза ломать? 47911$DOn_KOLOHKu - место, где я комментируя строку - отменяю создание колонок-атрибутов у таблицы.Это совершенно не нужно. У тебя уже есть нормализованная структура. Ну так и пользуйся ею. >>C# здесь нет ни грамма. Это все один цельный запрос отсылаемый в СУБД и возвращающий один единственный резалтсет. >> А как тогда изменить запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Чтобы он возвращал целый список результатов? Я попытался: Код: sql 1.
(Готовый програмно-сгенерированый запрос) - оно возвращает "2429" одного и того же товара. за 1-3 секунды. Можно это дело как-то ускорить? Индексы: Код: sql 1. 2. 3. 4. 5. 6. 7.
"INTEGER PRIMARY KEY ASC" тоже расставлены. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 14:47 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
47911, >>оно возвращает "2429" одного и того же товара. >> в смысле "как изменить запрос, чтобы он возвращал список товаров, у которых `PAZDEL`='X'"? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 14:50 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
Прочитай учебник: http://www.sql.ru/docs/sql/u_sql/ Воспользуйся любой SQLite утилитой для тренировки. Не своей программой, а внешней утилитой. Как почувствуешь что все запросы можно сделать из этой сторонней утилиты, тогда вернешься к C#. Пока оно тебе мешает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 17:36 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
White OwlПрочитай учебник: http://www.sql.ru/docs/sql/u_sql/ Воспользуйся любой SQLite утилитой для тренировки. Не своей программой, а внешней утилитой. Как почувствуешь что все запросы можно сделать из этой сторонней утилиты, тогда вернешься к C#. Пока оно тебе мешает. За ссылку благодарю. Некоторые вещи проясняться начали. Но мне не понятно: почему запрос с join пишется без "LEFT\RIGHT" и т.д.? И почему он выдаёт 1 результат?(ищет 1 товар) Я просмотрел через поиск слова join то, что по ссылке - вообще нет инфы(я конечно понимаю: есть другие источники, но в них с "доп. словом" используется этот оператор. А примера с "join" без 2 слова - не нашёл, и, как следствие, объяснения тоже). Программу для тестов использую: "DB Browser for SQLite". С ней действительно удобнее. П.с.: мне вообще это ради одного места надо: вывести список максимально быстро(эта тема об этой проблеме). Всё остальное - уже сделано. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 17:59 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
47911Но мне не понятно: почему запрос с join пишется без "LEFT\RIGHT" и т.д.?Потому что это разные типы связывания: запрос с просто JOIN это полное связывание, а LEFT/RIGHT [OUTER] JOIN это "внешнее" связывание (все совпадающие плюс те для которых не нашлось совпадений). В первой книге Грабера они кажется не рассмотрены вообще. 47911 И почему он выдаёт 1 результат?(ищет 1 товар)А почему он должен выдавать несколько? 47911Я просмотрел через поиск слова join то, что по ссылке - вообще нет инфы(я конечно понимаю: есть другие источники, но в них с "доп. словом" используется этот оператор. А примера с "join" без 2 слова - не нашёл, и, как следствие, объяснения тоже).ээээ... да. Грабер писал о более раннем варианте SQL. Ключевое слово JOIN ввели в диалекте SQL-92. Надо брать более свежей учебник. Но начинать лучше с Грабера - он самый понятный хоть и частично устаревший. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 21:18 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
White Owl47911Но мне не понятно: почему запрос с join пишется без "LEFT\RIGHT" и т.д.?Потому что это разные типы связывания: запрос с просто JOIN это полное связывание, а LEFT/RIGHT [OUTER] JOIN это "внешнее" связывание (все совпадающие плюс те для которых не нашлось совпадений). В первой книге Грабера они кажется не рассмотрены вообще. 47911 И почему он выдаёт 1 результат?(ищет 1 товар)А почему он должен выдавать несколько? 47911Я просмотрел через поиск слова join то, что по ссылке - вообще нет инфы(я конечно понимаю: есть другие источники, но в них с "доп. словом" используется этот оператор. А примера с "join" без 2 слова - не нашёл, и, как следствие, объяснения тоже).ээээ... да. Грабер писал о более раннем варианте SQL. Ключевое слово JOIN ввели в диалекте SQL-92. Надо брать более свежей учебник. Но начинать лучше с Грабера - он самый понятный хоть и частично устаревший. Получается: любое связывание - выдаёт 1 результат? Такое не подходит. . . Чую я: зря теряю время. . . ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2017, 21:50 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
47911Получается: любое связывание - выдаёт 1 результат?Любой отбор (оператор select) выдаёт один результат. А вот количество строк (рядов) этого результата зависит и от формы и параметров отбора. А ещё - от данных, на которых выполняется отбор. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2017, 00:48 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, Ок. Пошаманил, почитал кое-чего. Вышло: Код: sql 1. 2. 3. 4. 5. 6.
Теперь оно выдаёт список товаров из раздела 64. Только проблема: время выполнение варьируется от 4 до 10 секунд. Довольно жирно... Это самый мелкий(по количеству товаров) вариант. Как его оптимизировать так, чтобы было "минимальное время на выполнения"? 0 до 2429 - это ~15000 товаров выполняющихся в 6 потоков(запрос в базу на количество, и деление "количества товаров" на "Количество процессоров"). А планируется 1 000 000. Как ускорить? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2017, 10:19 |
|
Проблема: получить товар и его характеристики(атрибуты) максимально быстрым способом.
|
|||
---|---|---|---|
#18+
В посте номер 20707422 приведена строение базы, в спойлере. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2017, 10:21 |
|
|
start [/forum/topic.php?fid=54&msg=39503167&tid=2008492]: |
0ms |
get settings: |
12ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 257ms |
total: | 382ms |
0 / 0 |