Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Smoke999 Member Откуда: Сообщений: 74 |
Давно хотел разобраться с этим вопросом, все никак руки не доходили. Есть 3 таблицы: 1) Скомпонованные позиции. РК типа bigint 2) Товары - РК типа bigint 3) Состав - с внешними ключами на первые 2 таблицы. Количество записей около 200тыс. Провел 6 тестов с разными типами РК: 1-3) объединение по всем таблицам с РК типа: 1 - bigint-стоимость 29 2 - uniqueidentifier - Newid()-стоимость 55 3 - varchar(150)-NewId()-стоимость 16 4-6) поиск по конкретной позиции с объединением по всем таблицам с РК типа: 4 - bigint -стоимость 39 5 - uniqueidentifier - Newid()-стоимость 31 6 - varchar(150)-NewId()-стоимость 31 Получается что лучше использовать varchar(150) вместо uniqueidentifier? Или я что-то упустил? Вариант с bigint не подходит, так как может быть импорт данных из сторонней бд. Конечно можно использовать uniqueidentifier только для импорта, а дальше проставить внутренние поля bigint и работать с ними, но это более громоздкий вариант. |
22 май 15, 13:38 [17676559] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
стоимость чего 29 ? |
||
22 май 15, 13:41 [17676583] Ответить | Цитировать Сообщить модератору |
Smoke999 Member Откуда: Сообщений: 74 |
стоимость запроса. Я выполнял 3 подряд - общий 100 |
22 май 15, 13:43 [17676600] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А сами планы то вы поняли ? |
||
22 май 15, 13:44 [17676609] Ответить | Цитировать Сообщить модератору |
Smoke999 Member Откуда: Сообщений: 74 |
Структура планов выполнения одинакова, отличаются только стоимость на определенных этапах |
22 май 15, 13:50 [17676657] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Извинте, но после ваших "оно автоматически обновляет", я считаю, что вы не имеете достаточного уровня знаний для вынесения таких суждений |
||
22 май 15, 13:52 [17676672] Ответить | Цитировать Сообщить модератору |
Smoke999 Member Откуда: Сообщений: 74 |
А вы не грубите, пользователь нажимает Enter и данные автоматически обнавляются. То что в коде присутсвтует Edit/insert - post то это было понятно и так. И вы ту тему закрыли, так что не будем возвращаться к ней. Если не хотите помочь по данному вопросу пройдите мимо. А то у вас все ответы такие что "...фу незнает даже такого" а сами ничего не предлагаете. Я понимаю вы тут уже очень много времени, благо количество сообщений ваших говорит о многом, и опыт больше, так если знаете ответ подскажите, нет , или не хотите - лучше вообще не пишите. У вас половина сообщений такие, без обид. |
22 май 15, 14:03 [17676733] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
|
|||
22 май 15, 14:09 [17676785] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
Smoke999,
А что мешает создать внутренний ключ bigint и на него повесить PK? тогда пофигу, что там прислала внешняя помойка. |
||
22 май 15, 14:09 [17676789] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
Smoke999, лично мне структура Вашего вопроса малость не очевидна. Какой тип данных лучше с точки зрения производительности? Для этого было бы неплохо предоставить структуру таблиц и проблемые запросы. Если говорить о том, что типы данных при соединении оказывают влияние на план выполнения - это верно. Что еще? Может это будет полезным для ознакомления - http://habrahabr.ru/post/211885/ |
22 май 15, 14:10 [17676791] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Правда - это не грубость
нуда, нуда, волшебным методом edit-post
Вот когда заведете себе личный форум, то там и будете командовать. А здесь приедтся слушать все ответы
У меня, как и других , не очень много свободного времени. А ваши темы крадут и его. И число моих ответов пропорциально числу таких вопрощающих как вы. Не создавайте подобных тем и число моих ответов уменьшится |
||||||||
22 май 15, 14:10 [17676792] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8302 |
Smoke999, приведите примеры. |
22 май 15, 14:13 [17676827] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
Эти цифры стоимости лажа полная особенно на последних версиях SQL 2012 и 2014. Запрос может быть в 5 раз лучше по стоимости и выполняться в 2 раза дольше. Смотрите на конкретные Read Write CPU Duration. К тому же всё относительно -- запрос может показывать не лучшую производительности при одиночном исполнении, но при этом быть устойчив к сильной фоновой нагрузке. |
||
22 май 15, 14:22 [17676893] Ответить | Цитировать Сообщить модератору |
Smoke999 Member Откуда: Сообщений: 74 |
..ведь я так и написал что можно для импорта, экспорта использовать одни ключи, а внутри программы другие. Тут есть просто двойственность в уникальных данных и при изменении например техкарты, надо проставить 2 ключа, чтобы сохранить связь с внешними бд.
... ваше время оно на то и Ваше, что вы им сами распоряжаетесь. Все закрыли вопрос, а то и эту тему прикроют.
.. да Вы правы. Я постараюсь выложить сейчас структуру бд. |
||||||||
22 май 15, 14:29 [17676939] Ответить | Цитировать Сообщить модератору |
Smoke999 Member Откуда: Сообщений: 74 |
CREATE TABLE [dbo].[MainPositions]( [Posit_ID] [bigint] IDENTITY(1,1) NOT NULL, [Posit_ID_ex1] [uniqueidentifier] NULL, [Posit_ID_ex2] [varchar](150) NULL, [PositName] [varchar](250) NULL, CONSTRAINT [PK_Posit_ID] PRIMARY KEY CLUSTERED ([Posit_ID] ASC)) ON [PRIMARY] CREATE TABLE [dbo].[PosTechList]( [KeyField] [bigint] IDENTITY(1,1) NOT NULL, [CALC_ID] [bigint] NULL, [Posit_ID] [bigint] NULL, [Posit_ID_ex1] [uniqueidentifier] NULL, [Posit_ID_ex2] [varchar](150) NULL) CREATE TABLE [dbo].[Komp_PrcCardsTechDetal]( [KeyField] [bigint] IDENTITY(1,1) NOT NULL, [CALC_ID] [bigint] NULL, [Posit_ID] [bigint] NULL, [Posit_ID_ex1] [uniqueidentifier] NULL, [Posit_ID_ex2] [varchar](150) NULL, [ProductTYPE] [varchar](1) NULL, [Product_ID] [bigint] NULL, [Product_ID_ex1] [uniqueidentifier] NULL, [Product_ID_ex2] [varchar](150) NULL, [Kol_1] [float] NULL, [Kol_2] [float] NULL) CREATE TABLE [dbo].[Products]( [Product_ID] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, [Product_ID_ex1] [uniqueidentifier] NULL, [Product_ID_ex2] [varchar](150) NULL, [ProductName] [varchar](250) NULL, CONSTRAINT [PK_Product_ID] PRIMARY KEY CLUSTERED ([Product_ID] ASC)) ON [PRIMARY] select * from MainPositions left outer join PosTechList on PosTechList.Posit_ID=MainPositions.Posit_ID left outer join PosTechDetal on PosTechDetal.Posit_ID=PosTechList.Posit_ID and PosTechDetal.CALC_ID=PosTechList.CALC_ID LEFT OUTER JOIN Products ON Products.Product_ID=PosTechDetal.Product_ID where MainPositions.Posit_ID=31723 select * from MainPositions left outer join PosTechList on PosTechList.Posit_ID_ex1=MainPositions.Posit_ID_ex1 left outer join PosTechDetal on PosTechDetal.Posit_ID_ex1=PosTechList.Posit_ID_ex1 and PosTechDetal.CALC_ID=PosTechList.CALC_ID LEFT OUTER JOIN Products ON Products.Product_ID_ex1=PosTechDetal.Product_ID_ex1 where MainPositions.Posit_ID_ex1='8C9728C1-6073-4412-8E7F-E7840542C506' select * from MainPositions left outer join PosTechList on PosTechList.Posit_ID_ex2=MainPositions.Posit_ID_ex2 left outer join PosTechDetal on PosTechDetal.Posit_ID_ex2=PosTechList.Posit_ID_ex2 and PosTechDetal.CALC_ID=PosTechList.CALC_ID LEFT OUTER JOIN Products ON Products.Product_ID_ex2=PosTechDetal.Product_ID_ex2 where MainPositions.Posit_ID_ex2='8C9728C1-6073-4412-8E7F-E7840542C506' |
22 май 15, 15:12 [17677288] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Вы предлагаете на пустых таблицах сравнивать соединения для полей у которых есть индексы с полями, у которых нет индексов ? |
22 май 15, 15:25 [17677391] Ответить | Цитировать Сообщить модератору |
Smoke999 Member Откуда: Сообщений: 74 |
declare @i int declare @PosGuid uniqueidentifier declare @ProductGuid uniqueidentifier set @i=50000 while @i<>0 begin set @PosGuid=NEWID(); set @ProductGuid=NEWID(); insert into MainPositions (Posit_ID_ex1,Posit_ID_ex2) values (@PosGuid,@PosGuid) insert into PosTechList (Posit_ID_ex1,Posit_ID_ex2) values (@PosGuid,@PosGuid) insert into Products (Product_ID_ex1,Product_ID_ex2) values (@ProductGuid,@ProductGuid) insert into PosTechDetal (calc_ID,Posit_ID_ex1,Posit_ID_ex2,Product_ID_ex1,Product_ID_ex2) values (1,@PosGuid,@PosGuid,@ProductGuid,@ProductGuid) set @i=@i-1 print @i end; UPDATE PosTechList SET Posit_ID= (SELECT Posit_ID FROM MainPositions WHERE MainPositions.Posit_ID_ex1=PosTechList.Posit_ID_ex1) UPDATE PosTechDetal SET Posit_ID= (SELECT Posit_ID FROM MainPositions WHERE MainPositions.Posit_ID_ex1=PosTechDetal.Posit_ID_ex1) UPDATE PosTechDetal SET Product_ID= (SELECT Product_ID FROM Products WHERE Products.Product_ID_ex1=PosTechDetal.Product_ID_ex1) таблицы урезаны, остались только главные поля |
22 май 15, 15:33 [17677467] Ответить | Цитировать Сообщить модератору |
felix_ff Member Откуда: Moscow Сообщений: 1688 |
Smoke999, вы опирались на стоимость выполнения запросов использую конструкции? SELECT * ... к тому же в вашей структере индексым полем считается только Posit_ID, Product_ID но на других таблицах я индексирования таких полей не вижу, смысла пытаться играться с типом поля пока не существует нормальной структуры таблиц нет |
22 май 15, 15:34 [17677492] Ответить | Цитировать Сообщить модератору |
Smoke999 Member Откуда: Сообщений: 74 |
CREATE NONCLUSTERED INDEX [Posit_ID] ON [dbo].[PosTechList] ( [Posit_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Posit_ID_ex1] ON [dbo].[PosTechList] ( [Posit_ID_ex1] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Posit_ID_ex2] ON [dbo].[PosTechList] ( [Posit_ID_ex2] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Posit_ID] ON [dbo].[MainPositions] ( [Posit_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Posit_ID_ex1] ON [dbo].[MainPositions] ( [Posit_ID_ex1] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Posit_ID_ex2] ON [dbo].[MainPositions] ( [Posit_ID_ex2] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Posit_ID] ON [dbo].[PosTechDetal] ( [Posit_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Posit_ID_ex1] ON [dbo].[PosTechDetal] ( [Posit_ID_ex1] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Posit_ID_ex2] ON [dbo].[PosTechDetal] ( [Posit_ID_ex2] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Product_ID] ON [dbo].[PosTechDetal] ( [Product_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Product_ID_ex1] ON [dbo].[PosTechDetal] ( [Product_ID_ex1] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Product_ID_ex2] ON [dbo].[PosTechDetal] ( [Product_ID_ex2] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Product_ID] ON [dbo].[Products] ( [Product_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Product_ID_ex1] ON [dbo].[Products] ( [Product_ID_ex1] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [Product_ID_ex2] ON [dbo].[Products] ( [Product_ID_ex2] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO |
22 май 15, 15:38 [17677521] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
Очень сильно напрягает использование Вами большого количества BIGINT в которых зачастую нету насущной необходимости. INT/SMALLINT как-то по кошернее будет выглядеть и, как минимум сократит, кол-во чтений из Buffer Pool-а и размеры Ваших таблиц. Далее. Типы данных тут не помогут кардинально что-то поменять. На таблицах у Вас нет покрывающих индексов. |
22 май 15, 15:41 [17677555] Ответить | Цитировать Сообщить модератору |
Smoke999 Member Откуда: Сообщений: 74 |
Нет, забыл индексы скинуть. Я не опирался на *, я ведь написал что таблицы урезаны, и толку от того что перечислять еще 15 полей которых нет. Иначе пришлось бы их еще чем-то заполнять. В запросе есть еще обьединение со справочниками, но они не влияют на результат поэтому я их удалил. |
22 май 15, 15:42 [17677563] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ничего, что у вас одни индексы кластерные, а дргие некластерные ? Ничего, что у вас все индексы существуют одновременно ? |
||
22 май 15, 15:45 [17677580] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
Помните я сбрасывал ссылочку на Хабр. Так вот - лично я придерживаюсь практики минимальной избыточности типов данных. Мне лично это часто выручает. Как-то раз я был свидетелем когда для поля "М/Ж" коллега использовал тип bigint с аргументацией - "типа я вычитал где-то что это быстрее при соединении" Мораль: Правильно нужно проектировать таблицы. Попробуйте вместе bigint/uniqueidentifier/varchar юзать int. Далее посмотрите на план запроса. Возможно имеет смысл индексы добавить по полям на которых у Вас происходят соединения. Выкинуть из таблиц лишние столбцы либо сделать денормализацию таблиц. |
22 май 15, 15:49 [17677602] Ответить | Цитировать Сообщить модератору |
Smoke999 Member Откуда: Сообщений: 74 |
Glory, да, это по запарке, я у себя их для эксперементов запретил и работали только не кластерные. AlanDenton, bigint на int впринципе можно поменять. а некоторые данные на smallint. Не думаю что это даст большой прирост, но попробую вечером что получится. Спс что обратили внимание на это. |
22 май 15, 15:54 [17677635] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
все вместе ? |
||
22 май 15, 15:56 [17677664] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |