我最近不得不将表格的一个列定义从nvarchar
转换为varchar
。从那以后,我可以感觉到通过表格的搜索数据变慢了。
我在表格中有4200000多行并且正在增长。
我的网络应用目前不使用存储过程从数据库中检索数据。如果我使用存储过程,它会略微提高搜索性能吗?
或者你有什么其他建议可以改进吗?
以下是目前使用的查询:
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))
我不明白索引部分。
答案 0 :(得分:4)
我不知道索引部分,所以我想我没有在数据库中做任何索引。
处理数据库性能时最重要的一点是 INDEXES 。
在(callerID, id DESC)
上添加index。
您的查询会更快, MUCH 更快。
您还可以在SSMS中运行查询,然后按“估计的查询计划”,它很可能会带有缺失的索引警告。您几乎可以复制并粘贴此警告并运行它。您需要更改的唯一内容是索引的名称。
答案 1 :(得分:1)
编辑:将查询放入存储过程不会自动带来更好的性能。 因此,如果您可以使用“简单的SELECT语句”检索所需的所有数据,请执行此操作。
但是你应该检查并最终修复你的数据库。
DBCC CHECKDB('<db_name>') -- check the db for error
DBCC UPDATEUSAGE('<db_name>') -- fix errors
同样重要的是创建相关索引!
编辑:在您发布查询之后:在CalledId上添加索引。
检查SQL SELECTS,检查WHERE语句中的columsn并为其添加索引。这应该会有很大改善!
答案 2 :(得分:1)
如果您的索引针对varchar
且查询包含Nvarhchar
,那么此类索引将被忽略。您需要同步所有使用的类型(在任何地方都相同)和重建索引,例如:
ALTER INDEX IX_msgSent ON tbl_activitylog REBUILD