Вопрос читателя: Извините, если злоупотребляю Вашим вниманием, но как-то не получается у меня найти ответы на свои вопросы на всевозможных форумах. А может я их просто не умею задавать.
Может Вы меня наведете на правильную концепцию в вопросе сортировки данных.
За много лет работы я сроднился с dBase и до сих пор ассоциирую сортировку таблицы с соответствующим тегом, принадлежащего ей компаундного индекса. Видимо от того и теряюсь.
Простой пример:
MS SQL -> microORM -> класс, соответствующий структуре выбираемой таблицы -> компонент DataGridView, принявший информацию и отсоединенный от источника данных.
Т.е. в итоге получается, что остаюсь один на один с элементом, который на мой взгляд (возможно и ошибочный), представляет собой некий визуальный вариант массива. Далее я вижу два способа сортировки:
а) Использовать метод Sort компонента. Я познакомился с вариантами реализаций интерфейса IComparer и что-то мне подсказывает, что вся эта кухня сводится к полному обходу строк массива с поэлементным сравнением. Переставляются ли данные в текущем массиве или создается его копия, в дальнейшем заменяющая оригинал- это не так уж важно. Никакой оптимизацией (в связи с отсутствием индексов) здесь и не пахнет.
б) Просто еще раз обратиться к серверу и к Select * From … добавить Order By, получив отсортированный набор данных. Такой вариант мне нравится не в пример лучше.
Но в любом случае смущают две вещи.
Во-первых, каждая подобная сортировка- это создание нового массива. А если это внушительный набор информации? Насколько быстро он будет получен? Как-то пока не приходилось экспериментировать с большими объемами данных.
Во-вторых, следует из «во-первых». Я создаю новую строку в отсортированном списке. Само собой неплохо было бы, чтобы CurrentRow не осталась внизу, а заняла свое место в соответствии с условиями сортировки. DataGridView.Sort(…) по окончании ее ввода наведет порядок, но ведь это очередной перебор всего массива. И все из-за одной строки.
Да, наверное, можно завести промежуточный источник данных в виде BindingSource, воспользоваться его методами, но уж больно не хочется заводить этого посредника и учитывать его в работе.
Если мне не изменяет память, .NET использует быструю сортировку https://ru.wikipedia.org/wiki/Быстрая_сортировка, просто он не умеет сравнивать абсолютно любые данные и поэтому ему нужно подсказывать, как сравнивать элементы. Для этого и сознан интерфейс IComparer. Эта сортировка достаточно быстрая и не сильно требовательна к памяти, так что я бы не особо заморачивался, а доверился ей.
Индексы конечно же эффективнее и когда ты все время сортируешь по одной и той же колонке (колонкам), то лучше создать их. Лучше ли каждый раз обращаться к базе данных? Ну тут зависит от объема данных. Что быстрее - отсортировать в программе или отправить на сервер? Ведь отправка запроса на сервер тоже займет время, ему нужно будет обработать запрос, найти данные (по индексу это будет почти мгновенно), вернуть обратно, создать новый массив, отмапить данные…. Все зависит от количества данных и конкретного случая. Иногда я выбираю сортировку на клиенте, особенно, когда нет необходимости делать страничный вывод. Если есть страничный вывод данных, то тут уже приходится делать только серверную.
В базе индексы должны быть для увеличения скорости поиска, а не сортировки.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку уже лайкнули 1 человек
Imo все зависит от того какая бд используется, сколько данных выкачивается и какие ресурсы доступны на бд/приложении. Иногда сортировка вообще невозможна просто из-за ограничений таблиц и бд, что является частым явлением в шардированных средах вроде кассандры. Иногда данных слишком много, но и шардов много, значит может бы выгоднее отсортировать в приложении если в нем есть ресурсы (может даже спарк)
Если же речь о 10 строках в постргресе то наверно нет смысла и можно все сразу в бд отсортировать.
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.