powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хочу услышать мнения знающих людей
5 сообщений из 5, страница 1 из 1
Хочу услышать мнения знающих людей
    #32018926
Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак:
1. Есть у меня конструкция на Delphi
ADOConnection.BeginTrans;
try
(*) ADOConnection.Execute(<вставка записи в Т1&gt; // на серваке у Т1 есть триггер на вставку
ADOConnection.Execute(<Update Т2 таблицы&gt;
ADOConnection.Execute(<Update Т3 таблицы&gt;
(**)
ADOConnection.CommitTrans;
except
ADOConnection.Rollback;
end;

В триггере так:
SET XACT_ABORT on
BEGIN TRANSACTION tran_1
<вставка в Т4 таблицу из deleted>
COMMIT TRANSACTION tran_1

Так вот, в этом случае после (*) возникает ошибка
"Cannot create new connection because in manual or distribution transaction mode".
Зато if <вставка записи в Т1> перенести в (**), то все работает. :-0 ПОЧЕМУ?

2. Почему совокупность запросов, которая по сути дела объединяет содержимое 2-х таблиц:
SELECT * INTO ##opa FROM t1 WHERE ...
INSERT INTO ##opa FROM t2 WHERE ...
SELECT * FROM ##opa

работает быстрее (на небольших массивах, на больших одинакого), чем:
SELECT * FROM t1
UNION
SELECT * FROM t2
:-0
...
Рейтинг: 0 / 0
Хочу услышать мнения знающих людей
    #32018932
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. Скорее всего дело в том, что вы используете UNION, а не UNION ALL. При простом UNION происходит еще и удаление повторяющихся записей, что конечно требует дополнительного времени.
...
Рейтинг: 0 / 0
Хочу услышать мнения знающих людей
    #32018938
1. А не асинхронное ли выполнение задано?
...
Рейтинг: 0 / 0
Хочу услышать мнения знающих людей
    #32018956
Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для Glory:
Вы, конечно, правы, но к сожалению это не мой случай. Ради интереса я попробовал сделать как Вы посоветовали, результат тотже. Ж8-( Я вот где-то видел или слышал, но давно, что скорость выполнения операций UNION, INNER JOIN, LEFT JOIN и им подобные в MS SQL Servere на больших массивах работают быстрее, if поменять синтаксис написания запросов. Например: вместо LEFT JOIN пименять в WHERE *=. Никто не встречал какие-либо статьи по этому поводу?

Для Глеба
if Вы имеете ввиду св-во ConnectOptions, то они у меня выставлено в coConnectUnspecified.
Вообще-то проблема эта решена, но фак, как говориться, факом. Кстати, а как может повлиять на выполнение программы асинхронность. Команды-то все равно поступают друг за дружкой или как?
...
Рейтинг: 0 / 0
Хочу услышать мнения знающих людей
    #32018959
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
1. В зависимости от установленных параметров архивной политики select into может выполняться в транзакции, а может и вне транзакции. Выполнение вне транзакции происходит гораздо быстрее. Правда, такая операция не находит отражения в журнале транзакций, и при восстановлении архивной копии журнала транзакций можно просто потерыть результаты, полученные данной командой.
2. union вне всяких сомнений работает медленнее, недели union all. В этом я согласен с Glory.
3. По поводу Connection - Глеб Уфимцев высказал наиболее вероятное предположение.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хочу услышать мнения знающих людей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]