c# - 由于性能问题,无法使用 SQL Server 数据长度函数获取数据
问题描述
我的数据库中有一个文档表。文档表结构就像
CREATE TABLE [dbo].[Documents]
(
[DocumentId] [BIGINT] NOT NULL IDENTITY(1, 1),
[ObjectType] [VARCHAR](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[ObjectId] [BIGINT] NOT NULL,
[DocumentName] [VARCHAR](250) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[DocumentFile] [VARBINARY](MAX) NOT NULL,
[isTemp] [BIT] NOT NULL CONSTRAINT [DF_Documents_isTemp] DEFAULT ((0)),
[IsActive] [BIT] NOT NULL,
[RowGuid] [UNIQUEIDENTIFIER] NOT NULL CONSTRAINT [DF_Documents_RowGuid] DEFAULT (newid()),
[CreatedBy] [BIGINT] NOT NULL,
[CreatedOn] [DATETIME] NOT NULL,
[UpdatedBy] [BIGINT] NULL,
[UpdatedOn] [DATETIME] NULL
)
GO
-- Constraints and Indexes
ALTER TABLE [dbo].[Documents]
ADD CONSTRAINT [PK_Documents]
PRIMARY KEY CLUSTERED ([DocumentId])
GO
CREATE NONCLUSTERED INDEX [ix_DocumentName]
ON [dbo].[Documents] ([DocumentName])
GO
CREATE NONCLUSTERED INDEX [ix_ObjectId]
ON [dbo].[Documents] ([ObjectId])
GO
CREATE NONCLUSTERED INDEX [ix_ObjectType]
ON [dbo].[Documents] ([ObjectType])
GO
在文档表中有 100k 条记录。
这是基于 objectid 获取单个文档的 C# 方法。
public IQueryable<Document> GetDocumentData(long objectId, string objectType)
{
var searchResults = new MerrickEntities().Documents.Where(c => c.ObjectId == objectId && c.ObjectType == objectType && SqlFunctions.DataLength(c.DocumentFile) > 0);
return searchResults.AsQueryable();
}
在此查询中未获取数据,似乎问题是由 datalength 函数引起的。
如何优化此查询?
解决方案
推荐阅读
- python - SVM、MLP 等可以对多变量时间序列问题进行分类吗?
- java - maven 项目无法解析原型
- r - ggplot2 scale_x_discrete 导致我的 x 轴消失?
- database - 在全专业化中是否可以与更高级别的实体建立关系?
- reactjs - 我们可以使用类组件作为 React 中功能组件的子组件吗?
- google-cloud-platform - 在 Stackdriver 中设置新的正常运行时间检查时出错
- plsql - Oracle SQL Developer 和代码/行更改指示器
- javascript - 在外面关闭模态窗口并在里面有可点击的链接
- job-scheduling - 轮班最少护士
- sql - 是否可以将表别名附加到列名以找出列的来源?