3

我最近不得不将表的列定义之一转换为nvarcharfrom varchar。从那以后,我可以感觉到通过表搜索数据变得更慢了。

我在表中有 4200000+ 行并且还在增长。

我的 Web 应用程序当前不使用存储过程从数据库中检索数据。如果我使用存储过程,它会稍微提高搜索性能吗?

或者你有什么其他的建议可以改进吗?

这是现在使用的查询:

SELECT TOP 100 id, callerID, dateTime, activity, senderNum, msgSent, smsgRespond, msgIn 
FROM tbl_activitylog 
WHERE callerID = @callerID 
ORDER BY id DESC

该列msgSent是转换为 nvarchar 的列。

下面是表结构:

id (int, Primary Key, Auto Increment)  
callerID (bigint)  
dateTime (datetime)  
activity (varchar(50)  
senderNum (int)  
msgSent (nvarchar(160))  
smsgRespond (varchar(50))  
msgIn (varchar(160))  

我不明白索引部分。

4

3 回答 3

4

我不知道索引部分,所以我想我没有在数据库中做任何索引。

处理数据库性能时最重要的第一件事是INDEXES

在 上添加索引(callerID, id DESC)

您的查询会快得多

您还可以在 SSMS 中运行查询,然后按“估计的查询计划”,它很可能会出现缺少索引的警告。您实际上可以复制并粘贴此警告并运行它。您唯一需要更改的是索引的名称。

于 2012-05-12T07:41:51.073 回答
1

编辑:将您的查询放入存储过程不会自动为您带来更好的性能。因此,如果您可以使用“简单的 SELECT 语句”检索所需的所有数据,请这样做。

但是您应该检查并最终修复您的数据库。

DBCC CHECKDB('<db_name>') -- check the db for error
DBCC UPDATEUSAGE('<db_name>') -- fix errors

同样重要的是创建相关索引!

编辑:当您发布查询后:在 CalledId 上添加索引。

检查您的 SQL SELECTS,检查您的 WHERE 语句中有哪些列并为它们添加索引。这应该会改善很多!

于 2012-05-12T07:03:03.790 回答
1

如果你有一个索引varchar并且查询包含Nvarhchar,那么这样的索引将被忽略。您需要同步所有使用的类型(在任何地方都相同)并重建索引,例如:

ALTER INDEX IX_msgSent ON tbl_activitylog REBUILD
于 2012-05-12T08:05:01.090 回答