Оптимизация запроса выбора левого соединения для больших данных в SQL

#mysql #sql #sql-server

#mysql #sql #sql-сервер

Вопрос:

Я хотел бы знать, есть ли более быстрый или лучший способ справиться со следующей ситуацией:

В настоящее время я пытаюсь оптимизировать время выполнения длинного запроса выбора, где мне нужно создавать левые соединения для каждого уникального поля для каждой записи (в основном поворачивая таблицу).). Есть ли способ минимизировать это с помощью одного соединения / поворота, чтобы сократить время, затрачиваемое на извлечение данных?

Мне нужно предусмотреть 50 пользовательских полей, время ожидания которых истекает для 30000 нечетных записей (это с индексами в соответствующих столбцах)

Я был бы признателен за любую помощь (включая исправление заголовка, поскольку я не уверен, как сформулировать это иначе) Заранее спасибо.

Ниже приведен код для настройки небольшого примера:

 Create Table CustomField (
ID int identity (1,1) Not Null,
FieldName varchar(50) Not null,
FieldOrderNumber int Not Null);

ALTER TABLE [dbo].[CustomField] ADD  CONSTRAINT [PK_CustomField] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
  

Вперед

 Create Table FieldValue (
ID int identity (1,1) Not Null,
CustomFieldID int Not Null,
PersonID int Not Null, 
FieldValue varchar(50));

ALTER TABLE [dbo].[FieldValue ] ADD  CONSTRAINT [PK_FieldValue] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
  

Вперед

 Create Table Person (
ID int identity (1,1) Not Null,
PersonName varchar (50) Not Null);

ALTER TABLE [dbo].[Person] ADD  CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
  

Вперед

 Insert into Person (PersonName)
Values ('Marc');

Insert into Person (PersonName)
Values ('John');

Insert into CustomField (FieldName, FieldOrderNumber)
Values ('BloodType',1);

Insert into CustomField (FieldName, FieldOrderNumber)
Values ('EyeColour',2);

Insert into FieldValue (CustomFieldID , PersonID, FieldValue)
Values (1,1, 'A ');

Insert into FieldValue (CustomFieldID , PersonID, FieldValue)
Values (1,2, 'O-');

Insert into FieldValue (CustomFieldID , PersonID, FieldValue)
Values (2,1, 'Blue');

Insert into FieldValue (CustomFieldID , PersonID, FieldValue)
Values (2,2, 'Hazel');



WITH ListFieldValues (FieldOrderNumber, FieldName, PersonID, FieldValue)
AS
(
SELECT cf.FieldOrderNumber, cf.FieldName, fv.PersonID, fv.FieldValue
FROM CustomField cf LEFT JOIN FieldValue fv ON cf.ID = fv.CustomFieldID
)


SELECT p.ID,
    p.PersonName,
    lvf.FieldValue AS Column1, --Bloodtype
    lvf2.FieldValue as Column2 --EyeColour    
FROM Person p 
LEFT JOIN ListFieldValues lvf ON p.ID = lvf.PersonID and lvf.FieldOrderNumber =1 
LEFT JOIN ListFieldValues lvf2 on p.ID = lvf2.PersonID and lvf2.FieldOrderNumber = 2  
  

Комментарии:

1. Вам нужно добавить индексы к столбцам, к которым вы присоединяетесь. Кроме того, пожалуйста, укажите в вопросе СУБД, которую вы используете: MySQL, SQL-Server, Oracle и т.д.

2. У меня уже есть индекс в базе данных для соответствующих таблиц, о которых идет речь.

3. Вы опубликовали CREATE TABLE инструкции, в них не упоминаются какие-либо индексы. Опубликуйте инструкции по созданию индекса, чтобы мы могли видеть, есть ли у вас правильные.

4. К вопросу добавлены индексы.

Ответ №1:

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

Комментарии:

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