我有一个非常巨大的日志。 (百万行)使用binary_checksum()来表示URL或类似字符串的限制?
LogTable
-------
ID
DATE
BASEURL
QUERYSTRING
USER
REFERRER
USERAGENT
SERVER
我想通过标准化数据来减少这张表。 (苗条的尺寸)
我知道了!我知道!日志应该是超快速插入。另一方面,日志表如此巨大,维护计划变得越来越难看。所以我只关注高度重复的列,如BASEURL,USER,SERVER和USERAGENT。
现在,我知道日志仍然必须要快,所以我不想做字符串比较,这导致我的问题:
我可以依靠的LogTable存储
binary_checksum(COLUMN_VALUE)
,并保持COLUMN_VALUE到其独立表中的校验和映射?
在我的应用程序中,我会保留映射的缓存,所以我不需要返回数据库服务器的每个请求。 (只有当我有一个新的校验和值时,我需要插入到映射表中。)
主要目标是能够在表上运行一些简单的分析查询,以及不需要提取数据彻底研磨数据库(和我的应用程序)停下来。
这里有一个简单的查询,例如:
select
count(1)
, [user] /* This is a checksum value, which I can lookup in my cache */
from
LogTable
where date between @from and @to
group by [user]
你觉得呢?这个校验和接近吗?
编辑:
- 我所有的列是VARCHAR(2000)或更小。
- 我假设它也允许我更快地索引数据? (我会索引离线/转换副本)
我想你间接地回答了我的问题。只要我对每个值都有独特的哈希值(我敢肯定,对于每一列我都要小于10k的独特值),它应该没问题。 ... 很明显,这样一个简单的散列很脆弱。 – 2009-07-20 22:09:38
您可以尝试使用MD5,速度相当快,128位不易碰撞。 – 2009-07-20 22:23:53