【发布时间】:2014-06-19 12:06:09
【问题描述】:
我想知道是否有更快或更好的方法来处理以下情况:
我目前发现自己正在努力优化冗长选择查询的执行时间,我需要为每条记录的每个唯一字段进行左连接(基本上是旋转表)。有没有办法通过单个连接/透视来最小化这种情况,以减少检索数据所需的时间?
我需要准备 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
【问题讨论】:
-
您需要在要加入的列上添加索引。另外,请用您正在使用的 DBMS 标记问题:MySQL、SQL-Server、Oracle 等。
-
我已经在数据库中为相关表建立了索引。
-
您发布了
CREATE TABLE声明,它们没有提及任何索引。发布索引创建语句,以便我们查看您是否有正确的语句。 -
索引已添加到问题中。
标签: mysql sql sql-server