Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: При сохранении триггера "before*update" появляется ошибка 1064

Используется
MySQL - 5.7 - х64

При сохранении триггера "before*update" появляется ошибка 1064.
"You have an error in your SQl syntax; check the manual that corresponds to your MySql server version for the right syntax to user near"

Привожу триггер.

MySQL
1
2
3
4
5
6
CREATE TRIGGER `trg_02_1_test_before_update` BEFORE UPDATE ON `trg_02_1_test` FOR EACH ROW BEGIN
INSERT INTO trg
     Set
     id_tbl_02_n_log = NEW.id_tbl_02_1;
 
END;
Вопрос.
Как можно решить проблему?
Ответ:
Сообщение от zakaz_77
Как можно решить проблему
SQL
1
INSERT INTO tab1(fld1) VALUES(val1)
Вопрос: Неправильный синтаксис около ключевого слова "UPDATE"

Неправильный синтаксис около ключевого слова "UPDATE". В чем ошибка?
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CREATE FUNCTION dbo.zakaza_1 (@InEmpID INTEGER)  
RETURNS @retFindReports TABLE   
(  
    id_zakaz CHAR(10) PRIMARY KEY NOT NULL,  
    id_mebel CHAR(10) NULL, 
    name_mebel nvarchar(50) NOT NULL,  
    kol_vo CHAR(50) NULL,  
    name_klienta nvarchar(50)NULL, 
    name_sot nvarchar(50)NULL,  
    sena_mebel money,
    sena_zakaz money
)  
AS  
BEGIN  
WITH zakaz (id_zakaz, id_mebel, name_mebel, kol_vo, name_klienta, name_sot, sena_mebel, sena_zakaz)
AS
   UPDATE zakaz 
SET sena_zakaz = mebel.sena_mebel*zakaz.kol_vo
FROM
  zakaz
  JOIN mebel ON zakaz.id_mebel = zakaz.id_mebel 
  INSERT @retFindReports  
   SELECT id_zakaz, id_mebel, name_mebel, kol_vo, name_klienta, name_sot, sena_mebel, sena_zakaz 
   FROM zakaz 
   RETURN  
END;
Ответ:
Сообщение от idris97
Нужно рассчитать сумму заказа
а вы её в таблице держите. Удалите оттуда это поле и Update не нужен будет.
А запрос, рассчитывающий её, у вас уже был
Вопрос: "Неправильный синтаксис около ключевого слова FROM" при выполнении запроса

Вот скрипт базы данных:
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
 DROP TABLE BAGGAGE_SORT;
DROP TABLE BAGGAGE;
DROP TABLE BAGGAGE_TYPE;
DROP TABLE TICKET;
DROP TABLE PASSENGER;
DROP TABLE PASSENGER_STATUS;
DROP TABLE FLIGHT_CLASS;
DROP TABLE CREW;
DROP TABLE EMPLOYEE;
DROP TABLE JOB;
DROP TABLE FLIGHT;
DROP TABLE COURSE;
DROP TABLE AIRPORT;
DROP TABLE AIRPORT_NAMES;
DROP TABLE FLIGHT_STATUS;
DROP TABLE AIRPLANE;
DROP TABLE BRAND_NAME;
DROP TABLE AIRLINE;
DROP TABLE COUNTRY;
CREATE TABLE [AIRPLANE] (
    places_number INT NOT NULL  ,
    airplane_number INT NOT NULL,
    brand_name_id INT NOT NULL,
    speed INT NOT NULL,
    max_dist INT NOT NULL,
    airplane_id INT NOT NULL PRIMARY KEY,
    airline_id INT NOT NULL,
);
GO
CREATE TABLE [COURSE] (
    departure_airport_id INT NOT NULL,
    arrival_airport_id INT NOT NULL,
    inside_country BINARY NOT NULL,
    course_id INT NOT NULL PRIMARY KEY,
);
GO
CREATE TABLE [FLIGHT] (
    flight_id INT NOT NULL PRIMARY KEY,
    departure_date datetime NOT NULL,
    arrival_date datetime NOT NULL,
    airline_id INT NOT NULL,
    airplane_id INT NOT NULL,
    course_id INT NOT NULL,
    flight_status_id INT NOT NULL,
);
GO
CREATE TABLE [AIRLINE] (
    airline_id INT NOT NULL PRIMARY KEY,
    airline_name VARCHAR(25) NOT NULL,
    country_id INT NOT NULL,
);
GO
CREATE TABLE [EMPLOYEE] (
    worker_id INT NOT NULL PRIMARY KEY,
    first_name VARCHAR (25) NOT NULL,
    last_name VARCHAR (25) NOT NULL,
    job_id INT  NOT NULL,
);
GO
CREATE TABLE [PASSENGER] (
    passenger_id INT NOT NULL PRIMARY KEY,
    last_name VARCHAR (25) NOT NULL,
    first_name VARCHAR (25) NOT NULL,
    passenger_status_id INT NOT NULL,
    passport BIGINT NOT NULL,
 );
GO
CREATE TABLE [TICKET] (
    ticket_id INT NOT NULL PRIMARY KEY,
    price INT NOT NULL,
    flight_class_id INT NOT NULL,
    passenger_id INT NOT NULL,
    flight_id INT NOT NULL,
 );
GO
CREATE TABLE [BAGGAGE_TYPE] (
    baggage_type_id INT NOT NULL PRIMARY KEY,
    baggage_type VARCHAR (20) NOT NULL,
  );
GO
CREATE TABLE [BRAND_NAME] (
    brand_name_id INT NOT NULL PRIMARY KEY,
    brand_name VARCHAR (25) NOT NULL,
 );
GO
CREATE TABLE [FLIGHT_CLASS] (
    flight_class_id INT NOT NULL PRIMARY KEY,
    flight_class VARCHAR (4) NOT NULL,
 );
GO
CREATE TABLE [AIRPORT_NAMES] (
    airport_name_id INT NOT NULL PRIMARY KEY,
    airport_name VARCHAR (25) NOT NULL,
 );
GO
 
CREATE TABLE [PASSENGER_STATUS] (
    passenger_status_id INT NOT NULL PRIMARY KEY,
    STATUS VARCHAR (15) NOT NULL ,
);
GO
CREATE TABLE [FLIGHT_STATUS] (
    flight_status_id INT NOT NULL PRIMARY KEY,
    flight_status VARCHAR (20) NOT NULL ,
 );
GO
CREATE TABLE [BAGGAGE] (
    baggage_id INT NOT NULL PRIMARY KEY,
    baggage_type_id INT NOT NULL,
    baggage_weight INT NOT NULL,
    baggage_class INT NOT NULL,
 );
GO
CREATE TABLE [BAGGAGE_SORT] (
    passenger_id INT NOT NULL,
    baggage_id INT NOT NULL,
    PRIMARY KEY (passenger_id,baggage_id),
);
GO
CREATE TABLE [AIRPORT] (
    airport_id INT NOT NULL PRIMARY KEY,
    airport_name_id INT NOT NULL,
);
GO
CREATE TABLE [CREW] (
    worker_id INT NOT NULL,
    flight_id INT NOT NULL,
    PRIMARY KEY (worker_id,flight_id),
 );
GO 
CREATE TABLE [COUNTRY] (
    country_id INT NOT NULL PRIMARY KEY,
    country VARCHAR (15) NOT NULL,
 );
GO  
CREATE TABLE [JOB] (
 job_id INT NOT NULL PRIMARY KEY,
 name VARCHAR (17)
 );
 
 
 ALTER TABLE [AIRPLANE] ADD
 FOREIGN KEY (brand_name_id)
 REFERENCES BRAND_NAME (brand_name_id),
 FOREIGN KEY (airline_id)
 REFERENCES AIRLINE (airline_id)
 
 ALTER TABLE [COURSE] ADD
 FOREIGN KEY (departure_airport_id)
 REFERENCES AIRPORT (airport_id),
 FOREIGN KEY (arrival_airport_id)
 REFERENCES AIRPORT (airport_id)
 
 ALTER TABLE [FLIGHT] ADD
 FOREIGN KEY (course_id)
 REFERENCES [COURSE] (course_id),
 FOREIGN KEY (flight_status_id)
 REFERENCES FLIGHT_STATUS (flight_status_id),
 FOREIGN KEY (airline_id)
 REFERENCES AIRLINE (airline_id),
 FOREIGN KEY (airplane_id)
 REFERENCES AIRPLANE (airplane_id)
 
 ALTER TABLE [AIRLINE] ADD
 FOREIGN KEY (country_id)
 REFERENCES COUNTRY (country_id)
 
 ALTER TABLE [EMPLOYEE] ADD 
 FOREIGN KEY  (job_id)
 REFERENCES  JOB (job_id)
 
 ALTER TABLE [PASSENGER] ADD 
 FOREIGN KEY (passenger_status_id)
 REFERENCES PASSENGER_STATUS (passenger_status_id)
 
 ALTER TABLE [TICKET] ADD
 FOREIGN KEY (passenger_id)
 REFERENCES PASSENGER (passenger_id),
 FOREIGN KEY (flight_id)
 REFERENCES FLIGHT (flight_id),
 FOREIGN KEY (flight_class_id)
 REFERENCES FLIGHT_CLASS (flight_class_id)
 
 ALTER TABLE [BAGGAGE] ADD 
 FOREIGN KEY (baggage_type_id)
 REFERENCES BAGGAGE_TYPE (baggage_type_id)
 
 ALTER TABLE [BAGGAGE_SORT] ADD
 FOREIGN KEY (baggage_id)
 REFERENCES BAGGAGE (baggage_id)
 
 ALTER TABLE [AIRPORT] ADD
 FOREIGN KEY (airport_name_id)
 REFERENCES AIRPORT_NAMES (airport_name_id)
 
 
 INSERT INTO COUNTRY VALUES (1,'РОССИЯ');
 INSERT INTO COUNTRY VALUES (2,'США');
 INSERT INTO COUNTRY VALUES (3,'ФРАНЦИЯ');
 INSERT INTO COUNTRY VALUES (4,'ГЕРМАНИЯ');
 INSERT INTO COUNTRY VALUES (5,'ШВЕЙЦАРИЯ');
 INSERT INTO COUNTRY VALUES (6,'АВСТРАЛИЯ');
 
 
 INSERT INTO BRAND_NAME VALUES (20,'ЭЙРБАС');
 INSERT INTO BRAND_NAME VALUES (21,'ЭЙРСПИД');
 INSERT INTO BRAND_NAME VALUES (22,'БОИНГ');
 INSERT INTO BRAND_NAME VALUES (23,'БРИТТЕН-НОРМАНН');
 INSERT INTO BRAND_NAME VALUES (24,'ЯК');
 INSERT INTO BRAND_NAME VALUES (25,'ТУ');
 INSERT INTO BRAND_NAME VALUES (26,'СУХОЙ');
 INSERT INTO BRAND_NAME VALUES (27,'ЮНКЕРС');
 INSERT INTO BRAND_NAME VALUES (28,'ИЛ');
 INSERT INTO BRAND_NAME VALUES (29,'БОМБАРДИЕР');
 INSERT INTO BRAND_NAME VALUES (30,'МИЦУБИШИ');
 
 INSERT INTO JOB VALUES (40,'БОРТПРОВОДНИК');
 INSERT INTO JOB VALUES (41,'ВТОРОЙ_ПИЛОТ');
 INSERT INTO JOB VALUES (42,'СТЮАРД');
 INSERT INTO JOB VALUES (43,'РАДИСТ');
 INSERT INTO JOB VALUES (44,'КАПИТАН');
 
 INSERT INTO FLIGHT_STATUS VALUES (50,'ПЕРЕНЕСЕН');
 INSERT INTO FLIGHT_STATUS VALUES (51,'ПРИБЫВАЕТ');
 INSERT INTO FLIGHT_STATUS VALUES (52,'ОТЛОЖЕН');
 INSERT INTO FLIGHT_STATUS VALUES (53,'ОТПРАВЛЯЕТСЯ');
 INSERT INTO FLIGHT_STATUS VALUES (54,'ОТМЕНЕН');
 
 INSERT INTO PASSENGER_STATUS VALUES (60,'НА_БОРТУ');
 INSERT INTO PASSENGER_STATUS VALUES (61,'НЕ_НА_БОРТУ');
 INSERT INTO PASSENGER_STATUS VALUES (62,'НЕ_РЕГИСТР');
 INSERT INTO PASSENGER_STATUS VALUES (63,'РЕГИСТР');
 
 INSERT INTO AIRPORT_NAMES VALUES (70,'ШЕРЕМЕТЬЕВО');
 INSERT INTO AIRPORT_NAMES VALUES (71,'ДОМОДЕДОВО');
 INSERT INTO AIRPORT_NAMES VALUES (72,'ХИТРОУ');
 INSERT INTO AIRPORT_NAMES VALUES (73,'ПЕКИНСКИЙ');
 INSERT INTO AIRPORT_NAMES VALUES (74,'КЕННЕДИ');
 INSERT INTO AIRPORT_NAMES VALUES (75,'АТЛАНТА');
 INSERT INTO AIRPORT_NAMES VALUES (76,'КЭПИТАЛ');
 INSERT INTO AIRPORT_NAMES VALUES (77,'ИНТЕРНАСИОНАЛЬ');
 INSERT INTO AIRPORT_NAMES VALUES (78,'ДУГЛАС');
 INSERT INTO AIRPORT_NAMES VALUES (79,'СОЕКАМО_ХАТТА');
 
 INSERT INTO FLIGHT_CLASS VALUES (80,'ЭКОН');
 INSERT INTO FLIGHT_CLASS VALUES (81,'ПЕРВ');
 INSERT INTO FLIGHT_CLASS VALUES (82,'ПРЕМ');
 INSERT INTO FLIGHT_CLASS VALUES (83,'БИЗН');
 
 INSERT INTO BAGGAGE_TYPE VALUES (90,'ХРУПКИЙ');
 INSERT INTO BAGGAGE_TYPE VALUES (91,'КАРГО');
 INSERT INTO BAGGAGE_TYPE VALUES (92,'ТОКСИЧ');
 INSERT INTO BAGGAGE_TYPE VALUES (93,'ЖИДКОСТЬ');
 INSERT INTO BAGGAGE_TYPE VALUES (94,'ЖИВОТНЫЕ');
 
 INSERT INTO EMPLOYEE VALUES (100,'ДЖОН','СМИТ',40);
 INSERT INTO EMPLOYEE VALUES (101,'ДЖЕК','АНДЕРСЕН',41);
 INSERT INTO EMPLOYEE VALUES (102,'ИВАН','ПЕТРОВ',42);
 INSERT INTO EMPLOYEE VALUES (103,'ПАМЕЛА','АНДЕРСОН',43);
 INSERT INTO EMPLOYEE VALUES (104,'ФИЛИПЕ','КОУТИНЬО',44);
 INSERT INTO EMPLOYEE VALUES (105,'КРИСТЕН','ДЖЕКСОН',40);
 INSERT INTO EMPLOYEE VALUES (106,'ОЛЕГ','ТИНЬКОВ',41);
 INSERT INTO EMPLOYEE VALUES (107,'КРИШТИАНУ','РОНАЛДУ',42);
 INSERT INTO EMPLOYEE VALUES (108,'ВЕЙН','РУНИ',43);
 INSERT INTO EMPLOYEE VALUES (109,'РОМАН','ШИРОКОВ',44);
 
 INSERT INTO AIRLINE VALUES (110,'АЭРОФЛОТ',1);
 INSERT INTO AIRLINE VALUES (111,'ПАНЭМ',2);
 INSERT INTO AIRLINE VALUES (112,'ЭЙР_ФРАНС',3);
 INSERT INTO AIRLINE VALUES (113,'БУНДЕСФЛЁГ',4);
 INSERT INTO AIRLINE VALUES (114,'ШВИЦ_ЭЙР',5);
 INSERT INTO AIRLINE VALUES (115,'АУ_ЭЙР',6);
 
 INSERT INTO AIRPLANE VALUES (120,111,20,700,10000,140,110);
 INSERT INTO AIRPLANE VALUES (130,112,21,760,9500,141,111);
 INSERT INTO AIRPLANE VALUES (100,113,22,725,9000,142,112);
 INSERT INTO AIRPLANE VALUES (210,114,23,750,9000,143,113);
 INSERT INTO AIRPLANE VALUES (250,115,24,800,10000,144,114);
 INSERT INTO AIRPLANE VALUES (110,117,20,700,10000,145,115);
 
 INSERT INTO AIRPORT VALUES (160,70);
 INSERT INTO AIRPORT VALUES (161,71);
 INSERT INTO AIRPORT VALUES (162,72);
 INSERT INTO AIRPORT VALUES (163,73);
 INSERT INTO AIRPORT VALUES (164,74);
 INSERT INTO AIRPORT VALUES (165,75);
 INSERT INTO AIRPORT VALUES (166,76);
 INSERT INTO AIRPORT VALUES (167,77);
 INSERT INTO AIRPORT VALUES (168,78);
 INSERT INTO AIRPORT VALUES (169,79);
 
 INSERT INTO COURSE VALUES (160,161,1,170);
 INSERT INTO COURSE VALUES (161,162,0,171);
 INSERT INTO COURSE VALUES (162,163,0,172);
 INSERT INTO COURSE VALUES (163,164,0,173);
 
 
 INSERT INTO FLIGHT VALUES (180, '19.02.2013', '21.02.2013',110, 140, 170,50);
 INSERT INTO FLIGHT VALUES (181, '17.07.2013', '28.07.2013',111, 141, 171,51);
 INSERT INTO FLIGHT VALUES (182, '14.08.2013', '15.08.2013',112, 142, 172,51);
 INSERT INTO FLIGHT VALUES (183, '19.09.2013', '19.09.2013',113, 143, 173,52);
 INSERT INTO FLIGHT VALUES (184, '01.06.2013', '01.06.2013',114, 144, 171,53);
 INSERT INTO FLIGHT VALUES (185, '21.10.2013', '21.10.2013',115, 145, 172,51);
 
 INSERT INTO PASSENGER VALUES (190 , 'ИВАН' , 'БРОВКИН', 60, 111111);
 INSERT INTO PASSENGER VALUES (191 , 'ДЖЕК' , 'ТОМПСОН', 60, 111112);
 INSERT INTO PASSENGER VALUES (192 , 'ДАНИИЛ' , 'ЧЕРНЕНКО', 62, 111113);
 INSERT INTO PASSENGER VALUES (193 , 'ДЖОННАТАН' , 'РАЙТ', 63, 111114);
 INSERT INTO PASSENGER VALUES (194 , 'ЛИОНЕЛЬ' , 'МЕССИ', 63, 111115);
 INSERT INTO PASSENGER VALUES (195 , 'АЛЕКСАНДР' , 'ФЕРГЮСОН', 62, 111116);
 INSERT INTO PASSENGER VALUES (196 , 'АЛЕКСАНДР' , 'МОСИН', 61, 111117);
 
 INSERT INTO TICKET VALUES (200, 2000, 80, 190,181);
 INSERT INTO TICKET VALUES (201, 2500, 81, 191,182);
 INSERT INTO TICKET VALUES (202, 20000, 82, 192,183);
 INSERT INTO TICKET VALUES (203, 23000, 80, 193,184);
 INSERT INTO TICKET VALUES (204, 22000, 82, 194,182);
 INSERT INTO TICKET VALUES (205, 10000, 82, 195,181);
 INSERT INTO TICKET VALUES (206, 12000, 83, 196,182);
 INSERT INTO TICKET VALUES (207, 223000, 80, 192,183);
 INSERT INTO TICKET VALUES (208, 223000, 81, 191,184);

Итак, необходимо выполнить следующие запросы:
Кликните здесь для просмотра всего текста

1.Определить среднее рассчетное время полета для самолета 'CУ-24' для международных перевозок
2.Выбрать марку самолета, которая чаще всего используется на внутренних рейсах.
3.Выбрать маршрут/маршруты, по которым чаще всего летают рейсы, заполненные менее, чем на 70%.
4.Определить наличие свободных мест на рейс №354 23 августа 2004г.


Я сделал первый запрос, но sql ругается на непр. синтаксис около FROM :
SQL
1
2
3
4
5
6
7
SELECT ((avg(DATEDIFF(dd,departure_date,arrival_date)))/cnt)
(SELECT COUNT (FLIGHT.flight_id) AS cnt 
FROM FLIGHT, COURSE
WHERE COURSE.inside_country=0)
FROM COURSE, AIRPLANE, FLIGHT, BRAND_NAME
  WHERE COURSE.inside_country=0 
   AND BRAND_NAME.brand_name='СУХОЙ'
В чем проблема? И также нужна помощь с остальными запросами. Заранее благодарю.
Ответ: Переписал по-своему, заработало.

Добавлено через 14 минут
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
--Выбрать маршрут/маршруты, по которым чаще всего летают рейсы, заполненные менее, чем на 70%--
SELECT TOP 1 WITH TIES (TEMP.course_id) AS ID, COUNT(TEMP.flight_id) AS FREQ 
FROM 
    ( SELECT FLIGHT.flight_id, COURSE.course_id 
       FROM  TICKET, FLIGHT, COURSE, AIRPLANE
       WHERE AIRPLANE.airplane_id = FLIGHT.airplane_id
       AND FLIGHT.flight_id = TICKET.flight_id
       AND COURSE.course_id = FLIGHT.course_id
    GROUP BY FLIGHT.flight_id , AIRPLANE.places_number, COURSE.course_id
    HAVING SUM (TICKET.ticket_id) < 0.7 * AIRPLANE.places_number
    ) TEMP
GROUP BY TEMP.course_id , TEMP.flight_id
ORDER BY FREQ DESC
3 скрипт, видимо, где-то опять описка

Добавлено через 7 минут
Сообщение от iap
А что, в SELECTе уже можно два WHERE писать?
Вот как сделал:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT (Have-Sold) AS FREE
FROM 
  ( 
    SELECT AIRPLANE.places_number AS Have
    FROM BRAND_NAME, AIRPLANE, FLIGHT, COURSE 
     WHERE BRAND_NAME.brand_name_id = AIRPLANE.brand_name_id    
     AND AIRPLANE.airplane_id = FLIGHT.airplane_id
     AND FLIGHT.course_id = COURSE.course_id
     AND COURSE.course_id= 171
     AND FLIGHT.departure_date = '17.07.2013'
  ) temp1,
  ( 
    SELECT COUNT (ticket_id) AS Sold
    FROM FLIGHT
     INNER JOIN TICKET ON FLIGHT.flight_id=TICKET.flight_id
     INNER JOIN COURSE ON FLIGHT.course_id = COURSE.course_id
    WHERE COURSE.course_id= 171
     AND FLIGHT.departure_date = '17.07.2013'
  ) temp2;
Добавлено через 1 час 7 минут
Вся проблема была в последней строке. Изменил так:
Кликните здесь для просмотра всего текста

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
--Выбрать маршрут/маршруты, по которым чаще всего летают рейсы, заполненные менее, чем на 70%--
SELECT TOP 1 WITH TIES (TEMP.course_id) AS ID, COUNT(TEMP.flight_id) AS FREQ 
FROM 
    ( SELECT FLIGHT.flight_id, COURSE.course_id 
       FROM  TICKET, FLIGHT, COURSE, AIRPLANE
       WHERE AIRPLANE.airplane_id = FLIGHT.airplane_id
       AND FLIGHT.flight_id = TICKET.flight_id
       AND COURSE.course_id = FLIGHT.course_id
    GROUP BY FLIGHT.flight_id , AIRPLANE.places_number, COURSE.course_id
    HAVING COUNT(TICKET.ticket_id) < 0.7 * AIRPLANE.places_number
    ) TEMP
GROUP BY TEMP.course_id , TEMP.flight_id
ORDER BY FREQ DESC
Вопрос: bulk-insert'ы при контроле поля на not-null: benchmark для 2 млн строк в 2.5 SC vs 3.0 SC

hi all.

Понадобилось как-то затащить в таблицу оч-чень много строк из базы-источника. DDL таблиц полностью совпадает, перенос идёт с помощью IB DataPump.
Ясен пень, что если убрать индексы с таблицы-приёмника, то скорость увеличится. Но захотелось также выкинуть (временно) все check'и на ней - "а вдруг взлетит еще быстрее ?".

Результат для 2.5 слегка удивил.
Если not-null задано вот так:
recreate table tgt1(id int not null); -- field-defined not-null constraint
или вот так:
create domain dm_id_check_nn int check(value is not null);
recreate table tgt4(id dm_id_check_nn); -- nullable domain + EXPLICIT constraint on domain
или еще вот так:
create domain dm_id_not_null int not null;
recreate table tgt5(id dm_id_not_null);
insert into tgt5 select * from src; -- NOT-null domain constraint
-- то скорость инсертов от наличия/отсутствия этих констрейнтов практически НЕ меняется.

Если же not-null обеспечивается в явном виде:
recreate table tgt2(id int, constraint tgt2_chk_id_nn check(id is not null));
insert into tgt2 select * from src; -- EXPLICIT not-null constraint on field
или вообще по-дэбильному:
recreate table tgt3(id int); create trigger tgt3_biu for tgt3 active before insert or update as begin if (new.id is null) then exception exc_id_nn; end
insert into tgt3 select * from src; -- trigger checking
-- то скорость инсертов от удаления этих перлов растёт (в 2.5) примерно в 3 раза.

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

#######################

Результат для 3.0 также породил душевные терзания.
В нём явный проигрыш в скорости инсертов наблюдается там же, где и для 2.5. Однако статистика вставок проигрывает во всех остальных случаях проигрывает примерно в 1.5 раза. ДЕ мне как-то говорил, что 3.0 будет выигрывать у 2.5 только при многопользовательской нагрузке, а в моно-коннекте выигрыш совсем не гарантирован. Однако дифферент 1.5 раза - как-то уж очень сильно... :( Получается, миграцию действительно больших данных вообще лучше в 2.5 делать, а затем b/r ?

Вот тест:
+
-- init DDL:
recreate table src(id int);
commit;
set term ^;
execute block as
declare n int = 2000000;
begin
while (n>0) do insert into src(id) values(:n) returning :n-1 into n;
end
^
set term ;^
commit;

-- test:

set bail on;
recreate table tgt0(id int);
recreate table tgt1(id int not null);
recreate table tgt2(id int, constraint tgt2_chk_id_nn check(id is not null));
recreate table tgt3(id int);
recreate table tgt4(id int);
recreate table tgt5(id int);
commit;

set term ^;
execute block as
begin
begin
execute statement 'drop domain dm_id_check_nn';
when any do begin end
end
begin
execute statement 'drop domain dm_id_not_null';
when any do begin end
end
begin
execute statement 'drop exception exc_id_nn';
when any do begin end
end
end
^
set term ;^
commit;
create domain dm_id_check_nn int check(value is not null);
create domain dm_id_not_null int not null;
commit;

recreate table tgt4(id dm_id_check_nn);
recreate table tgt5(id dm_id_not_null);

create exception exc_id_nn 'id is null';
commit;

set term ^;
create trigger tgt3_biu for tgt3 active before insert or update as
begin
if (new.id is null) then exception exc_id_nn;
end
^
set term ;^
commit;

set stat on;
set count on;
set echo on;

insert into tgt0 select * from src; -- no conctraints
insert into tgt1 select * from src; -- field-defined constraint
insert into tgt2 select * from src; -- EXPLICIT not-null constraint on field
insert into tgt3 select * from src; -- trigger checking
insert into tgt4 select * from src; -- domain, EXPLICIT constraint
insert into tgt5 select * from src; -- domain-defined not-null constraint
set echo off;
set stat off;
commit;

А вот сводный результат по пяти запускам на каждом ФБ (приведены данные, начиная со второго прогона в каждом случае, дабы убрать влияние затрат на рост файла БД):

0.
recreate table tgt0(id int);
insert into tgt0 select * from src; -- no conctraints
run-1run-2run-3run-4run-5
elapsed_ms, FB 3.0 SC51075083508350835121
elapsed_ms, FB 2.5 SC32883297330332843286
ratio: 3.0 / 2.5:1,551,541,541,551,56


1.
recreate table tgt1(id int not null);
insert into tgt1 select * from src; -- field-defined not-null constraint
run-1run-2run-3run-4run-5
elapsed_ms, FB 3.0 SC53105303528653025307
elapsed_ms, FB 2.5 SC35493546353135133500
ratio: 3.0 / 2.5:1,501,501,501,511,52


2.
recreate table tgt2(id int, constraint tgt2_chk_id_nn check(id is not null));
insert into tgt2 select * from src; -- EXPLICIT not-null constraint on field
run-1run-2run-3run-4run-5
elapsed_ms, FB 3.0 SC74807474748574818199
elapsed_ms, FB 2.5 SC1010610125100911009510098
ratio: 3.0 / 2.5:0,740,740,740,740,81


3.
recreate table tgt3(id int); 
create trigger tgt3_biu for tgt3 ... as begin if (new.id is null) then exception exc_id_nn; end
insert into tgt3 select * from src; -- trigger checking
run-1run-2run-3run-4run-5
elapsed_ms, FB 3.0 SC89358907958989098981
elapsed_ms, FB 2.5 SC1194812103114961244911990
ratio: 3.0 / 2.5:0,750,740,830,720,75


4.
create domain dm_id_check_nn int check(value is not null);
recreate table tgt4(id dm_id_check_nn);
insert into tgt4 select * from src; -- domain, EXPLICIT constraint
run-1run-2run-3run-4run-5
elapsed_ms, FB 3.0 SC53625317531453105301
elapsed_ms, FB 2.5 SC35383518351635373523
ratio: 3.0 / 2.5:1,521,511,511,501,50


5.
create domain dm_id_not_null int not null;
recreate table tgt5(id dm_id_not_null);
insert into tgt5 select * from src; -- domain-defined not-null constraint
run-1run-2run-3run-4run-5
elapsed_ms, FB 3.0 SC55995329532853255323
elapsed_ms, FB 2.5 SC39983549350535193497
ratio: 3.0 / 2.5:1,401,501,521,511,52


PS.
Версии ФБ:
LI-V2.5.5.26910
LI-V3.0.0.32008

База в обоих случаях: page_size = 4K, fw = OFF.
Кол-во буферов в обоих инстансах ФБ: 512, арх-ра: SuperClassic.
Ответ:
Симонов Денис
в твоём тесте получается, что в трёшке триггеры работают быстрее, а движок медленнее. Странно это...
ну, вот так вот... прогони у себя, получишь, скорее всего тоже самое.

Симонов Денис
И ещё у тебя тест не совсем чистый. Где гарантия что медленней именно insert, а не select * from src
Сколько там хоть записей то и как они распределены?
затраты на select * from src - это по-любасу постоянная величина. И в стартовом посте всё видно, под спойлером: таблица содержит только числовое поле ID, от 1 до 2'000'000. Индексов нигде нету.
Вопрос: Windows Server 2012 R2 + MySQL 5.7

Установил на Windows 2012 R2, все настройки - по умолчанию:

+ C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
# Other default tuning values
# MySQL Server Instance Configuration File
# ----------------------------------------------------------------------
# Generated by the MySQL Server Instance Configuration Wizard
#
#
# Installation Instructions
# ----------------------------------------------------------------------
#
# On Linux you can copy this file to /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options
# (@localstatedir@ for this installation) or to
# ~/.my.cnf to set user-specific options.
#
# On Windows you should keep this file in the installation directory
# of your server (e.g. C:\Program Files\MySQL\MySQL Server X.Y). To
# make sure the server reads the config file use the startup option
# "--defaults-file".
#
# To run run the server from the command line, execute this in a
# command line shell, e.g.
# mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server X.Y\my.ini"
#
# To install the server as a Windows service manually, execute this in a
# command line shell, e.g.
# mysqld --install MySQLXY --defaults-file="C:\Program Files\MySQL\MySQL Server X.Y\my.ini"
#
# And then execute this in a command line shell to start the server, e.g.
# net start MySQLXY
#
#
# Guildlines for editing this file
# ----------------------------------------------------------------------
#
# In this file, you can use all long options that the program supports.
# If you want to know the options a program supports, start the program
# with the "--help" option.
#
# More detailed information about the individual options can also be
# found in the manual.
#
# For advice on how to change settings please see
#
#
#
# CLIENT SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by MySQL client applications.
# Note that only client applications shipped by MySQL are guaranteed
# to read this section. If you want your own MySQL client program to
# honor these values, you need to specify it as an option during the
# MySQL client library initialization.
#
[client]
no-beep

# pipe
# socket=0.0
port=3306

[mysql]

default-character-set=utf8


# SERVER SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this
# file.
#
port = 3306

[mysqld]

# The next three options are mutually exclusive to SERVER_PORT below.
# skip-networking

# enable-named-pipe

# shared-memory

# shared-memory-base-name=MYSQL

# The Pipe the MySQL Server will use
# socket=MYSQL

# The TCP/IP Port the MySQL Server will listen on
port=3306

# Path to installation directory. All paths are usually resolved relative to this.
# basedir="C:/Program Files/MySQL/MySQL Server 5.7/"

# Path to the database root
datadir=C:/ProgramData/MySQL/MySQL Server 5.7\Data

# The default character set that will be used when a new schema or table is
# created and no character set is defined
character-set-server=utf8

# The default storage engine that will be used when create new tables when
default-storage-engine=INNODB

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

# Enable Windows Authentication
# plugin-load=authentication_windows.dll

# General and Slow logging.
log-output=NONE
general-log=0
general_log_file="WINDOWS-2012-X6.log"
slow-query-log=0
slow_query_log_file="WINDOWS-2012-X6-slow.log"
long_query_time=10

# Binary Logging.
# log-bin

# Error Logging.
log-error="WINDOWS-2012-X6.err"

# Server Id.
server-id=1

# Secure File Priv.
secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/Uploads"

# The maximum amount of concurrent sessions the MySQL server will
# allow. One of these connections will be reserved for a user with
# SUPER privileges to allow the administrator to login even if the
# connection limit has been reached.
max_connections=151

# Query cache is used to cache SELECT results and later return them
# without actual executing the same query once again. Having the query
# cache enabled may result in significant speed improvements, if your
# have a lot of identical queries and rarely changing tables. See the
# "Qcache_lowmem_prunes" status variable to check if the current value
# is high enough for your load.
# Note: In case your tables change very often or if your queries are
# textually different every time, the query cache may result in a
# slowdown instead of a performance improvement.
query_cache_size=1M

# The number of open tables for all threads. Increasing this value
# increases the number of file descriptors that mysqld requires.
# Therefore you have to make sure to set the amount of open files
# allowed to at least 4096 in the variable "open-files-limit" in
# section [mysqld_safe]
table_open_cache=2000

# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
tmp_table_size=20M

# How many threads we should keep in a cache for reuse. When a client
# disconnects, the client's threads are put in the cache if there aren't
# more than thread_cache_size threads from before. This greatly reduces
# the amount of thread creations needed if you have a lot of new
# connections. (Normally this doesn't give a notable performance
# improvement if you have a good thread implementation.)
thread_cache_size=10

#*** MyISAM Specific options
# The maximum size of the temporary file MySQL is allowed to use while
# recreating the index (during REPAIR, ALTER TABLE or LOAD DATA INFILE.
# If the file-size would be bigger than this, the index will be created
# through the key cache (which is slower).
myisam_max_sort_file_size=100G

# If the temporary file used for fast index creation would be bigger
# than using the key cache by the amount specified here, then prefer the
# key cache method. This is mainly used to force long character keys in
# large tables to use the slower key cache method to create the index.
myisam_sort_buffer_size=31M

# Size of the Key Buffer, used to cache index blocks for MyISAM tables.
# Do not set it larger than 30% of your available memory, as some memory
# is also required by the OS to cache rows. Even if you're not using
# MyISAM tables, you should still set it to 8-64M as it will also be
# used for internal temporary disk tables.
key_buffer_size=8M

# Size of the buffer used for doing full table scans of MyISAM tables.
# Allocated per thread, if a full scan is needed.
read_buffer_size=62K
read_rnd_buffer_size=256K

#*** INNODB Specific options ***
# innodb_data_home_dir=0.0

# Use this option if you have a MySQL server with InnoDB support enabled
# but you do not plan to use it. This will save memory and disk space
# and speed up some things.
# skip-innodb

# If set to 1, InnoDB will flush (fsync) the transaction logs to the
# disk at each commit, which offers full ACID behavior. If you are
# willing to compromise this safety, and you are running small
# transactions, you may set this to 0 or 2 to reduce disk I/O to the
# logs. Value 0 means that the log is only written to the log file and
# the log file flushed to disk approximately once per second. Value 2
# means the log is written to the log file at each commit, but the log
# file is only flushed to disk approximately once per second.
innodb_flush_log_at_trx_commit=1

# The size of the buffer InnoDB uses for buffering log data. As soon as
# it is full, InnoDB will have to flush it to disk. As it is flushed
# once per second anyway, it does not make sense to have it very large
# (even with long transactions).
# innodb_log_buffer_size

# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system. Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
# innodb_buffer_pool_size

# Size of each log file in a log group. You should set the combined size
# of log files to about 25%-100% of your buffer pool size to avoid
# unneeded buffer pool flush activity on log file overwrite. However,
# note that a larger logfile size will increase the time needed for the
# recovery process.
innodb_log_file_size=48M

# Number of threads allowed inside the InnoDB kernel. The optimal value
# depends highly on the application, hardware as well as the OS
# scheduler properties. A too high value may lead to thread thrashing.
innodb_thread_concurrency=8

# The increment size (in MB) for extending the size of an auto-extend InnoDB system tablespace file when it becomes full.
innodb_autoextend_increment=64

# The number of regions that the InnoDB buffer pool is divided into.
# For systems with buffer pools in the multi-gigabyte range, dividing the buffer pool into separate instances can improve concurrency,
# by reducing contention as different threads read and write to cached pages.
# innodb_buffer_pool_instances

# Determines the number of threads that can enter InnoDB concurrently.
innodb_concurrency_tickets=5000

# Specifies how long in milliseconds (ms) a block inserted into the old sublist must stay there after its first access before
# it can be moved to the new sublist.
innodb_old_blocks_time=1000

# It specifies the maximum number of .ibd files that MySQL can keep open at one time. The minimum value is 10.
# innodb_open_files

# When this variable is enabled, InnoDB updates statistics during metadata statements.
innodb_stats_on_metadata=0

# When innodb_file_per_table is enabled (the default in 5.6.6 and higher), InnoDB stores the data and indexes for each newly created table
# in a separate .ibd file, rather than in the system tablespace.
innodb_file_per_table=1

# Use the following list of values: 0 for crc32, 1 for strict_crc32, 2 for innodb, 3 for strict_innodb, 4 for none, 5 for strict_none.
innodb_checksum_algorithm=0

# The number of outstanding connection requests MySQL can have.
# This option is useful when the main MySQL thread gets many connection requests in a very short time.
# It then takes some time (although very little) for the main thread to check the connection and start a new thread.
# The back_log value indicates how many requests can be stacked during this short time before MySQL momentarily
# stops answering new requests.
# You need to increase this only if you expect a large number of connections in a short period of time.
back_log=80

# If this is set to a nonzero value, all tables are closed every flush_time seconds to free up resources and
# synchronize unflushed data to disk.
# This option is best used only on systems with minimal resources.
flush_time=0

# The minimum size of the buffer that is used for plain index scans, range index scans, and joins that do not use
# indexes and thus perform full table scans.
join_buffer_size=256K

# The maximum size of one packet or any generated or intermediate string, or any parameter sent by the
# mysql_stmt_send_long_data() C API function.
max_allowed_packet=4M

# If more than this many successive connection requests from a host are interrupted without a successful connection,
# the server blocks that host from performing further connections.
max_connect_errors=100

# Changes the number of file descriptors available to mysqld.
# You should try increasing the value of this option if mysqld gives you the error "Too many open files".
open_files_limit=4161

# Set the query cache type. 0 for OFF, 1 for ON and 2 for DEMAND.
query_cache_type=1

# If you see many sort_merge_passes per second in SHOW GLOBAL STATUS output, you can consider increasing the
# sort_buffer_size value to speed up ORDER BY or GROUP BY operations that cannot be improved with query optimization
# or improved indexing.
sort_buffer_size=256K

# The number of table definitions (from .frm files) that can be stored in the definition cache.
# If you use a large number of tables, you can create a large table definition cache to speed up opening of tables.
# The table definition cache takes less space and does not use file descriptors, unlike the normal table cache.
# The minimum and default values are both 400.
table_definition_cache=1400

# Specify the maximum size of a row-based binary log event, in bytes.
# Rows are grouped into events smaller than this size if possible. The value should be a multiple of 256.
binlog_row_event_max_size=8K

# If the value of this variable is greater than 0, a replication slave synchronizes its master.info file to disk.
# (using fdatasync()) after every sync_master_info events.
sync_master_info=10000

# If the value of this variable is greater than 0, the MySQL server synchronizes its relay log to disk.
# (using fdatasync()) after every sync_relay_log writes to the relay log.
sync_relay_log=10000

# If the value of this variable is greater than 0, a replication slave synchronizes its relay-log.info file to disk.
# (using fdatasync()) after every sync_relay_log_info transactions.
sync_relay_log_info=10000

# Load mysql plugins at start."plugin_x ; plugin_y".
# plugin_load

# MySQL server's plugin configuration.
# loose_mysqlx_port=33060


Сервис запущен, работает, в логах чисто. Но я не могу подключиться удалённо - Windows Firewall отключен, однако что-то не пускает. При этом локально запущенный работает нормально, но при попытке подключиться удалённо - от ворот поворот.

В одном месте посоветовали проверить "mysql_secure_installation", но насчёт этой проверки сказали так:

Kristian Köhntopp
mysql_secure_installation is not just unavailable on Windows, it is also not needed. The GUI installer von Windows offers to perform these post-installation steps, and enabled them even by default.


До вчерашнего дня MySQL устанавливал на Windows Server только в виде различных WAMP'ов, и то много лет назад для баловства на несколько часов при необходимости проверки БД (обычно работал в Ubuntu Server).

Что ему (или Windows, или MySQL) нужно от меня?
Ответ: Представляете, забыл сменить "localhost" у рута на "%" :lol:

Вопрос решён.
Вопрос: Не работает тригер на update before

Есть тригер стоит на таблице как
"СREATE TRIGGER before_finace
BEFORE INSERT
ON pay
FOR EACH ROW
EXECUTE PROCEDURE "pay to finace before v2"();"

Сам тригер
"DECLARE
INSERT_SQL text;
OPTYPE text;
SUM bigint;
SYSTEM_DATE text;
TYPE_PAY text;
DESCR text;
_id bigint;

BEGIN
IF NEW.typepay_id != 2423331 THEN
IF NEW.paysum > 0 THEN
OPTYPE := 2;
ELSIF NEW.paysum < 0 and (NEW.typepay_id = 3181810 or NEW.typepay_id = 472295 or NEW.typepay_id = 57586)THEN
OPTYPE := 1;
ELSE
RAISE EXCEPTION 'Нельзя ставить отрицательный баланс киленту если это не перерасчет не повторка и не списание';
END IF;
NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
select now()::timestamp into SYSTEM_DATE;
SELECT id_pay INTO _id from client where login = NEW.numdoc;
IF _id IS NULL THEN
RAISE EXCEPTION 'Нельзя зачислить платеж без регестрации %', NEW.numdoc;
END IF;
Select CAST(NEW.paysum::numeric AS bigint)* 10000000000 into SUM;
select description into TYPE_PAY from typepay where id = NEW.typepay_id;
DESCR := '' || TYPE_PAY || ' ' || '' || NEW.datepay || '' || ' ' || NEW.nazn ||' №' || NEW.term || '';
INSERT_SQL := 'insert into finace_operations (user_id,op_type,op_date,op_summa,system_date,descr,finance_real)
VALUES (''' || _id || ''',''' || OPTYPE || ''',''' || SYSTEM_DATE || ''',' || SUM || ',''' || SYSTEM_DATE || ''',''' || DESCR ||''',''' || NEW.paysum ||''')';
--SELECT 1, CURRENT_TIMESTAMP(0) INTO NEW.executeinideco, NEW.datecreate;
--NEW.executeinideco := 1;
--NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
PERFORM dblink_exec('dbname=*** user=*** password=***',INSERT_SQL);
ELSE
SELECT CURRENT_TIMESTAMP(0) INTO NEW.datecreate;
END IF;
RETURN NEW;
END;"

На некоторых записях не устанавливает-"NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));"
Ответ:
2107tsm
qwwq
пропущено...

скажите, уважаемый, русский язык вам родной ?

далее:
else -- это else. т.е. и False и NULL. в обоих случаях вы сразу попадаете из if--а на подкрашенный мною else без присвоения искомых вами полей. точка.

Даже запись dblink_exec('dbname=*** user=*** password=***',INSERT_SQL); проходить а вот На некоторых записях не устанавливает-"NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));"


Ну так поставьте десяток RAISE WARNING в хранимку отладочных на подозрительные места.
И по логам разбирайтесь что произошло.
Визуально отлаживать код когда там что то странное происходит - не эффективно.

--
Maxim Boguk
www.postgresql-consulting.ru
Вопрос: Многострочный insert вызывает ошибку в MS SQL 2008

Здравствуйте. Изучаю SQL пытаюсь выполнить скрипт из видео урока.
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
USE DfLessonDb
GO
 
TRUNCATE TABLE BlogUser
GO
 
INSERT INTO BlogUser (Name, Surname, Patronymic, Email, UserLogin, Password, RegistrationDate) VALUES
('Джэйн', 'Иамбурски', 'Ратмировна', 'spell@yandex.ru', 'spell', '8937', '20150507')
,('Васой', 'Паликян', 'Севастьянович', 'curse@mail.ru', 'curse', '7514', '20160209')
,('Хаккани', 'Радзивон', 'Ларионович', 'district@hotmail.com', 'district', '4540', '20130610')


Испоьзую для этого:
Кликните здесь для просмотра всего текста
Microsoft SQL Server Management Studio 10.50.1600.1
Компоненты доступа к данным (MDAC) 6.1.7601.17514
Microsoft MSXML 3.0 5.0 6.0
Microsoft Internet Explorer 9.11.9600.18124
Microsoft .NET Framework 2.0.50727.5485
Операционная система 6.1.7601

При нажатии "синтаксическая проверка" ругается: "Сообщение 102, уровень 15, состояние 1, строка 4
Неправильный синтаксис около конструкции ","." Хотя по идеи же MS SQL Server 2008 должен поддерживать многострочную вставку в таком синтаксисе. Что не так подскажите пожалуйста!
Ответ: Да, видимо вы правы. У мня этот запрос выдал:
Кликните здесь для просмотра всего текста
Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 6.1 (Build 7601: Service Pack 1)

Большое спасибо! Буду ставить 2008.
Вопрос: помогите оптимизировать insert

Всем привет.


RAC 11.2.0.3.0


SQL ID: fjybdrzhsdfjr
Plan Hash: 2705196338
UPDATE ORDERS PARTITION(ORDERS_MAX) SET ORD_GR_ID = :B1 
WHERE
 SETTLEMENT_ID IS NULL AND ORD_GR_ID IN (SELECT COLUMN_VALUE FROM TABLE ( :B2 
  ) )


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute     19      0.83       7.24        272       4425      54322        7462
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       20      0.83       7.24        272       4425      54322        7462

Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 63     (recursive depth: 1)

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  UPDATE  ORDERS (cr=30 pr=4 pw=0 time=414634 us)
      9   NESTED LOOPS  (cr=20 pr=0 pw=0 time=953 us)
      9    NESTED LOOPS  (cr=11 pr=0 pw=0 time=534 us cost=33 size=12 card=1)
      2     SORT UNIQUE (cr=0 pr=0 pw=0 time=45 us cost=29 size=4 card=2)
      2      COLLECTION ITERATOR PICKLER FETCH (cr=0 pr=0 pw=0 time=13 us cost=29 size=4 card=2)
      9     PARTITION RANGE ITERATOR PARTITION: KEY KEY (cr=11 pr=0 pw=0 time=618 us cost=2 size=0 card=1)
      9      INDEX RANGE SCAN ORDER_IDX1 PARTITION: KEY KEY (cr=11 pr=0 pw=0 time=591 us cost=2 size=0 card=1)(object id 2772506)
      9    TABLE ACCESS BY GLOBAL INDEX ROWID ORDERS PARTITION: ROW LOCATION ROW LOCATION (cr=9 pr=0 pw=0 time=342 us cost=3 size=10 card=1)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  library cache pin                               3        0.00          0.00
  library cache lock                              2        0.00          0.00
  gc current grant 2-way                        725        0.00          0.19
  Disk file operations I/O                        3        0.00          0.00
  gc current block 2-way                         25        0.00          0.00
  db file sequential read                       272        0.24          5.12
  gc current grant busy                         132        0.00          0.04
  gc cr block congested                           1        0.00          0.00
  gc cr block 2-way                              18        0.00          0.00
  gc current grant congested                      9        0.00          0.00
  gc buffer busy release                          3        0.63          0.64
  gc current block busy                           2        0.00          0.00
  latch: cache buffers lru chain                  4        0.00          0.00
  gc cr grant 2-way                               4        0.00          0.00
  latch: object queue header operation            1        0.00          0.00
********************************************************************************

на поле которое абдейтиться (ORD_GR_ID) есть глобальный индекс:

CREATE INDEX "ORDER_IDX1" ON "ORDERS" ("ORD_GR_ID")
GLOBAL PARTITION BY RANGE ("ORD_GR_ID")
(PARTITION "ORD_IDX1_LS_10M" VALUES LESS THAN (10000000) ,
PARTITION "ORD_IDX1_LS_20M" VALUES LESS THAN (20000000) ,
....
);

новое значение для абдейта берется из сиквенса и добавляется в конец индекса.
Сама таблица активно заполняется балковыми INSERTами (обычно 1 сессия, маловероятно что несколько но в любом случае не более нескольких штук).

Абдейт раниться с одной сессии (джобом 1 раз в 5 мин).

Посмотрел по трейсу какие объекты читает "db file sequential read" - выяснил что более 90% приходиться на UNDO таблспейс.

Помогите плиз правильно трактовать трейс?

1. Не пойму почему так много блоков в режиме current=54322 по сравнению с query=4425. Получается что для получение согласованного по чтению снимка на начало абдейта нужно было query=4425 блоков, а чтобы их проабдейтить current=54322). Это что добавилось сгенеренное UNDO и REDO, или они в это число не входят ?

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


Спасибо.
Ответ: Помоему нашел причину ИО. Проблема из-за включенного flashback-а.


Before an undo block can be recycled it has to be "new"ed (in Oracle-speak). Normalllly this means that Oracle simply creates a new version of the block in memory without reference to the existing block on disc; but if you are running in flashback mode Oracle (usually) has to read the undo block from disc, and write it into the flashback log before newing it. This activity will show up in statistic "physical reads for flashback new" - the combination of the extra reads and the extra volume of flashback log could cause an I/O problem - the latter (as others have commented) being a reason for the database stopping.



Вопрос: Insert into не реагирует на where

всем доброго времени суток! суть вопроса вообщем то проста, есть магазин цветов и если цветы которые закупили уже есть на складе, то просто добавить количество, иначе создать "на складе" новую запись. проблема в том, что 2 больших слишком запроса я как то не осилил собрать в 1 целый через if или iif, а вот по отдельности на update отрабатывает отлично, а insert работает всегда, в независимости от того исполняеться ли условие или нет.
вижу 2 решения - либо подкоректировать 2-й запрос, либо адекватно обьеденить все в if
ниже показаны запрос1
SQL
1
2
3
UPDATE on_availability SET on_availability.[кількість]=on_availability.[кількість] + purchased_flowers.кількість
FROM purchased_flowers
WHERE (on_availability.[найменування]= purchased_flowers.[найменування] AND on_availability.категорія = purchased_flowers.категорія AND on_availability.[колір квітів] = purchased_flowers.[колір квітів])
и запрос 2(который как раз не правильно работает)
SQL
1
2
3
INSERT INTO on_availability (on_availability.[найменування], on_availability.[кількість], on_availability.[категорія], on_availability.[колір квітів]) VALUES ('Ромашки','12','На зріз','Білий')
SELECT on_availability.найменування, on_availability.[колір квітів],on_availability.категорія,on_availability.кількість FROM on_availability, purchased_flowers
WHERE (on_availability.[найменування]<> purchased_flowers.[найменування] OR on_availability.категорія <> purchased_flowers.категорія OR on_availability.[колір квітів] <> purchased_flowers.[колір квітів])
Буду благодарен за помощь
Ответ: извиняюсь, немного тестового своего кода вам всунул.
если быть точнее, то вот именно такой код
SQL
1
2
3
4
5
6
INSERT INTO 
on_availability (on_availability.[найменування], on_availability.[кількість], on_availability.[категорія], on_availability.[колір квітів]) VALUES ('" + textBox1.Text + "','" + textBox3.Text + "','" + comboBox.Text + "','" + textBox6.Text + "') 
SELECT on_availability.найменування, on_availability.[колір квітів], on_availability.категорія, on_availability.кількість 
FROM on_availability 
WHERE
(on_availability.[найменування] <> '" + textBox1.Text + "' OR on_availability.категорія <> '" + comboBox.Text + "' OR on_availability.[колір квітів] <> '" + textBox6.Text + "')
то есть заполняю форму и на основании результатов своих текстбоксов и юзаю запросы.
форма заганяет 9 полей в таблицу purchased_flowers (то есть таблица поставок), а для таблицы "склад" мне нужно из них 4 по сути. если это поставка цветок которых не было ранее, то нужно создать новую запись.

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

Добавлено через 8 минут
Спасибо большое! тему можно закрывать)
Вопрос: sql server + c# clr

задача:

на стороне sql открыта транзакция внутри которой что то происходит.
внутри этой транзакции нужно вызвать clr процедуру на C# которая что то куда то запишет
и в случае отката транзакции, действия которые были выполнены в процессе работы clr функции
не должны откатится.

для теста накидал метод на C#
для теста накидал матод на C#

.........

namespace Future.SQLCLR
{
public class Exception
{
public static string ConnectionString
{
get
{
//string ret = "context connection = true";//
string ret = "Data Source = server; Initial Catalog = database; Integrated Security = True";
return ret;
}
}


[SqlFunction()]
public static void TestInsert(SqlString inputParam)
{
using (var cn = new SqlConnection(ConnectionString))
{
try
{
cn.ConnectionString = "Enlist=false";

cn.Open();

var cmd = new SqlCommand("insert into table(field)" +
"select field from table_1", cn);

cmd.ExecuteNonQuery();
}
catch (System.Exception)
{

throw;
}
finally
{
cn.Close();
}
}
}
}
.......
}


на sql
CREATE PROCEDURE [audit].[TestInsert]
(
@msg nvarchar(2048)
)
AS EXTERNAL NAME CLR.[SQLCLR.Exception].TestInsert

begin tran

exec [TestInsert] 'msg'

rollback


получаю ошибку System.Data.SqlClient.SqlException: Transaction context in use by another session.[url=][/url]
Ответ:
alexeyvg
alexeyvg
пропущено...
Это третий (или четвёртый?) вариант вашей функции.
В предыдущих я пришёл к такому выводу, анализируя текст.
В последнем варианте всё хорошо, строка соединения передаётся.
Вы же видите разницу между этими двумя вариантами?

using (var connect = new SqlConnection(GetSqlConnectionLocal())) -- создает новое соединение   
const string connectioncString = "Data Source = {0}; Initial Catalog = {1}; Integrated Security = True";

и
const string connectioncString = "Data Source = {0}; Initial Catalog = {1}; Integrated Security = True";
using (var connection = new SqlConnection(ConnectioncString))
Причём вариант в начале топика, который похож на второй образец кода, не будет работать, потому что вы стираете параметры коннекта.

В общем, нужно быть внимательнее, не менять хаотично тексты, отлаживать что то одно :-)