Sae*_*eid 1 sql sql-server select sql-server-2008-r2
我尝试在SQL中记录每一个东西,所以想想添加一个名为的表log并添加其中的每一个东西,log表是:
ID UNIQUEIDENTIFIER - PKLogDate DATETIME PKIP NVARCHARAction NVARCHARInfo XMLUniqueID BIGINT我记录了以下所有内容:登录,检查权限,查看页面,访问对象和..到此表
然后我想还需要一些Log-Restore 实现,所以有些日志记录是可恢复的,有些不是,Log表有大约8百万条记录,但是可恢复的记录大约有2万条,所以每次我们需要恢复时,需要选择8百万,然后我决定添加新表和添加可恢复日志到这个新表log_restore:
ID 唯一标识符LogDate 约会时间 IP NVARCHARAction NVARCHARInfo XMLUniqueID BIGINT - PK好的,当我需要记录每件事情都没问题.
但是当我需要查看日志时:该过程从log表中获取所有记录并将它们与log_restore表合并(联合).
所以我需要加速这个过程而不影响插入(意味着不要慢),这是我的想法:
添加记录时也log_restore将其添加到log表中(因此在选择时无需联合)
使用此select命令创建视图
添加简单数据类型列而不是XML
在简单的DataType Column Like上添加Clustered PK BIGINT
你有什么想法?有什么建议吗?
一般来说,应尽量使用尽可能少的空间; 它有助于在执行查询时减少磁盘搜索.并且比较较小的数据类型总是需要更少的时间!
可以对列进行以下调整:
LogDate在时间戳的形式(无符号整数,4个字节),而不是DATETIME(8个字节)IP地址不应存储为NVARCHAR; 如果要存储IPv4地址,则4个字节就足够了(BINARY(4)).IPv6支持需要18个字节(VARBINARY(16)).同时,NVARCHAR需要30个字节用于IPv4,78个字节用于IPv6 ...(在网上搜索inet_ntoa,inet_aton,inet_ntop,inet_pton以了解如何在地址的二进制和字符串表示之间切换)RestorableBIT类型的标志列,指示是否可以还原日志条目Info列的想法是正确的:最好使用TEXT或NTEXT数据类型Action,您可以考虑使用Action包含所有可能操作的表(假设它们是有限数量),并使用整数外键引用它们(int越小越好)索引优化也非常重要.如果查询同时测试多个列,请在多个列上使用索引.例如,如果在特定时间范围内选择与特定IP相对应的所有可恢复行,这将大大提高查询的速度:
CREATE NONCLUSTERED INDEX IX_IndexName ON log (Restorable ASC, IP ASC, LogDate ASC)
Run Code Online (Sandbox Code Playgroud)
如果需要在给定的时间范围内从对应于特定操作的IP地址检索所有可还原行,则应选择索引:
CREATE NONCLUSTERED INDEX IX_IndexName ON log (IP ASC, Action ASC, LogDate ASC)
Run Code Online (Sandbox Code Playgroud)
等等.
说实话,我实际上需要查看完整的SQL查询才能进行适当的优化...