where по нескольким таблицам

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
londinium
Сообщения: 27
Зарегистрирован: 17 апр 2006, 14:04

where по нескольким таблицам

Сообщение londinium » 20 дек 2006, 19:21

Здравствуйте, Господа!

Есть такой вопрос. Имеется набор таблиц

Код: Выделить всё

CREATE TABLE REFEQUIPMENTTYPE (
    ID           INTEGER NOT NULL,
    DESCRIPTION  VARCHAR(150)
); //тип оборудования

Код: Выделить всё

CREATE TABLE REFROOMS (
    ID      INTEGER NOT NULL,
    NUMBER  VARCHAR(15)
);//комнаты, где стоит оборудование

Код: Выделить всё

CREATE TABLE EQUIPMENT (
    ID              INTEGER NOT NULL,
    ACCOUNTNUMBER   INTEGER NOT NULL,//номер счета
    INVENTARNUMBER  INTEGER DEFAULT 0 NOT NULL,
    TYPEEQ          INTEGER NOT NULL,
    DESCRIPTION     VARCHAR(100) NOT NULL,
    WORKER          INTEGER NOT NULL,
    PLACE           INTEGER NOT NULL,
    STATUS          INTEGER NOT NULL
);//таблица "Оборудование"

индексы

Код: Выделить всё

create index AccountIndex on equipment(AccountNumber);
create index InventarNumberIndex on equipment(InventarNumber);

Чтобы получить на клиенте красивую табличку по номеру счета пишу так:

Код: Выделить всё

select equipment.inventarnumber,equipment.description,refequipmenttype.description,refrooms.number
 from equipment,refequipmenttype, refrooms
  where equipment.accountnumber=104 
            and equipment.place =refrooms.id
            and equipment.typeeq =refequipmenttype.id;

Вопрос: можно ли запрос переписать красивее и быстрее. Сейчас его выполнение занимает по данным IBExpert'a 10 мс. И если можно, то как? Для разработки использую FireBird SS 1.5.3. Эксплуатироваться база будет на FireBird Embedded

С уважением, Londinium

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 20 дек 2006, 19:29

Сейчас его выполнение занимает по данным IBExpert'a 10 мс. И если можно, то как?
это шутка? чем не устраивает 10 миллисекунд? Хочется 10 наносекунд?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 20 дек 2006, 20:33

Если по полям ID таблиц есть PrimaryKeys, то ничего дополнительно не нужно.
Разве что научиться пользоваться алиасами и явными джойнами. http://www.ibase.ru/devinfo/joins.htm

londinium
Сообщения: 27
Зарегистрирован: 17 апр 2006, 14:04

Сообщение londinium » 20 дек 2006, 20:46

это шутка? чем не устраивает 10 миллисекунд?
В принципе устраивает всем, только пока в таблице всего около 30-ти записей и мне непонятно, будет ли такой запрос также шустро отрабатывать, когда записей будет около тысячи.
Разве что научиться пользоваться алиасами и явными джойнами
Эти джойны для меня пока самая недоступная часть SQL, хотя в Грабере соответствующий раздел прочитал раз 5.
Если не сложно, покажите, пожалуйста, как мой запрос переписывается с джойнами.
А пока пойду читать ссылку

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 20 дек 2006, 21:25

В принципе устраивает всем, только пока в таблице всего около 30-ти записей и мне непонятно, будет ли такой запрос также шустро отрабатывать, когда записей будет около тысячи.
ну так налей записей, пересобери статистику по индексам, и посмотри. В чем проблема?
Эти джойны для меня пока самая недоступная часть SQL, хотя в Грабере соответствующий раздел прочитал раз 5.
у Грабера есть только описание джойнов, но не как с ними работать.
А вот как раз для этого я и написал упомянутую статью. Так что лучше сначала прочитать ее.

londinium
Сообщения: 27
Зарегистрирован: 17 апр 2006, 14:04

Сообщение londinium » 20 дек 2006, 21:39

у Грабера есть только описание джойнов, но не как с ними работать.
А вот как раз для этого я и написал упомянутую статью. Так что лучше сначала прочитать ее.
Уже читаю. Первое впечатление - толковая статья.

Ответить