时,我有一个查询,或者批量查询,那我就不能得到发挥好:)SQL Server性能问题加入
SELECT
C.ID AS cust_id,
C.State AS cust_state,
C.PrevState AS cust_previous_state,
C.ProjectID AS cust_imported_on_project_id,
C.CampaignID AS cust_imported_on_campaign_id,
C.Priority AS cust_priority,
C.Name AS cust_firstname,
C.Name2 AS cust_lastname,
C.AllocatedUser AS cust_allocated_user,
C.ED1 AS cust_social_security_number,
C.ED2 AS cust_customer_number,
C.ED3 AS cust_type,
C.ED4 AS cust_initial_fact_1,
C.ED5 AS cust_initial_fact_2,
C.ED6 AS cust_initial_fact_3,
C.ED7 AS cust_initial_fact_4,
C.ED8 AS cust_initial_fact_5,
C.ED9 AS cust_extra_1,
C.ED10 AS cust_extra_2,
CED2.ED11 AS cust_extra_3,
CED2.ED12 AS cust_extra_4,
CED2.ED13 AS cust_extra_5,
A.Serial AS address_serial,
A.PostAddress AS address_postal_address,
A.PostCode AS address_postal_code,
A.PostOffice AS address_city,
A.PhoneNr AS address_phonenumber,
A.FaxNr AS address_faxnumber,
A.EMail AS address_email,
A.Notes AS address_notes,
A.ED1 AS address_secondary_phonenumber,
A.ED2 AS address_origin_file,
A.State AS address_state
FROM TCustomers C WITH (NOLOCK)
LEFT JOIN TCustED2 CED2 WITH (NOLOCK) ON C.ID = CED2.CustomerID
LEFT JOIN TAddresses A WITH (NOLOCK) ON C.AddressNr = A.Serial AND C.ID = A.CustomerID
WHERE C.CampaignID IN(SELECT items FROM dbo.Split('196,195,210,206,205,207,204,200,209,213,197,198,214', ',')) AND C.InsDate > '2011-04-03 00:00:00'
该查询本身是非常快和执行上万+行几秒钟。 问题是,我想使用订单表中的信息来过滤我的结果。
我曾尝试加入Orders表
SELECT
C.ID AS cust_id,
C.State AS cust_state,
C.PrevState AS cust_previous_state,
C.ProjectID AS cust_imported_on_project_id,
C.CampaignID AS cust_imported_on_campaign_id,
C.Priority AS cust_priority,
C.Name AS cust_firstname,
C.Name2 AS cust_lastname,
C.AllocatedUser AS cust_allocated_user,
C.ED1 AS cust_social_security_number,
C.ED2 AS cust_customer_number,
C.ED3 AS cust_type,
C.ED4 AS cust_initial_fact_1,
C.ED5 AS cust_initial_fact_2,
C.ED6 AS cust_initial_fact_3,
C.ED7 AS cust_initial_fact_4,
C.ED8 AS cust_initial_fact_5,
C.ED9 AS cust_extra_1,
C.ED10 AS cust_extra_2,
CED2.ED11 AS cust_extra_3,
CED2.ED12 AS cust_extra_4,
CED2.ED13 AS cust_extra_5,
A.Serial AS address_serial,
A.PostAddress AS address_postal_address,
A.PostCode AS address_postal_code,
A.PostOffice AS address_city,
A.PhoneNr AS address_phonenumber,
A.FaxNr AS address_faxnumber,
A.EMail AS address_email,
A.Notes AS address_notes,
A.ED1 AS address_secondary_phonenumber,
A.ED2 AS address_origin_file,
A.State AS address_state
FROM TCustomers C WITH (NOLOCK)
LEFT JOIN TCustED2 CED2 WITH (NOLOCK) ON C.ID = CED2.CustomerID
LEFT JOIN TAddresses A WITH (NOLOCK) ON C.AddressNr = A.Serial AND C.ID = A.CustomerID
LEFT JOIN TOrders O WITH (NOLOCK) ON C.ID = O.CustomerID
WHERE C.CampaignID IN(SELECT items FROM dbo.Split('196,195,210,206,205,207,204,200,209,213,197,198,214', ',')) AND
(C.InsDate > '2011-04-03 00:00:00' OR O.CustomerID NOT NULL OR O.[Date] > '2011-04-03 00:00:00' OR O.Exported IS NULL);
这导致数分钟的执行时间。 如果我只是从TOrders
运行有趣的部分,它只需要几秒钟执行。
SELECT CustomerID
FROM TOrders
WHERE O.CustomerID NOT NULL
OR O.[Date] > '2011-04-03 00:00:00'
OR O.Exported IS NULL;
所以问题是当两者结合时。我试着运行查询并直接将生成的CustomerID粘贴到主查询中,这很快捷,大约需要5-10秒。我尝试从TOrders预取有趣的数据并将其放入临时表中,但这并没有让它变得更快。
CREATE TABLE #ORDERCUSTOMERS (
CustomerID int
);
CREATE UNIQUE CLUSTERED INDEX IX_1 on #ORDERCUSTOMERS (CustomerID);
INSERT #ORDERCUSTOMERS SELECT DISTINCT O.CustomerID FROM LPD1_8.dbo.TOrders O WHERE O.CampaignID IN(SELECT items FROM dbo.Split('196,195,210,206,205,207,204,200,209,213,197,198,214', ',')) AND (O.[Date] > '2011-04-03 00:00:00' OR O.Exported IS NULL);
SELECT
C.ID AS cust_id,
C.State AS cust_state,
C.PrevState AS cust_previous_state,
C.ProjectID AS cust_imported_on_project_id,
C.CampaignID AS cust_imported_on_campaign_id,
C.Priority AS cust_priority,
C.Name AS cust_firstname,
C.Name2 AS cust_lastname,
C.AllocatedUser AS cust_allocated_user,
C.ED1 AS cust_social_security_number,
C.ED2 AS cust_customer_number,
C.ED3 AS cust_type,
C.ED4 AS cust_initial_fact_1,
C.ED5 AS cust_initial_fact_2,
C.ED6 AS cust_initial_fact_3,
C.ED7 AS cust_initial_fact_4,
C.ED8 AS cust_initial_fact_5,
C.ED9 AS cust_extra_1,
C.ED10 AS cust_extra_2,
CED2.ED11 AS cust_extra_3,
CED2.ED12 AS cust_extra_4,
CED2.ED13 AS cust_extra_5,
A.Serial AS address_serial,
A.PostAddress AS address_postal_address,
A.PostCode AS address_postal_code,
A.PostOffice AS address_city,
A.PhoneNr AS address_phonenumber,
A.FaxNr AS address_faxnumber,
A.EMail AS address_email,
A.Notes AS address_notes,
A.ED1 AS address_secondary_phonenumber,
A.ED2 AS address_origin_file,
A.State AS address_state
FROM LPD1_8.dbo.TCustomers C WITH (NOLOCK)
LEFT JOIN LPD1_8.dbo.TCustED2 CED2 WITH (NOLOCK) ON C.ID = CED2.CustomerID
LEFT JOIN LPD1_8.dbo.TAddresses A WITH (NOLOCK) ON C.AddressNr = A.Serial AND C.ID = A.CustomerID
LEFT JOIN #ORDERCUSTOMERS O ON C.ID = O.CustomerID
WHERE C.CampaignID IN(SELECT items FROM dbo.Split('196,195,210,206,205,207,204,200,209,213,197,198,214', ',')) AND
(C.InsDate > '2011-04-03 00:00:00' OR O.CustomerID NOT NULL);
DROP TABLE #ORDERCUSTOMERS;
那么你们有什么想法吗?这将驻留在一个存储过程中,所以我想尽可能避免动态SQL。否则,这可能是一种方法,从TOrders获取数据并将返回的CustomerID注入主查询的IN子句中。 但是,可能还有一种类似的方法来将一个id数组“注入”IN子句或其他东西?
也许你可以先试试你的查询分析工具。 – RollingBoy 2011-04-05 07:35:42