Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Вниз

Select * from - порядок полей   Найти похожие ветки 

 
Ega23 ©   (2008-05-20 12:19) [0]

А вот такой вопрос: ежели я делаю Select * from Table, то в каком порядке мне будут возвращены поля?
Т.е. может ли произойти ситуация, что порядок колонок поменялся, а реально изменения в структуру БД не вносились?


 
Reindeer Moss Eater ©   (2008-05-20 12:43) [1]

а это так важно?
а если структура поменялась, а в датасете статик поля уже есть?


 
Ega23 ©   (2008-05-20 13:03) [2]


> а если структура поменялась


Как раз это и проверяю. Просто иначе в проверке лишний цикл получается. А так - чисто по Fields[i].


 
Reindeer Moss Eater ©   (2008-05-20 13:09) [3]

я про то, что могут быть статик филды от дизайнтайма.
количество имена и типы полей в структуре таблицы не поменялись, поменялись только их порядковые индексы.
Либо наеборот. в физической таблице вообще ничего не менялось, но мышкой потаскали поля в редакторе полей.

лучше всего получать их по именам, а не по индексам.


 
Ega23 ©   (2008-05-20 13:12) [4]


> лучше всего получать их по именам, а не по индексам.


Да это понятно. Просто не хочется в описательную структуру имена вносить...
Хотя, щас подумал, без них один фиг не обойтись.

Ладно, вопрос снят.


 
MsGuns ©   (2008-05-20 15:25) [5]

>Ega23 ©   (20.05.08 13:12) [4]
>Хотя, щас подумал, без них один фиг не обойтись.

Однако обойтись. Если строить объектную модель БД


 
Anatoly Podgoretsky ©   (2008-05-20 15:31) [6]

> Ega23  (20.05.2008 12:19:00)  [0]

Не надо работать с предположениями, за конструкцию * надо увольнять. Поля должны быть явно перечислены и столько, сколько нужно.


 
Reindeer Moss Eater ©   (2008-05-20 15:45) [7]

прямо так и увольнять.
99 полей в таблице и 3 поля созданных в редакторе полей в дизайне или явно на рантайме.
кому от этого будет плохо?


 
MsGuns ©   (2008-05-20 16:20) [8]

>Reindeer Moss Eater ©   (20.05.08 15:45) [7]
>99 полей в таблице

Вот за это уродство точно стрелять !


 
Anatoly Podgoretsky ©   (2008-05-20 16:32) [9]

> Reindeer Moss Eater  (20.05.2008 15:45:07)  [7]

Ну можно и не прямо, это же поговорка. Ну и что, что 99 полей, а кому сейчас легко? Хочешь что бы и серверу было плохо.
Для этого существуют псевдонаучные методы, называются Научная организация труда.
Ну нельзя так писать, звездочку можно использовать в отладке и только, иначе серверу хорошо не будет, звездочка заставляет каждый запрос анализировать с нуля, все планы побоку.


 
Anatoly Podgoretsky ©   (2008-05-20 16:33) [10]


> Вот за это уродство точно стрелять !

А я хотел только уволить, вот помните мою доброту.


 
Ega23 ©   (2008-05-20 16:36) [11]


> Ну нельзя так писать, звездочку можно использовать в отладке
> и только, иначе серверу хорошо не будет, звездочка заставляет
> каждый запрос анализировать с нуля, все планы побоку.


Мне нужно информацию по филдам получить, а не данные.
Соответственно, запрос будет выглядеть Select * from Table where 0=1


 
Ega23 ©   (2008-05-20 16:38) [12]

Т.е. я пустой НД получаю, но со структурой филдов и их типами. А дальше проверяю - так или не так.


 
Johnmen ©   (2008-05-20 16:53) [13]

Думается, будут идти в том порядке, в котором описаны в системной таблице.


 
Ega23 ©   (2008-05-20 16:57) [14]


> Думается, будут идти в том порядке, в котором описаны в
> системной таблице.


В общем, я тоже так думаю. Просто крайне интересно, по какому полю идёт OrderBy ?


 
Johnmen ©   (2008-05-20 17:01) [15]


> Ega23 ©   (20.05.08 16:57) [14]
>  Просто крайне интересно, по какому полю идёт OrderBy ?

Какой OrderBy??? :)


 
Reindeer Moss Eater ©   (2008-05-20 17:02) [16]

>99 полей в таблице

Вот за это уродство точно стрелять !


А что не так?


 
Reindeer Moss Eater ©   (2008-05-20 17:03) [17]

Кроме того, имелось ввиду совершенно иное, что вы не уловили.
физических полей N, филдов в датасете N.
N < M.

Используется звезда в запросе.
"Ну и чо"?


 
Reindeer Moss Eater ©   (2008-05-20 17:09) [18]

Мне нужно информацию по филдам получить, а не данные.
Соответственно, запрос будет выглядеть Select * from Table where 0=1


Ой бааалиииин...
select * from table без всяких where
+
FieldDefs.Update


 
Ega23 ©   (2008-05-20 17:30) [19]


> Ой бааалиииин...
> select * from table без всяких where
> +
> FieldDefs.Update


Гм... Пока не въехал, но чуть позже поэкспериментирую...


 
Ega23 ©   (2008-05-20 17:32) [20]


> Какой OrderBy??? :)


Такой. Описатели филдов в системной таблице хранятся? Хранятся. При составлении плана запроса оттуда выбираются? Выбираются. SQL при этом используется? А вот Х его З. Но если SQL - то Order By должОн быть.


 
Reindeer Moss Eater ©   (2008-05-20 17:39) [21]

Гм... Пока не въехал, но чуть позже поэкспериментирую...

FieldDefs.Update приводит к чтению метаданных с сервера и заполняет массив филддевсов экземплярами филддефов для каждого поля
с именами, типами явками и паролями.
данные при этом не фетчатся.


 
Ega23 ©   (2008-05-20 17:51) [22]


> FieldDefs.Update приводит к чтению метаданных с сервера
> и заполняет массив филддевсов экземплярами филддефов для
> каждого поля
> с именами, типами явками и паролями.
> данные при этом не фетчатся.


Ну, чай не совсем дурак, справку читать умею, да и в код слазил.  :)


 
MsGuns ©   (2008-05-20 18:28) [23]

>Reindeer Moss Eater ©   (20.05.08 17:02) [16]
>А что не так?

Все !

Представьте себе водительские права, в которых кроме ФИО, фотки и т.д., находится еще подробная биография, пионерские грамоты за учебу в школе, аттестат зрелости, медкарты с флюорокарточками, характеристики со всех мест, где работал и т.д.
Когда мне рассказывают о таблицах на 255 полей, я так и представляю себе веселую картинку, когда на требования гаишника предъявить права, водитель вытаскивает из багажника пару-тройку чемоданов с "данными".
Сколько работаю с базами, подобвых монстеров видел всего несколько раз и все они так или иначе родились от "гениальных" озарений их разработчиков запихивать ОДНОТИПНЫЕ данные в РАЗНЫЕ поля таблицы. Как пример, весьма часто встречающееся уродство из студпроектов, в которых все предметы, по которым есть оценки, запихиваются в одну запись с полями "Техмех", "Вышка", "Функанализ" и т.д. Ессно, для каждого курса (факультета, потока) свои "таблицы".
Вот учителей, которые учат ТАК делать, я б и поубивал. Насмерть !

И, наконец, одна аксиома - любой сервер прежде всего "точится" на оптимизацию поиска среди множества ЗАПИСЕЙ, но не ПОЛЕЙ !


 
MsGuns ©   (2008-05-20 18:30) [24]

>Ega23 ©   (20.05.08 17:32) [20]
>Описатели филдов в системной таблице хранятся? Хранятся. При >составлении плана запроса оттуда выбираются? Выбираются. SQL при этом >используется? А вот Х его З. Но если SQL - то Order By должОн быть.

Хранятся в той последовательности, в которой они были перечислены в соответствующем Create Table.
Странно, правда ?


 
Reindeer Moss Eater ©   (2008-05-20 18:37) [25]

У вас кругозор просто узок, если сложно представить сущность имеющую 99 атрибутов.

PS как я уже сказал, 99 - просто число взятое с потолка. В моих таблицах нет такого количества полей.
А суть поста, которую вы до сих пор не догнали, была в том, что статик филдов может быть три, в то время как физических полей таблицы будет триста три. И будет звезда в селекте и никому кроме вас печали от этого не будет.

фетча на клиента трехсот трех полей не состоится.


 
MsGuns ©   (2008-05-20 18:43) [26]

>Reindeer Moss Eater ©   (20.05.08 18:37) [25]
>У вас кругозор просто узок, если сложно представить сущность имеющую >99 атрибутов.

Дадад, я вот уже три десятка лет только телефонные справочники проектирую.

>А суть поста, которую вы до сих пор не догнали, была в том, что статик филдов может быть три, в то время как физических полей таблицы будет триста три. И будет звезда в селекте и никому кроме вас печали от этого не будет.

Более того, я вообще не догоняю, что такое "статик" поля. Это те, которые автоматически создаются при открытии в делфях например TTable и которые затем отображаются в окне редакторов полей ? Так я открою страшную тайну - у меня практически не бывает "статик" полей в твоем понимании (а если и есть, то это не поля таблицы, а поля возвращамого ХП или вьюхи датасета - надеюсь, ты в состоянии "догнать" между ними разницу ?)

Что касается самого "криминала", т.е. "политкорректности" использования конструкции Select *, то однозначного ответа быть не может, хотя в целом я бы скорее поддержал Анатолия, чем возражал бы ему.


 
Reindeer Moss Eater ©   (2008-05-20 18:45) [27]

Более того, я вообще не догоняю, что такое "статик" поля.

Тогда может погодить с тем чтобы спорить с пеной у рта и стрелять инакомыслящих?
Пока не прояснится что такое статик поля в датасете.


 
Reindeer Moss Eater ©   (2008-05-20 18:48) [28]

Пример с паспортом и правами содержащими грамоты из пионерлагеря за первое место на стометровке - это в детский сад такие примеры.

Я говорю про сущности имеюшие атрибуты зависящие только от PK.
И нигде не сказано, что если мсганс не видел их больше двадцати, то их и нет на самом деле и в принципе не может быть.


 
sniknik ©   (2008-05-20 18:51) [29]

> Т.е. я пустой НД получаю, но со структурой филдов и их типами. А дальше проверяю - так или не так.
правильнее информацию о структуре получать через OpenSchema.


 
MsGuns ©   (2008-05-20 19:00) [30]

>Reindeer Moss Eater ©   (20.05.08 18:48) [28]
>Я говорю про сущности имеюшие атрибуты зависящие только от PK.

 Глупости ! Ты говоришь не о сущностях, а о ПРЕДСТАВЛЕНИИ СУЩНОСТЕЙ в клиентском приложении. А это вовсе не одно и то же.

>И нигде не сказано, что если мсганс не видел их больше двадцати, то их и >нет на самом деле и в принципе не может быть.

Ты, конечно, можешь всю информацию об предмете автоматизации запихнуть в одну таблицу с 10000 полями. Трудно, но можно. Ветер, как говорится, вдогонку.


 
Reindeer Moss Eater ©   (2008-05-20 19:13) [31]

Да неважно о чем я говорю и как это называется на самом деле.
Могут быть атрибюты и их может быть 99.

Могут быть другие случаи.

Те же грамоты из садика.
Если их много и они не участвуют в реляционных отношениях, то мудрый гудвин обязательно смастерит отдельную таблицу для "грамот из садика" во имя нормализации.
А действительно опытный разработчик вполне может хранить все их скопом в одном поле в той же таблице что и самого пионера.

первый во имя нормализации ничего кроме усложнения обработки данных  и лишних запросов не получит (плюс тормозов с этим связанных)
Второй ничего не потеряет.

впрочем мы отвлеклись.
конституция не ограничевает количество атрибутов у сущности и количество полей в таблице тоже.


 
Reindeer Moss Eater ©   (2008-05-20 19:18) [32]

Ты, конечно, можешь всю информацию об предмете автоматизации запихнуть в одну таблицу с 10000 полями. Трудно, но можно. Ветер, как говорится, вдогонку.

У кого такие психологические трудности с 10000 полями?
У меня их нет.
Так же как и с десятью таблицами по тысяче полей или сотней таблиц с сотней полей.


 
MsGuns ©   (2008-05-20 19:20) [33]

>А действительно опытный разработчик вполне может хранить все их скопом >в одном поле в той же таблице что и самого пионера.

Реально "грамотный" разработчик так делать в большинстве случаев не будет. Ибо знает, к чему это приведет.


 
Reindeer Moss Eater ©   (2008-05-20 19:20) [34]

И к чему же это приведет?


 
MsGuns ©   (2008-05-20 19:24) [35]

Напрмер, к потере 1-й степени нормализации - атомарности.
Хватит ?


 
Reindeer Moss Eater ©   (2008-05-20 20:29) [36]

И кому от этого худо?

Серверу, которого никто не будет лишний раз насиловать дополнительным запросом?

Разработчику? Который получает все "грамоты садика" одним запросом вместе с самим пионером и не организует циклы на клиенте после получения их списка с сервера?

Никому.


 
Reindeer Moss Eater ©   (2008-05-20 20:31) [37]

Я уже не говорю про случай, когда по условиям предметной области все эти многочисленные грамоты вообще логически являются атомарными. Все целиком вместе взятые.


 
MsGuns ©   (2008-05-20 20:44) [38]

"Я не буду с тобою спорить, старый софист" (c) ;)


 
Anatoly Podgoretsky ©   (2008-05-20 21:13) [39]

> Ega23  (20.05.2008 16:38:12)  [12]

А чего ни будь приличное использовать не хочешь, например OpenScheme


 
Anatoly Podgoretsky ©   (2008-05-20 21:20) [40]

> Ega23  (20.05.2008 17:32:20)  [20]

Не обязан, если мне порядок не важен, то зачем мне заставлять делать сервер лишнею работу.


 
Anatoly Podgoretsky ©   (2008-05-20 21:21) [41]

> MsGuns  (20.05.2008 18:30:24)  [24]

Я бы не стал на это закладываться, это сугубо внутреннее дело сервера, как хранить и как выдавать, если ему это явно не сказано.


 
MsGuns ©   (2008-05-20 21:37) [42]

>Anatoly Podgoretsky ©   (20.05.08 21:21) [41]

Анатолий, ни я, ни 99% пользователей скл-серверов не скажут, ГДЕ именно он хранит описания полей, да и вообще все свои метаданные. Да и не надо нам это. Известно лишь, что в системных таблицах. А вот как (в каком порядке) он их ПРЕДСТАВЛЯЕТ по требованию клиента (в частности по указанному сникником запросу) - это уже мы могем и проверить ;)


 
Anatoly Podgoretsky ©   (2008-05-20 22:44) [43]

> MsGuns  (20.05.2008 21:37:42)  [42]

Можем, ну и что?
Напомнить точно такие же речи, про значение переменной цикла по его окончания, тоже проверяли.
Это внутреннее дело сервера и совсем не обязательно, что другая редакция сервера будет работать точно также.


 
Ega23 ©   (2008-05-21 10:16) [44]


> А чего ни будь приличное использовать не хочешь, например
> OpenScheme


Может и хочу. Я пока ещё не определился. Эта работа следующим этапом будет, я сейчас "почву зондирую"...


 
Anatoly Podgoretsky ©   (2008-05-21 10:25) [45]

> Ega23  (21.05.2008 10:16:44)  [44]

Вопрос не полностью освещен, но OpenScheme это минимальный деноминатор (костыль в АДО), а правильно использовать INFORMATION_SCHEME - это и по стандарту и не зависит от технологий, и возможности пошире. Это полные метаданные по всей базе и работать с ними просто, без отличия от обычной работы, просто SELECT


 
ANB   (2008-05-21 11:37) [46]

Насчет использования * и расстрела.

declare
 R_Table1 Table1%rowtype;
begin
 select * into R_Table1 from Table1 where ID = p_ID;
 ...
 Дальнейшее использование записи из таблицы Table1
 ...
end;

Разве тут * - не самое уместное решение ?


 
Игорь Шевченко ©   (2008-05-21 13:01) [47]


> Разве тут * - не самое уместное решение ?


дурное дело нехитрое


 
ANB   (2008-05-21 14:31) [48]


> дурное дело нехитрое

Предложи недурной вариант.


 
Игорь Шевченко ©   (2008-05-21 22:26) [49]

ANB   (21.05.08 14:31) [48]


>
> Предложи недурной вариант.


Не могу - не знаю задачи.

Видел много разных вариантов, когда для того, чтобы достать значение одного поля, объявляли конструкцию [46], при этом вместо таблицы использовалось view с соединением 6 таблиц. Разработчик поступил, "как ему проще" - есть готовое view, значит его надо использовать. А то, что выполняться это будет на порядок дольше - ну и фиг с ним.
Я всегда, видя select * практически в любой интерпретации, будь то в серверной части, будь то в клиентской, хватаюсь за пистолет.


 
palva ©   (2008-05-21 23:39) [50]


> А я хотел только уволить, вот помните мою доброту.

Это не доброта, это попытка нанести ущерб конкурирующей фирме.


 
Petr V. Abramov ©   (2008-05-22 00:29) [51]


> Игорь Шевченко ©   (21.05.08 22:26) [49]


> хватаюсь за пистолет.

спили мушку :)))
в ситуации, когда 99 полей, и  из них нужно 98, самое оно.
но такое бывает редко.
так что в принципе согласен.
но все же мушку в данном вопросе на всякий случай лучше спилить :)))


 
Германн ©   (2008-05-22 01:07) [52]


> Игорь Шевченко ©   (21.05.08 22:26) [49]

> хватаюсь за пистолет.

Хм. Игорь, это высказывание дурно попахивает некоей цитатой периода второй половины 30-х годов прошлого века!
:)


 
Anatoly Podgoretsky ©   (2008-05-22 07:43) [53]

> Petr V. Abramov  (22.05.2008 00:29:51)  [51]

Это просто оправдание лени.


 
ANB   (2008-05-22 11:50) [54]


> Игорь Шевченко ©   (21.05.08 22:26) [49]

Даже если надо достать только 20 полей записи, такое написание уже сильно сокращает код - нужна только одна переменная.
При этом частенько заранее неизвестно, сколько точно полей тебе понадобится.

Писать правильно - значит писать быстро и наоборот.


> при этом вместо таблицы использовалось view с соединением
> 6 таблиц

Ты же сам ратовал за использование вьюх и FGA


 
ANB   (2008-05-22 11:51) [55]


> Это просто оправдание лени.

Хороший программист - ленивый программист. :)


 
Ega23 ©   (2008-05-22 12:19) [56]

Тут вот какое дело: как говорил выше, делаю проверку структуры БД на соответствие релизу.
Соответственно, может сложиться такая ситуация, что в предыдущем релизе в таблице было 10 полей, а в новом - 8 (2 поля тупо были удалены). Если я буду проверять наличие конкретных 8 полей, то всё сработает "на ура" - эти поля есть, типы данных совпадают и т.п.
А вот если Select * from, то тогда я ещё и "лишние" поля получу (и буду знать, что их надо грохнуть).

Это как пример

З.Ы. Я прекрасно понимаю, что "можно все сделать по-другому". Например задать в условиях проверки удаленные столбцы с предыдущего релиза. Или через схему.
Я тупо пример привёл.


 
Игорь Шевченко ©   (2008-05-22 12:24) [57]

ANB   (22.05.08 11:50) [54]


> Даже если надо достать только 20 полей записи, такое написание
> уже сильно сокращает код


Ну я же говорю - рука тянется к пистолету. Сокращение кода не есть самоцель.


> Писать правильно - значит писать быстро и наоборот.


Почему я работаю и моя работа оценивается - потому что остальные в нашей области "пишут быстро".


> Ты же сам ратовал за использование вьюх и FGA


"Всякий овощ приносит пользу, будучи употреблен надлежащим образом в надлежащее время".

В первую очередь я ратую за неизобретение велосипедов с четырьмя квадратным колесами - они, если и едут, то очень медленно, и сидеть на них во время езды больно.


 
Игорь Шевченко ©   (2008-05-22 12:26) [58]

Ega23 ©   (22.05.08 12:19) [56]


> Тут вот какое дело: как говорил выше, делаю проверку структуры
> БД на соответствие релизу.


Версию структуры базы данных хранить и проверять религия не позволяет ?


 
Ega23 ©   (2008-05-22 12:29) [59]


> Версию структуры базы данных хранить и проверять религия
> не позволяет ?


Позволяет, это первое было, что я предложил. Но вот начальство говорит, что этого недостаточно (и, в общем-то, аргументировано говорит).


 
ANB   (2008-05-22 12:45) [60]


> Но вот начальство говорит, что этого недостаточно (и, в
> общем-то, аргументировано говорит).

Правильно говорит. Но :
В любом случае намного надежнее прогулятся по словарю. Все достаточно тривиально как в оракле, так и в мс скл. Одна проблема - где хранить эталлонную структуру. Но это уже рабочий вопрос.


 
Игорь Шевченко ©   (2008-05-22 13:05) [61]

Ega23 ©   (22.05.08 12:29) [59]

А какие аргументы приводит начальство ? А то мы как-то справляемся версией, хотя изменения в структуре тоже наличествуют...


 
ANB   (2008-05-22 14:42) [62]


> А то мы как-то справляемся версией, хотя изменения в структуре
> тоже наличествуют...

На одной моей работе я писал систему тестирования. Так вот одним из требований было проверять качество инсталляции версии.
Согласовали, что если структура данных и обязательные строки в справочниках совпадают с эталлоном, то все Ок. И таки раз в месяц эта штука ошибки инсталлятора для апгрейда версии ловила. То констрейнт забудут, то индекс, то поле. То назовут немного не так. И при этом у клиента и у базы проверялась версия. Кажный раз при старте.


 
Игорь Шевченко ©   (2008-05-22 14:59) [63]

ANB   (22.05.08 14:42) [62]

"Кривое не может сделаться прямым".  (Еккл. 1, 16)

Встраивать механизм ловли огрехов разработчика на площадке заказчика - это слишком, гораздо проще организовать тестирование у разработчика, а у заказчика нехай программа падает с фейреверком максимальной яркости, разработчику проще будет понять причину.



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.006 c
2-1225477915
RichEdit
2008-10-31 21:31
2008.12.14
Из RichEdit в Word


15-1223518108
Slider007
2008-10-09 06:08
2008.12.14
С днем рождения ! 9 октября 2008 четверг


15-1223383650
boriskb
2008-10-07 16:47
2008.12.14
ОДКБ


2-1225990509
cruiser
2008-11-06 19:55
2008.12.14
MessageDlg и иконки


4-1202161064
GanibalLector
2008-02-05 00:37
2008.12.14
RAS, TAPI или WinApi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский