2009-07-09 52 views
0

我得到了一个在我的SQL Server上运行的应用程序,该应用程序开始减慢特定的任务。我运行了SQL Profiler并注意到以下查询需要花费大量的时间(1-2分钟)。 我无权访问代码来更改查询。
有什么我可以调整/更改数据库中?以下声明中的PC10000表格大约为。 119000条记录。我也有执行计划。调慢SQL查询

SELECT TOP 25 
    zProjectID, zTaskID, zTransactionNumber, zTransactionDate, zUserID, 
    zCostCategoryDDL, zCostCategoryString, zSubCostCategory, zSubCostCategoryString, 
    zDepartmentID, zJournalEntry, zPostingDate, zSalesPostingDate, zPeriodNumber, 
    zTransactionDescription, zBillingDescriptionLine1, zBillingDescriptionLine2, 
    zBillingDescriptionLine3, zBillingDescriptionLine4, zSalesAccountIndex, 
    zSalesAccountString, zDistDocumentTypeDDL, zDistDocumentNumber, zDistSequenceNumber, 
    zSalesDocumentTypeDDL, zSalesDocumentNumber, zSalesLineNumber, zDistHistoryYear, 
    zSeriesDDL, zSourceDoc, zWebSource, zOrigDocumentNumber, zOrigDocumentDate, 
    zOrigID, zOrigName, zExpenseStatusDDL, zApprovalUserIDCost, zAccountIndex, 
    zAccountNumberString, zBillingStatusDDL, zApprovalUserIDBilling, zBillingWorkQty, 
    zBillingWorkAmt, zQty, zQtyBilled, zUnitCost, 
    zUnitPrice, zRevenueAmt, zOriginatingRevenueAmt, zCostAmtEntered, zCostAmt, 
    zOriginatingCostAmt, zPayGroupID, zPayrollStatusDDL, zTotalTimeStatusDDL, 
    zEmployeeID, zHoursEntered, zHoursPaid, zPayRecord, zItemID, zItemDescription, 
    zUofM, zItemQty, zBurdenStatusDDL, zUserDefinedDate, zUserDefinedDate2, 
    zUserDefinedString, zUserDefinedString2, zUserDefinedCurrency, 
    zUserDefinedCurrency2, zNoteIndex, zImportType, DEX_ROW_ID 
FROM 
    DBServer.dbo.pc10000 
WHERE 
    (zDistDocumentNumber in 
     (select cast(JRNENTRY as varchar(20)) 
      from DBServer..GL10001 
      where BACHNUMB = 'PMCHK00004283') 
    or zSalesDocumentNumber in 
     (select cast(JRNENTRY as varchar(20)) 
      from DBServer..GL10001 
      where BACHNUMB = 'PMCHK00004283')) 
ORDER BY 
    zProjectID ASC ,zTaskID ASC ,zTransactionNumber ASC 

alt text

+0

你可以让你没有访问代码更明确的问题,即粗体。 – pjp 2009-07-09 14:50:00

+1

修改为强调他无法更改查询的事实。 – 2009-07-09 14:51:24

+0

为什么不能编辑代码。查询是否通过存储过程运行? – pjp 2009-07-09 14:57:20

回答

6

您看到的最大问题是由于缺乏合适的索引。 您可以看到,因为执行计划中存在表扫描。

表扫描打击性能,因为它们表示正在扫描整个表以匹配查询中给定子句的数据。

我建议你上BACHNUMB在GL10001

您也可以尝试在PC10000上zDistDocumentNumber和zSalesDocumentNumber索引添加索引,但我觉得GL10001指标是最主要的一个。

与其他技术相比,“IN”子句通常相当昂贵,但由于您无法更改查询本身,因此您无能为力。

毫无疑问,你需要添加合适的索引

3

查询是做对GL10001表2次表扫描。从快速查看查询(这有点难以阅读),我会看看您是否在BACHNUMB列上有索引。

0

你可以重写这些子选择的加盟,并添加索引到GP01..GL10001上BACHNUMB和JRNENTRY

0

既然你无法改变的查询,你能做的最好的事情是确保您在用于连接(和子查询)的列上有索引。如果你能想到一个更好的查询计划,你可以将它提供给SQL Server,而不是让它自己计算(这是非常罕见的情况)。

1

的执行计划显示很清楚,实际上定位行是什么把所有的时间(没有繁琐的书签查找,或聚合/重新安排任务),所以它的相当肯定会成为索引问题。将表扫描悬停在执行计划中,并检查工具提示中的“对象”,以查看正在使用哪些列。看到它们被索引。

您可能还想运行跟踪以采样一些实时数据,并将其提供给数据库调整顾问。

0

更换UNION两个所有查询这应该让这些线轴的拍摄

即像这样的东西

SELECT .... 

(zDistDocumentNumber in 
    (select cast(JRNENTRY as varchar(20)) 
     from DBServer..GL10001 
     where BACHNUMB = 'PMCHK00004283') 

UNION ALL 

SELECT ... 

zSalesDocumentNumber in 
    (select cast(JRNENTRY as varchar(20)) 
     from DBServer..GL10001 
     where BACHNUMB = 'PMCHK00004283')) 
0

除了添加索引,一旦运行该查询,您也可以将IN语句转换为EXISTS ...沿着这些线:

SELECT TOP 25 .... 
FROM GP01.dbo.pc10000 parent 
WHERE EXISTS 
    (
    SELECT child.* 
    FROM GP01..GL10001 child 
    WHERE BACHNUMB = 'PMCHK00004283' 
     and parent.zDistDocumentNumber = child.JRNENTRY 
    ) 
    OR EXISTS 
    (
    SELECT child2.* 
    FROM GP01..GL10001 child2 
    WHERE BACHNUMB = 'PMCHK00004283' 
     and parent.zSalesDocumentnumber = child2.JRENTRY 
    ) 
ORDER BY zProjectID ASC ,zTaskID ASC ,zTransactionNumber ASC