Направляющие нетерпеливая загрузка количеств?

Лично, я сохранил бы все эти различные пользовательские классы в единственной таблице. У Вас может тогда или быть поле, которое хранит значение 'Типа', или можно подразумевать, с каким человеком Вы имеете дело тем, в чем поля заполнены. Например, если UserID является ПУСТЫМ, то эта запись не является Пользователем.

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

первый метод также поддерживается LINQ к SQL, если Вы решаете спуститься по тому маршруту (они называют его 'Таблицей На Иерархию' или 'TPH').

15
задан Brian Armstrong 24 July 2009 в 22:29
поделиться

3 ответа

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

Post.find ...

Тогда

post.comments.count

Быстрее и эффективнее с точки зрения памяти (для базы данных), чем если бы вы извлекали оба в одном запросе .

-6
ответ дан 1 December 2019 в 02:46
поделиться

они уже должны быть загружены используйте

post.comments.length

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

26
ответ дан 1 December 2019 в 02:46
поделиться

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

Если хранимая процедура завершается неудачно, потому что таблица уже существует, SPL генерирует исключение. Вы можете справиться с исключениями, добавив предложение ON EXCEPTION - но вы вводите одну из наиболее причудливых частей SPL, язык хранимых процедур.

Вот слегка измененная версия вашей хранимой процедуры - та, которая генерирует деление на нулевое исключение (SQL -1202):

CREATE PROCEDURE foo ()
    define i integer;
    SELECT * FROM 'informix'.systables INTO TEMP tempTable;

    -- do something with tempTable here
    let i = 1 / 0;

    DROP TABLE tempTable;
END PROCEDURE;

execute procedure foo();
SQL -1202: An attempt was made to divide by zero.

execute procedure foo();
SQL -958: Temp table temptable already exists in session.

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

drop procedure foo;
CREATE PROCEDURE foo()
    define i integer;

    BEGIN
        ON EXCEPTION
            DROP TABLE tempTable;
            SELECT * FROM 'informix'.systables INTO TEMP tempTable;
        END EXCEPTION WITH RESUME;
        SELECT * FROM 'informix'.systables INTO TEMP tempTable;
    END;

    -- do something with tempTable here
    let i = 1 / 0;

    DROP TABLE tempTable;
END PROCEDURE;

Блок BEGIN / END ограничивает обработку исключений оператором захвата. Без BEGIN / END обработка исключений охватывает всю процедуру, также реагируя на ошибку деления на ноль (и, следовательно, позволяет DROP TABLE работать, и процедура, похоже, выполняется успешно).

Обратите внимание, что temptable все еще существует на этом этапе:

+ execute procedure foo();
SQL -1202: An attempt was made to divide by zero.
+ execute procedure foo();
SQL -1202: An attempt was made to divide by zero.

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

Вы можете ограничить блок ON EXCEPTION выбранными кодами ошибок (-958 кажется вероятным для этот) автор:

ON EXCEPTION IN (-958) ...

См. Руководство IBM Informix по SQL: Руководство по синтаксису, глава 3 «Заявления SPL».

Обратите внимание, что в Informix 11.70 к операторам CREATE и DROP были добавлены условия IF EXISTS и IF NOT EXISTS. Таким образом, вы можете использовать модифицированный оператор DROP TABLE :

DROP TABLE IF EXISTS tempTable;

Таким образом, с Informix 11.70 или новее, самый простой способ написать процедуру:

DROP PROCEDURE IF EXISTS foo;

CREATE PROCEDURE foo()
    define i integer;
    DROP TABLE IF EXISTS tempTable;

    SELECT * FROM 'informix'.systables INTO TEMP tempTable;

    -- do something with tempTable here
    let i = 1 / 0;

    DROP TABLE tempTable;  -- Still a good idea
END PROCEDURE;

Вы также можете использовать это, но тогда вы получите предыдущее определение процедуры,

2
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: