Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скорость выполнения INSERT, MSSQL 
:(
    Опции темы
Fish
Дата 2.6.2004, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.6.2004

Репутация: нет
Всего: нет



Как увеличить скорость выполнения команды INSERT?
PM MAIL   Вверх
boevik
Дата 2.6.2004, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 15
Всего: 35



Если есть много Insert-ов, то копай в сторону BulkCopy (bcp) или DTS.


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Fish
Дата 2.6.2004, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.6.2004

Репутация: нет
Всего: нет



INSERT у меня один - медленно работает - 5-7 записей per second.
PM MAIL   Вверх
boevik
Дата 2.6.2004, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 15
Всего: 35



Я имел ввиду сколько записей вставляется в базу.
Может у тебя много индексов или кластер индех в таблице который надо перестраивать после каждой вставки.
Происходит ли вставка с сервера или с клиента через сетку, если да, может сетка тормазит.
И откуда производится Insert?


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Fish
Дата 2.6.2004, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.6.2004

Репутация: нет
Всего: нет



Таблица без индексов, а сетка нипричем, INSERT-то выполняется на серваке.
PM MAIL   Вверх
stron
Дата 2.6.2004, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



Попробуй использовать хранимые процедуры


--------------------
подписи нет
PM ICQ   Вверх
Fish
Дата 2.6.2004, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.6.2004

Репутация: нет
Всего: нет



Если можноstron по конкретней.

PM MAIL   Вверх
stron
Дата 2.6.2004, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



Пишешь хранимую процедуру, которая вставляет данные в таблицы.

Напр., у тебя несколько таблиц и ты по ним распихиваешь данные
делаешь хран. процедуру, кот. всё это делает, а из проги её вызываешь с соотв. параметрами

Чуть позже дам пример



--------------------
подписи нет
PM ICQ   Вверх
Fish
Дата 2.6.2004, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.6.2004

Репутация: нет
Всего: нет



С нетерпением жду.
PM MAIL   Вверх
stron
Дата 2.6.2004, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



А вот и он:
Код

--creating database
IF EXISTS (SELECT *  
   FROM   master..sysdatabases
   WHERE  name = N'PafMike_cars')
DROP DATABASE PafMike_cars
GO
-- если база уже существует, то она удаляется и создаётся новая
--аналог. с таблицами
CREATE DATABASE PafMike_cars
GO


-----------------------------------------------------------------
-----------------------------------------------------------------
--creating tables
--main table
use PafMike_cars
IF EXISTS(SELECT name
  FROM   sysobjects
  WHERE  name = N'cars'
  AND   type = 'U')
   DROP TABLE cars
GO

CREATE TABLE cars (
car_id int IDENTITY(1,1) PRIMARY KEY,
car_type smallint NOT NULL,
car_produser smallint NOT NULL,
car_model varchar(50) NOT NULL,
car_year int DEFAULT 0,
car_params smallint DEFAULT 0,
car_integr int NOT NULL,
car_price bigint DEFAULT 0,
car_saler smallint DEFAULT 0,
)
GO

-----------------------------------------------------------------
--таблица с типами авто
use PafMike_cars
IF EXISTS(SELECT name
  FROM   sysobjects
  WHERE  name = N'car_type'
  AND   type = 'U')
   DROP TABLE car_type
GO

CREATE TABLE car_type (
type_id  smallint IDENTITY(1,1) PRIMARY KEY,
type_def varchar(50) NOT NULL,
)
GO

-----------------------------------------------------------------
--таблица производителей
use PafMike_cars
IF EXISTS(SELECT name
  FROM   sysobjects
  WHERE  name = N'car_produser'
  AND   type = 'U')
   DROP TABLE car_type
GO

CREATE TABLE car_produser (
produser_id  smallint IDENTITY(1,1) PRIMARY KEY,
produser_name varchar(50) NOT NULL,
produser_country varchar(50) NULL,
produser_company varchar(50) NULL,
produser_prestige smallint DEFAULT 1,
)
GO

-----------------------------------------------------------------
--таблица комплектации
use PafMike_cars
IF EXISTS(SELECT name
  FROM   sysobjects
  WHERE  name = N'car_integr'
  AND   type = 'U')
   DROP TABLE car_integr
GO

CREATE TABLE car_integr (
integr_id  int IDENTITY(1,1) PRIMARY KEY,
integr_name varchar(50) NULL,
integr_ABS bit DEFAULT 0,        --АБС
integr_APS bit DEFAULT 0,        --АПС
integr_zamok bit DEFAULT 0,      --центральный замок
integr_sign bit DEFAULT 0,       --сигнализация
integr_mexkpp bit DEFAULT 0,     --механика
integr_autokpp bit DEFAULT 0,    --автоматика
integr_d bit DEFAULT 0,          --дизель
integr_turbo bit DEFAULT 0,      --турбонадув
integr_disks bit DEFAULT 0,      --литые диски
integr_gur bit DEFAULT 0,        --гидроусилитель
integr_bortkomp bit DEFAULT 0,   --борт. комп.
integr_kruise bit DEFAULT 0,     --круиз-контроль
integr_koga bit DEFAULT 0,       --кож. салон
integr_konder bit DEFAULT 0,     --кондиционер
integr_klimat bit DEFAULT 0,     --климат-контроль
integr_parktronic bit DEFAULT 0, --парктроник
integr_elektrika bit DEFAULT 0,  --электрика
)
GO

-----------------------------------------------------------------
--таблица автосалонов
use PafMike_cars
IF EXISTS(SELECT name
  FROM   sysobjects
  WHERE  name = N'car_saler'
  AND   type = 'U')
   DROP TABLE car_saler
GO

CREATE TABLE car_saler (
sale_id  smallint IDENTITY(1,1) PRIMARY KEY,
sale_name varchar(50) NOT NULL,
sale_country varchar(50) DEFAULT 'н/д',
sale_address varchar(50) DEFAULT 'н/д',
sale_tel varchar(20) DEFAULT 'н/д',
)
GO


-----------------------------------------------------------------
--таблица параметров авто
use PafMike_cars
IF EXISTS(SELECT name
  FROM   sysobjects
  WHERE  name = N'car_params'
  AND   type = 'U')
   DROP TABLE car_params
GO

CREATE TABLE car_params (
params_id  smallint IDENTITY(1,1) PRIMARY KEY,
params_envol real DEFAULT 0,
params_maxspeed smallint DEFAULT 0,
params_acceleration real DEFAULT 0,
)
GO

-----------------------------------------------------------------
-----------------------------------------------------------------

-----------------------------------------------------------------
--связывание таблиц

use PafMike_cars
ALTER TABLE cars
ADD CONSTRAINT
FK_cars_car_type FOREIGN KEY (car_type)
REFERENCES car_type(type_id)
GO


use PafMike_cars
ALTER TABLE cars
ADD CONSTRAINT
FK_cars_car_produser FOREIGN KEY (car_produser)
REFERENCES car_produser(produser_id)
GO


use PafMike_cars
ALTER TABLE cars
ADD CONSTRAINT
FK_cars_car_params FOREIGN KEY (car_params)
REFERENCES car_params(params_id)
GO


use PafMike_cars
ALTER TABLE cars
ADD CONSTRAINT
FK_cars_car_saler FOREIGN KEY (car_saler)
REFERENCES car_saler(sale_id)
GO


use PafMike_cars
ALTER TABLE cars
ADD CONSTRAINT
FK_cars_car_integr FOREIGN KEY (car_integr)
REFERENCES car_integr(integr_id)
GO


-----------------------------------------------------------------
-----------------------------------------------------------------
--создание представлений

IF EXISTS (SELECT TABLE_NAME
   FROM   INFORMATION_SCHEMA.VIEWS
   WHERE  TABLE_NAME = N'mincar')
   DROP VIEW mincar
GO

CREATE VIEW mincar
AS
SELECT     dbo.car_type.type_def, dbo.car_produser.produser_name, dbo.cars.car_model, dbo.cars.car_year, dbo.car_params.params_envol,
                     dbo.car_params.params_maxspeed, dbo.car_params.params_acceleration, dbo.cars.car_price, dbo.car_saler.sale_name
FROM         dbo.car_integr INNER JOIN
                     dbo.cars ON dbo.car_integr.integr_id = dbo.cars.car_integr INNER JOIN
                     dbo.car_params ON dbo.cars.car_params = dbo.car_params.params_id INNER JOIN
                     dbo.car_produser ON dbo.cars.car_produser = dbo.car_produser.produser_id INNER JOIN
                     dbo.car_saler ON dbo.cars.car_saler = dbo.car_saler.sale_id INNER JOIN
                     dbo.car_type ON dbo.cars.car_type = dbo.car_type.type_id
GO


-----------------------------------------------------------------
-----------------------------------------------------------------

-----------------------------------------------------------------
--создание хранимой процедуры, обраб. ввод данных

IF EXISTS (SELECT name
   FROM   sysobjects
   WHERE  name = N'insertcar'
   AND    type = 'P')
   DROP PROCEDURE insertcar
GO

CREATE PROCEDURE insertcar
@type_def varchar(50),
@produser_name varchar(50),
@car_model varchar(50),
@car_year int,
@params_envol real,
@params_maxspeed smallint,
@params_acceleration real,
@car_price bigint,
@sale_name varchar(50)
AS
-- получение номера типа авто

DECLARE @type_id smallint
label1:
select @type_id=type_id from dbo.car_type where type_def=@type_def
if (@type_id IS NULL)
begin
insert into dbo.car_type (type_def) values (@type_def)
goto label1
end
-- получение номера производителя

DECLARE @produser_id smallint
label2:
select @produser_id=produser_id from dbo.car_produser where produser_name=@produser_name
if (@produser_id IS NULL)
begin
insert into dbo.car_produser (produser_name) values (@produser_name)
goto label2
end
-- получение номера автосалона
DECLARE @sale_id smallint
label3:
select @sale_id=sale_id from dbo.car_saler where sale_name=@sale_name
if (@sale_id IS NULL)
begin
insert into dbo.car_saler (sale_name) values (@sale_name)
goto label3
end

DECLARE @param_id smallint
DECLARE @integr_id int
insert into dbo.car_integr (integr_name) values ('пусто')
select @integr_id=integr_id from dbo.car_integr where integr_name='пусто'
label4:
select @param_id=params_id from dbo.car_params where @params_envol=params_envol AND @params_maxspeed=params_maxspeed AND @params_acceleration=params_acceleration
if (@param_id IS NULL)
begin
insert into dbo.car_params values (@params_envol,@params_maxspeed,@params_acceleration)
goto label4
end
/*
insert into dbo.car_params values (@params_envol,@params_maxspeed,@params_acceleration)
select @param_id=params_id from dbo.car_params where @params_envol=params_envol AND @params_maxspeed=params_maxspeed AND @params_acceleration=params_acceleration
*/
insert into dbo.cars values (@type_id,@produser_id,@car_model,@car_year,@param_id,@integr_id,@car_price,@sale_id)
go








exec insertcar 'Внедорожник','BMW','X5','2004','4.6','250','6.5','120000', 'Евросиб-авто'
exec insertcar 'ЛИМУЗИН','Mercedes','s600l','2004','6','250','5','240000', 'Логоваз'
exec insertcar 'Седан','Mercedes','s600','2003','6','250','5.6','140000', 'Звезда Невы'
exec insertcar 'Седан','BMW','M5','2004','5','250','5.3','130000', 'Евросиб-авто'

IMHO, это работает быстрее, т.к. sp - штуки компилированные.(не тестил)

ЗЫ: Принимаются идейные замечания по коду



--------------------
подписи нет
PM ICQ   Вверх
Fish
Дата 2.6.2004, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.6.2004

Репутация: нет
Всего: нет



А как процедуру вызывать?
PM MAIL   Вверх
stron
Дата 2.6.2004, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



последние четыре строчки smile.gif


--------------------
подписи нет
PM ICQ   Вверх
Fish
Дата 2.6.2004, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.6.2004

Репутация: нет
Всего: нет



Ну это в самой процедуре.
Цитата
а из проги её вызываешь с соотв. параметрами
А как из проги?

PM MAIL   Вверх
stron
Дата 2.6.2004, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



На всякий случай:
тот исходник который я дал - не только скрипт по созданию процедуры, но и скрипт по созданию базы!
сама же процедура:
Код

CREATE PROCEDURE insertcar
@type_def varchar(50),
@produser_name varchar(50),
@car_model varchar(50),
@car_year int,
@params_envol real,
@params_maxspeed smallint,
@params_acceleration real,
@car_price bigint,
@sale_name varchar(50)
AS
-- получение номера типа авто

DECLARE @type_id smallint
label1:
select @type_id=type_id from dbo.car_type where type_def=@type_def
if (@type_id IS NULL)
begin
insert into dbo.car_type (type_def) values (@type_def)
goto label1
end
-- получение номера производителя

DECLARE @produser_id smallint
label2:
select @produser_id=produser_id from dbo.car_produser where produser_name=@produser_name
if (@produser_id IS NULL)
begin
insert into dbo.car_produser (produser_name) values (@produser_name)
goto label2
end
-- получение номера автосалона
DECLARE @sale_id smallint
label3:
select @sale_id=sale_id from dbo.car_saler where sale_name=@sale_name
if (@sale_id IS NULL)
begin
insert into dbo.car_saler (sale_name) values (@sale_name)
goto label3
end

DECLARE @param_id smallint
DECLARE @integr_id int
insert into dbo.car_integr (integr_name) values ('пусто')
select @integr_id=integr_id from dbo.car_integr where integr_name='пусто'
label4:
select @param_id=params_id from dbo.car_params where @params_envol=params_envol AND @params_maxspeed=params_maxspeed AND @params_acceleration=params_acceleration
if (@param_id IS NULL)
begin
insert into dbo.car_params values (@params_envol,@params_maxspeed,@params_acceleration)
goto label4
end
/*
insert into dbo.car_params values (@params_envol,@params_maxspeed,@params_acceleration)
select @param_id=params_id from dbo.car_params where @params_envol=params_envol AND @params_maxspeed=params_maxspeed AND @params_acceleration=params_acceleration
*/
insert into dbo.cars values (@type_id,@produser_id,@car_model,@car_year,@param_id,@integr_id,@car_price,@sale_id)
go

а вызов этой процедуры находится совсем не в процедуре,
Разницы в её вызове из Query Analyzer и проги НЕТ!!



--------------------
подписи нет
PM ICQ   Вверх
Fish
Дата 3.6.2004, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.6.2004

Репутация: нет
Всего: нет



Цитата
IF EXISTS (SELECT name
  FROM  sysobjects
  WHERE  name = N'insertcar'
  AND    type = 'P')
  DROP PROCEDURE insertcar
GO

stron
Не пойму зачем удалять процедуру.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0902 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.