首页 > 解决方案 > SQL - 使用 Where 子句连接两个视图时查询性能变慢

问题描述

我在 SQL Server 中运行以下查询,它在 5 秒内为我提供了 80,000+ 行和 75+ 列的结果:

SELECT * FROM VIEW_ITEM_STOCK_LEDGER AS ItemLedger
    LEFT JOIN VIEW_PRODUCT_WITH_CHARACTERISTIC_COLUMN_DATA AS Characteristics
    ON Characteristics.Code = ItemLedger.ItemCode

但是当我向查询中添加 WHERE 子句时,执行查询需要很长时间。13450 条记录需要 5 分钟以上。

SELECT * FROM VIEW_ITEM_STOCK_LEDGER AS ItemLedger
    LEFT JOIN VIEW_PRODUCT_WITH_CHARACTERISTIC_COLUMN_DATA AS Characteristics
    ON Characteristics.Code = ItemLedger.ItemCode
WHERE (ItemLedger.VoucherTypeCode=204 OR ItemLedger.VoucherTypeCode=205)

可能是什么原因?我该如何解决这个问题?

标签: sqlsql-serverperformancesql-view

解决方案


在我看来,VoucherTypeCode 列上没有索引。

如果 VoucherTypeCode 是数据库中表的列,您可以尝试为该列建立索引(请参阅这篇关于在 MS Docs 上创建索引的文章

如果 VoucherTypeCode 是多列的产物,您可以尝试索引视图本身(请参阅sqlshack.com 上有关索引视图的这篇文章

或者,如果您不能/不想创建索引,请查看此StackOverflow-Thread中接受的答案


推荐阅读