Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL [D7, XP]


Страницы:   1 2 3

Alex Ford ©   (2008-05-21 14:54:00) 

Привет!

Давно не работал с SQL. Простые вещи из головы вылетели.
Мастера напомните пожалуйста
Здесь мы получаем все данные полей таблицы
 form1.Query1.SQL.Add('select * from "DataBase.db"');

Как получить конкретное значение, указанное в Edit1 таблицы конкретного плояуказанной таблицы


Anatoly Podgoretsky   (2008-05-21 16:45:00) [21]

Ну я не могу говорить конкретно об Оракле.
А вот в общем случае говорить можно.
А покрывающий индекс может весьма повысить производительность, что у тебя и происходит. У меня такое же наблюдается и на MS SQL покрывающий индекс позволил повысить производительность примерно раз в 60.


ANB   (2008-05-21 16:34:00) [22]


> Я себе позволяю звездочку только при отладке запроса

Ну, в принципе, я тоже. За исключением работы с ROWTYPE. Тут уж * - самое удобное. И код не ломается, если структура поменялась.

Да. Чет мне говорит, что в оракле озвученная проблема со * менее актуальна. Оракл с 9-ки даже начал пытаться непараметризованные запросы пытаться приводить на лету к параметризованному виду. Правда, не очень успешно.

А вот у меня есть клевый пример, когда * сильно повлияет на производительность.

Имеем таблицу

Table1
(
 ID,
 DocDate,
 DocSum
)

Имеем индекс
create index Table1_DateSum on (DocDate, DocSum)

Хотим : получить суммы документов за день.

Так вот запросы

select * from table1 where DocDate = :DocDate

и

select DocSum from table1 where DocDate = :DocDate

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


Anatoly Podgoretsky   (2008-05-21 15:50:00) [23]

> Alex Ford  (21.05.2008 15:42:24)  [24]

Ну так сожержимое эдит мы видимо никогда не увидим.
Запрос правильный, может только квадратные скобки лишнии, а проблема в данных.


Anatoly Podgoretsky   (2008-05-21 15:49:00) [24]

> ANB  (21.05.2008 15:34:22)  [22]

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


Alex Ford   (2008-05-21 15:42:00) [25]

Спасибо всем!

так никто толком не объяснил на нормальном языке. Кроме ANB - спасибо тебе за внимание и поддержку!

эх......


ANB   (2008-05-21 15:35:00) [26]


> В Edit пытаюсь указать условие выборки. Скажем так.

пробел в строку после where добавь.


ANB   (2008-05-21 15:34:00) [27]


> А это реально, напишет такую фигню и распространит например
> по институту и все приплыли.

Да уже написано уже такой фигни целая куча.
Ясный пень, что явный список - лучше * (правда, не всегда, но это - отдельная тема). Правда я пишу списки не для разгрузки сервера, а чтобы потом самому понятно было - откуда я чего тяну. Плюс, если конечный запрос содержит * и набору данных едет уже на клиента, то могут быть глюки при изменении структуры БД, которые легко обнаруживаются если список указать явно.
Однако с точки зрения производительности намного опаснее непараметризированные запросы. Вот они точно забьют весь процедурный кеш.

Кстати, где ты откопал, что запрос со * перепарсивается кажный раз ? Хэш то вроде как не меняется.


Anatoly Podgoretsky   (2008-05-21 15:32:00) [28]

Скажем как?


Sergey13   (2008-05-21 15:32:00) [29]

> [19] Alex Ford   (21.05.08 15:30)
> Скажем так.

А ты не говори загадками - ты конкретно напиши.


Alex Ford   (2008-05-21 15:30:00) [30]

В Edit пытаюсь указать условие выборки. Скажем так.


ANB   (2008-05-21 15:29:00) [31]


> Что не парвильно пишу?
> form1.Query1.SQL.add('select [TabNo] from "DataBase.db"
> where'+ edit1.Text);

Все.

Составь сначала запрос в среде выполнения запросов для своей субд, добейся его работы, а потом пихай в делфи и наворачивая свои эдиты.


Sergey13   (2008-05-21 15:28:00) [32]

> [12] Alex Ford   (21.05.08 15:19)
> form1.Query1.SQL.add('select TabNo from "DataBase.db" where'+ edit1.Text);

А что у тебя в edit1.Text?

> [13] Anatoly Podgoretsky ©   (21.05.08 15:20)

Вот я и подивился долголетию. 8-)


Alex Ford   (2008-05-21 15:26:00) [33]

Ребят, может укажите где ошибка в коде?
Что не парвильно пишу?
form1.Query1.SQL.add('select [TabNo] from "DataBase.db" where'+ edit1.Text);


Anatoly Podgoretsky   (2008-05-21 15:25:00) [34]

> ANB  (21.05.2008 15:13:11)  [11]

Это образное выражение, означает, что сервер будет вынужден заниматься не нужной работой, от самой начальной подготовки и до конца.
И не один раз, как ты пишешь, а каждый раз и именно * и заставит это делать. Ему же надо эту звездочку, как минимум преобразовать в список полей, провести разборку и возможно построить новый план, ну и мало ли что еще сделать, от сервера зависит. А если еще и условие будет с постоянно меняющимся литералом, как это принято у начинающих - звездочка и литерал (динамический запрос). Конечно одиночный запрос не поставит на колени в прямом виде, но заставит немного попотеть, а если на сервер накинутся сотни таких запросов одновременно, а если тысячи? А это реально, напишет такую фигню и распространит например по институту и все приплыли.


Palladin   (2008-05-21 15:24:00) [35]


> Alex Ford   (21.05.08 15:19) [12]

чета за метлой пора... )


Anatoly Podgoretsky   (2008-05-21 15:20:00) [36]

> Sergey13  (21.05.2008 15:10:10)  [10]

А разве это можно забыть?
Мозно забыть только то, что не знал.


Alex Ford   (2008-05-21 15:19:00) [37]

чёта не работает....


 form1.Query1.Active:= false;
 form1.Query1.SQL.Clear;
 form1.Query1.SQL.add('select TabNo from "DataBase.db" where'+ edit1.Text);
 form1.Query1.Active:= true;
 form1.Query1.Open;


ANB   (2008-05-21 15:13:00) [38]


> А для большинства серверов ты этим ставишь сервер на колени.

Да ладно. Прям уж таки * на колени поставит.

Намного скорее поставит нестед лупс по 15 миллионам записей. Да еще в связке с таблицами, в которых под миллиард записей.

А * - при разборе запроса раз обработается, в процедурный кэш запишется и всех делов то.


Sergey13   (2008-05-21 15:10:00) [39]

> [0] Alex Ford   (21.05.08 14:54)

Долго же ты не работал с SQL, если такие вещи забыл? 8-)
Запрос конретизируется с помощью секции
WHERE условия
Если сначала вытаскивается все на клиента, имеет смысл фильтровать результат, а не перезапрашивать БД.


ANB   (2008-05-21 15:09:00) [40]


> Alex Ford   (21.05.08 15:05) [4]

У тебя в таблице всего одно поле ?

> все перемешалось в голове

Не, ты не SQL забыл. А принципы работы с БД. Тут SQL не всегда нужен.

В принципе все просто :

select список_полей_через_запятую from имя_таблицы where условие_по_которому_отбирать_записи

Ну эт если  таблица одна. А если таблиц много, то . . .  То лучше сначала почитать книжки.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо