Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1

Что быстрее SELECT * или SELECT [поля]?

03.11.2022, 15:35. Показов 2311. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
MS SQL сервер
Имеется рабочая БД. Дикий легаси.
Приходится работать с ней.
В ней имеется динамическая таблица примерно на 600-700 столбцов
Прога пишется в Builder С++ и сами данные получаю через TADOQuery

Тип полей BIT. Причём в столбец данных состоит только из одного элемента (грубо говоря параметр - его значение).
Code
1
2
k1_540  k1_541  k1_542  k1_543  k1_544  k1_545  k1_546  k1_547  k1_548  k1_549  k1_55   k1_550  k1_551  k1_552  k1_553  k1_554  k1_555  k1_556  k1_557  k1_558  k1_559  k1_56   k1_560  k1_561  k1_562  k1_563
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
И вот из этой фигни мне надо выбрать порядка сотни полей.
Сейчас да, заполняю SELECT [список_полей]. Сами данные потом закидываются в std::map и порядок полей мне не важен.
Возник вопрос - а будет ли быстрее выполняться запрос если я получу сразу все поля через SELECT * ?
Объём пересылаемых данных особо не важен - доступ к БД только из гигабитной локалки.
Тормоза на стороне клиента так же не важны - это уже мои проблемы и std::map может быть заменён на что либо другое - сейчас пока костяк пишется.

Запрос выполняется редко, но в будущем может идти по таймеру, например раз в минуту.

З.Ы. Просьба не пинать, если вопрос покажется тупым. С SQLем имел дело в начале 2000х, и то в виде Clipper`а.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2022, 15:35
Ответы с готовыми решениями:

Создать триггер, чтоб выводились поля (SELECT)
Хелп, есть БД, в ней несколько таблиц, нужно создать триггер который будет выводить поля из разных таблиц

Что быстрее: DLookUp или SQL SELECT
Здравствуйте! Функция: DLookUp("";"tblACad_Object";" = " & 18) и запрос: SELECT tblACad_Object.Наименование FROM tblACad_Object ...

Php+mysql что будет если запрос SELECT выполнится быстрее чем UPDATE (в разных потоках)
Ребята. Вот объясните мне пожалуйста. Может ли быть такое?: Предположим, что открылось 2 потока одновременно (2 юзера открыли...

32
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
08.11.2022, 14:55  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Что проще обработать клиентом, то бишь вами как программистом? Класс с двумя полями и коллекцией на основе его, или что-то непонятное из 600-700 полей?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
try{
    SQL_Query->SQL->Clear();
    SQL_Query->SQL->Add("SELECT * FROM [TM_Config].[dbo].[##tm_DinD]");
    SQL_Query->Open();
 
    mm.clear();//сюда будем закидывать результаты
    SQL_Query->First();
 
    //перекидываем данные в map
 
    for( i=0; i<SQL_Query->FieldDefList->Count; i++ )
        mm.insert({s =SQL_Query->FieldDefList->FieldDefs[i]->Name, SQL_Query->FieldByName(s)->AsVariant});
 
    SQL_Query->SQL->Clear();
    SQL_Query->Close();
}
Где тут проблемы или сложности для меня? И так и так в std::map<> искать нужное поле, которое формируется по определённому алгоритму.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,768
Записей в блоге: 4
08.11.2022, 15:10
drfaust, А разу получить готовую коллекцию не проще? И потом уже с ней творить что надо?
C#
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
public async Task<List<Country>> GetCountriesAsync()
{
    List<Country> countries = new List<Country>();
    string sqlText =
        "SELECT ID_HRDCountry, Country, IsForeigner " +
        "FROM dbo.tblHRDCountry " +
        "ORDER BY Country";
 
    try
    {
        using (SqlConnection sqlConnection = new SqlConnection(_connectionString))
        {
            await sqlConnection.OpenAsync();
 
            using (SqlCommand sqlCommand = new SqlCommand(sqlText, sqlConnection))
            {
                using (SqlDataReader sqlDataReader = await sqlCommand.ExecuteReaderAsync())
                {
                    if (sqlDataReader.HasRows)
                    {
                        while (await sqlDataReader.ReadAsync())
                        {
                            countries.Add(new Country
                            {
                                CountryID = (int)sqlDataReader["ID_HRDCountry"],
                                Name = (string)sqlDataReader["Country"],
                                IsForeigner = (int)sqlDataReader["IsForeigner"]
                            });
                        }
                    }
                }
            }
        }
 
        return countries;
    }
    catch (Exception ex)
    {
        throw new ApplicationException("Ошибка загрузки списка стран.", ex);
    }
}
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
08.11.2022, 15:21  [ТС]
Ну и чем проще у тебя - ты закидываешь данные в список, а я в контейнер, и только затем мы с этими данными работаем.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,768
Записей в блоге: 4
08.11.2022, 15:28
drfaust, Я делаю сразу типизированную коллекцию во время чтения из БД, в которую сразу попадают нужные поля таблицы в нужные поля класса.
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
08.11.2022, 16:04  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Я делаю сразу типизированную коллекцию во время чтения из БД, в которую сразу попадают нужные поля таблицы в нужные поля класса.
А у меня что?
Я же говорил, что из себя представляет таблица. Тупой набор поле-значение. В той таблице, что я приводил в качестве примера, k1_541 == NULL, k1_542 == true, k1_543 == false и всё - четвёртого не дано, нескольких значений быть не может. Сделано в древности так, что название параметра является именем столбца. По хорошему должны были делать так:
Code
1
2
3
4
5
 #    Parameter       |     Value
     _______________________
1     k1_541          |     NULL
2     k1_542          |     true
3     k1_543          |     false
Но сделали так, как сделали. Потому и возник вопрос, что лучше - перечислить сотню столбцов в select или же выбрать всё, что есть черпез select * (благо в MS SQL ограничение по кол-ву столбцов 1024, если не вру, и проблем с памятью на клиенте не возникнет). Тем более их всё одно надо закидывать в к-то локальное хранилище и работать уже с ним, причём из разных мест.

Т.е. тупо пары - название параметра и его текущее значение - всё...

З.Ы. По смыслу k1_*** - это текущее значение "аварии", true - есть авария по этому параметру, false - нет, всё пучком, NULL - соответственно не можем узнать (такой параметр объект не предоставляет(просто его нет физически) или нет связи с объектом).
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,768
Записей в блоге: 4
08.11.2022, 16:11
drfaust, Хммм, вот в примере у вас адекватная таблица, как и должна быть А вот такой вопрос, у вас ведь это временная таблица насколько я понял, судя по имени ##tm_DinD. Если это так, то делается она запросом, дак может просто переделать это запрос в адекватный вид? И читать обыкновенную таблицу с двумя полями?
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
08.11.2022, 16:21  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Если это так, то делается она запросом, дак может просто переделать это запрос в адекватный вид?
Да, это динамическая таблица, ну или временная - х.з. как правильно называть Я только вспоминаю SQL после 20-летнего перерыва.
А вот что бы её переделать в адекватный вид нужно переписать тонны кода на Delphi-6. Чем собственно и занимаемся. Уже по тихоньку разрабатывается новая структура всей БД, заодно и код переписывается.

Мне нет разницы как запихивать данные в std::map - изменил запрос и дело с концом. Тем более, что все запросы, в прогах собираюсь по макимому выкинуть в конфигурационные файлы. Тогда изменения в БД (при переходе со старой на новую), по большей части сведуться к редактированию конфигов программы.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,768
Записей в блоге: 4
08.11.2022, 16:27
Цитата Сообщение от drfaust Посмотреть сообщение
А вот что бы её переделать в адекватный вид нужно переписать тонны кода на Delphi-6
Дак эти таблицы создаются на стороне сервера вроде как... Скорее всего она создаётся какой-то хранимкой...
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
08.11.2022, 16:36  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Скорее всего она создаётся какой-то хранимкой...
А клиенты которые её читают?
Другую таблицу-дубликат делать смысла не вижу. Скорее всего в новой БД постараемся вообще без подобных вещей обойтись.
Тонны древнего говна мамонта на дельфятине-6й - тронь что в старой БД - что то да отваливается. Там даже один лишний аварийный дискрет ввести в БД проблема.
0
139 / 105 / 36
Регистрация: 27.07.2022
Сообщений: 360
08.11.2022, 16:36
Что-то у меня такое подозрение, что времени на обсуждение этой оптимизации потрачено в разы больше, чем она потенциально могла бы сэкономить.
В общем-то, наверное можно было бы уже взять и попробовать оба варианта и сравнить время выполнения
1
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
08.11.2022, 16:49  [ТС]
Ну я то уже выбрал вариант select * при разговоре с invm. Тем более это только на пару-лут лет, надеюсь мы справимся за этот срок и избавимся от 20летнего легаси везде.

Просто думал, что может ещё кто подключится и научит правильно пользоваться SQL`ем
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,768
Записей в блоге: 4
08.11.2022, 16:55
Цитата Сообщение от drfaust Посмотреть сообщение
А клиенты которые её читают?
Может у сервера задача настроена делать эту таблицу по времени...
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
08.11.2022, 17:03  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Может у сервера задача настроена делать эту таблицу по времени...
Я точно не могу сказать, но таблица вроде из дельфятины создаётся. Проги-сервера, которая опрашивает оборудование, и пишет в БД все изменения. Тут я не могу сказать.
По крайней мере изменения от физ. объекта до БД доходят за ~ 40-50сек (раньше, до оптимизации на уровне OPC-серверов) было около 2 минут. Но это никак не касалось БД. В будущем пробиваем резервный канал связи у начальства, и цикл опроса сократиться чуть ли не до секунды. В этом году запрос на закуп железа порезали. Потому пока по прежнему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2022, 17:03

Select в select или другой способ решения
Необходимо написать запрос. В таблице Info хранится Имя пользователя. Связана таблица с таблицей Users по ID_Users. В таблице Chat....

Как быстрее будет работать SELECT для 100 млн строк
Есть 100 миллионов строк, как быстрее будет работать выборка: 1) Загнать их все в 1 таблицу 2) Разделить их по разным таблицам (по...

Как вытащить во вложенном SELECT запись, используя Текущий код внешнего SELECT?
Есть такие таблицы, все поля описывать не буду, главное связи: Главная, тут просто все - свой код + 2 связи на таблицы классификаторы....

Преобразование результатов запроса SELECT в массив, для сравнения внутри другого SELECT
Доброго времени суток! Подскажите, пожалуйста - есть ли возможность результат работы оператора SELECT вставить в качестве массива...

Сохранить результат Select в перемнную. Один Select - 3 цикла
Существует ли возможность в pl sql сохранить результат select'а в переменную для последующего использования? Конкретно в моём случае один и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru