sql - sql查询速度慢如何优化
问题描述
在此处输入图像描述 这是我的查询的执行计划
我想优化查询我的表结构如下
SELECT DISTINCT
c.transaction_id,
c.property_id,
c.ward_id,
w.ward_no,
c.holding_no,
c.collector_id,
t.payment_mode,
t.date,
t.payment_ref,
t.dd_date,
t.bank_name,
t.branch,
t.amount,
t.discount,
t.transaction_no,
t.pos_no,
t.sms_status,
t.remarks,
ch.id AS cheque_id,
ch.check_no,
ch.bank,
ch.check_date,
ch.amount AS chk_amount,
ch.reconcilation_date,
ch.chk_status,
ch.status AS isValid,
ch.bank_reconcilation_date,
t.penalty
FROM
dbo.tbl_collection_master AS c
INNER JOIN dbo.tbl_transaction_master AS t
ON c.transaction_id = t.id
LEFT OUTER JOIN dbo.tbl_cheque_details AS ch
ON t.id = ch.transaction_id
left join tbl_Ward_Master w
on c.ward_id = w.id
解决方案
有几种方法可以解决这个问题。
首先,您可以从查询中删除 distinct 子句。这会立即提高性能,然后您可以对应用程序代码/excel/用于移动此数据的任何输出中的唯一性进行排序。
其次(如果还没有的话)你可以在你用来加入的 id 列上创建聚集索引。您还可以在查询中包含的其他列上包含非聚集索引(不要创建包含表中每一列的非聚集索引,因为这会使索引无用)。
第三,您可以在选择中包含更少的列,然后根据返回的值,您可以执行进一步的查询以获取剩余信息。这种方法将使您的初始加载更快,但总体而言,获取所有数据需要更长的时间。
推荐阅读
- amazon-web-services - AWS Lambda 是否严格按顺序处理 DynamoDB 流事件?
- jetty - Jetty websockets 和 abstracthandler
- microsoft-graph-api - Office365 API 没有说明日历是否在用户视图中被选中/启用/可见?
- angular - Angular 4 将服务响应值传递给多个组件
- javascript - 使用快捷键在angular6中聚焦可编辑项目的方法是什么?
- c# - 如何在运行时摆脱 DataGridView 行中的这一设计时行?
- c# - 给定 CEST(德国)中的 DateTime,需要知道 EST 时间(包括 DST)
- swift - 从 URL 对 UIImage 进行单元测试
- docopt - 在 docopt 中指定一个选项一次或多次
- python - 如何让笔记本输出始终采用单元格格式以便于粘贴 Excel?