Sql 有史以来最大的风景!我怎样才能减少这个怪物??

Sql 有史以来最大的风景!我怎样才能减少这个怪物??,sql,tsql,join,views,Sql,Tsql,Join,Views,从前,有一个有许多连接的视图: CREATE VIEW [dbo].[V_BIGGEST_VIEW_EVER] AS SELECT {many many columns} FROM (SELECT * FROM dbo.T_CUS_TSK_TASK WHERE is_deleted=0) T INNER JOIN dbo.V_CUS_GRP_GROUP G ON (T.group_id = G.group_id) INNER JOIN dbo.T_BKK_DISCOUNT_TYPE DT

从前,有一个有许多连接的视图:

CREATE VIEW [dbo].[V_BIGGEST_VIEW_EVER]
AS
SELECT {many many columns}
FROM (SELECT * FROM dbo.T_CUS_TSK_TASK WHERE is_deleted=0) T
  INNER JOIN dbo.V_CUS_GRP_GROUP G ON (T.group_id = G.group_id)
  INNER JOIN dbo.T_BKK_DISCOUNT_TYPE DT ON (DT.discount_type_id=T.discount_type_id)
  INNER JOIN dbo.T_BKK_CURRENCY DC ON (T.debit_currency_id=DC.currency_id)
  INNER JOIN dbo.T_BKK_CURRENCY PC ON (T.payback_currency_id=PC.currency_id)
  INNER JOIN dbo.T_BKK_CURRENCY FC ON (T.final_debit_currency_id=FC.currency_id)
  INNER JOIN dbo.T_GLOBAL_COUNTER D1C ON (D1C.company_id=T.company_id AND
    D1C.counter_name='PROFORMA_INVOICE_COUNTER')
  INNER JOIN dbo.T_GLOBAL_COUNTER D2C ON (D2C.company_id=T.company_id AND
    D2C.counter_name='TAX_INVOICE_COUNTER')
  INNER JOIN dbo.T_GLOBAL_COUNTER D3C ON (D3C.company_id=T.company_id AND
    D3C.counter_name='INVOICE_RECEIPT_COUNTER')
  INNER JOIN dbo.T_GLOBAL_COUNTER D4C ON (D4C.company_id=T.company_id AND
    D4C.counter_name='DELIVERY_NOTE_COUNTER')
  INNER JOIN dbo.T_GLOBAL_COUNTER D5C ON (D5C.company_id=T.company_id AND
    D5C.counter_name='BILL_OF_LADING_COUNTER')
  INNER JOIN dbo.T_GLOBAL_COUNTER D6C ON (D6C.company_id=T.company_id AND
    D6C.counter_name='CREDIT_INVOICE_COUNTER')
  LEFT JOIN dbo.V_SYS_BRANCH BR ON (T.branch_id = BR.branch_id)
  LEFT JOIN dbo.T_CUS_TSK_TASKS_ARRAY AR ON (T.array_id = AR.array_id)
  LEFT JOIN dbo.T_DRIVER D ON (T.driver_id = D.driver_id)
  LEFT JOIN dbo.T_VEHICLE V ON (T.vehicle_id = V.vehicle_id)
  LEFT JOIN dbo.T_STF_INVITER I ON (T.inviter_id = I.inviter_id)
  LEFT JOIN dbo.T_STF_SUBCONTRACTOR SC1 ON (SC1.subcontractor_id = D.subcontractor_id)
  LEFT JOIN dbo.T_STF_SUBCONTRACTOR SC2 ON (SC2.subcontractor_id = T.subcontractor_id)
  LEFT JOIN dbo.T_CUS_TSK_TASK_STATUS S ON (S.task_status_id=T.task_status_id)
  LEFT JOIN dbo.V_STF_SUB_LOCATION SL1 ON (SL1.sub_location_id=T.start_sub_location_id)
  LEFT JOIN dbo.V_STF_SUB_LOCATION SL2 ON (SL2.sub_location_id=T.end_sub_location_id)
  LEFT JOIN dbo.T_STF_CUSTOMER CU ON (CU.customer_id=T.customer_id)
  LEFT JOIN dbo.T_STF_CUSTOMER_SPLITTING_CODE SP ON (SP.splitting_id=T.splitting_id)
  LEFT JOIN dbo.V_CUS_TSK_CREDIT_FOR_TASK CR ON CR.task_id=T.task_id
  LEFT JOIN dbo.T_BKK_PROFORMA_INVOICE D1 ON (T.proforma_invoice_id=D1.proforma_invoice_id)
  LEFT JOIN dbo.T_BKK_TAX_INVOICE D2 ON (T.tax_invoice_id=D2.tax_invoice_id)
  LEFT JOIN dbo.T_BKK_INVOICE_RECEIPT D3 ON (T.invoice_receipt_id=D3.invoice_receipt_id)
  LEFT JOIN dbo.T_BKK_DELIVERY_NOTE D4 ON (T.delivery_note_id=D4.delivery_note_id)
  LEFT JOIN dbo.T_BKK_BILL_OF_LADING D5 ON (T.bill_of_lading_id=D5.bill_of_lading_id)
  LEFT JOIN dbo.V_CUS_TSK_CONTAINER CONTAINER1 ON (CONTAINER1.container_id=T.container1_id)
  LEFT JOIN dbo.V_CUS_TSK_CONTAINER CONTAINER2 ON (CONTAINER2.container_id=T.container2_id)
  LEFT JOIN dbo.V_STF_TRAILER TRAILER1 ON (TRAILER1.trailer_id=T.trailer1_id)
  LEFT JOIN dbo.V_STF_TRAILER TRAILER2 ON (TRAILER2.trailer_id=T.trailer2_id)
  LEFT JOIN dbo.T_STF_LUGGAGE_TYPE LUGGAGE_TYPE ON (LUGGAGE_TYPE.luggage_type_id=T.luggage_type_id)
有一天,用户请求视图进行查询:

SELECT {many many columns}
FROM V_BIGGEST_VIEW_EVER
WHERE {column1}=1 AND
      {column2}=2 AND
      .......
      {and so and so}
      .......
      {columnN}=N
这是有史以来最懒惰的观点 5分钟(!!)并且至少返回结果

这些表有主键和外键

如何减少查询执行的时间? 我如何减少这种看法


我在谷歌上搜索过,但是找不到任何帮助。

让我们考虑一下查询是否代表了一个有效的业务需求。

仅仅因为视野大并不意味着它应该表现糟糕。从该视图进行选择的性能主要由基础表的布局决定。如果表
T\u CUS\u TSK\u任务
已为正在执行的查询正确编制索引,则即使视图保留了超过20个查找表,SQL Server也应以毫秒为单位返回结果

您必须像处理任何其他查询优化一样处理此问题。调查哪些主要的IO因素(<代码>设置统计IO在),调查查询计划,查看基数估计,考虑统计是否正确,查看查询缺少索引提示,并考虑如何相应地更改表(Schema)模式。您的起点应该是:。即使粗略地看一下您的表模式(post中未提供),也会发现,如果
deleted
不是最左边的聚集索引键,那么您肯定有问题

你可以看到,目前基于文本对查询进行盲目黑客攻击的做法是完全不专业的


当然,现在很难相信这个查询代表了一个有效的业务需求。但是,尽管如此,您对查询优化和数据模型设计的看法(“那些表有主键和外键”)还是很原始的,用一个温和的术语来说。阅读索引设计,阅读覆盖索引,买一本书(如:)。

让我们考虑一下查询是否代表一个有效的业务需求。< /P> 仅仅因为视野大并不意味着它应该表现糟糕。从该视图进行选择的性能主要由基础表的布局决定。如果表

T\u CUS\u TSK\u任务
已为正在执行的查询正确编制索引,则即使视图保留了超过20个查找表,SQL Server也应以毫秒为单位返回结果

您必须像处理任何其他查询优化一样处理此问题。调查哪些主要的IO因素(<代码>设置统计IO在),调查查询计划,查看基数估计,考虑统计是否正确,查看查询缺少索引提示,并考虑如何相应地更改表(Schema)模式。您的起点应该是:。即使粗略地看一下您的表模式(post中未提供),也会发现,如果
deleted
不是最左边的聚集索引键,那么您肯定有问题

你可以看到,目前基于文本对查询进行盲目黑客攻击的做法是完全不专业的


当然,现在很难相信这个查询代表了一个有效的业务需求。但是,尽管如此,您对查询优化和数据模型设计的看法(“那些表有主键和外键”)还是很原始的,用一个温和的术语来说。阅读索引设计,阅读覆盖索引,买一本书(比如:)。

每个查询都需要来自所有连接的信息吗?哦。我的。上帝我同意马塞洛的问题,真的有必要吗?第三。这太可怕了-让它摆脱痛苦…是的..Sql server不知道用户选择查看哪些项目。我需要所有这些信息来构建一个表示任务的对象(真正大的对象)。大多数连接都是为了获取项目的名称或代码。例如,LEFT JOIN dbo.T\u STF\u INVITER I ON(T.INVITER\u id=I.INVITER\u id)是为了获取邀请者名称和代码。这是一个开始吗?每个查询都需要来自所有连接的信息吗?哦。我的。上帝我同意马塞洛的问题,真的有必要吗?第三。这太可怕了-让它摆脱痛苦…是的..Sql server不知道用户选择查看哪些项目。我需要所有这些信息来构建一个表示任务的对象(真正大的对象)。大多数连接都是为了获取项目的名称或代码。例如,LEFT JOIN dbo.T\u STF\u INVITER I ON(T.INVITER\u id=I.INVITER\u id)是为了获取邀请者名称和代码。这是一个开始吗?。。