Question is similar to this one,但答案似乎没有回答这个问题。
我对聚集列存储表的理解(如果我错了,请纠正我)是每列都以某种物理有序的方式存储,这意味着每列已经具有相当于聚集索引的内容。如果是这种情况,那么在表上添加更多索引就没有多大意义......或者会吗?也许是综合指数?
我的想法对吗?
Question is similar to this one,但答案似乎没有回答这个问题。
我对聚集列存储表的理解(如果我错了,请纠正我)是每列都以某种物理有序的方式存储,这意味着每列已经具有相当于聚集索引的内容。如果是这种情况,那么在表上添加更多索引就没有多大意义......或者会吗?也许是综合指数?
我的想法对吗?
我有一个大型报告表(大约 6B 行),在 azure sql db 上占用了大约 400GB 的存储空间。我一直在尝试使用以下命令将其转换为列存储表:
insert Logs(Message) values ('Creating SRR table...');
select top 0 * into temp.SRR from dbo.SRR (nolock);
create clustered columnstore index ix_SRR on temp.SRR with (online = off);
create index ix_SRR_JobId on temp.SRR (JobId);
insert Logs(Message) values('Populating SRR table...');
insert into temp.SRR with (tablock) select * from dbo.SRR (nolock);
insert Logs(Message) values ('Switching out SRR table...');
alter schema old transfer dbo.SRR;
alter schema dbo transfer temp.SRR;
insert Logs(Message) values ('SRR table converted.');
if (select count_big(*) from old.SRR (nolock)) = (select count_big(*) from dbo.SRR (nolock)) begin
drop table old.SRR;
insert Logs(Message) values('Deleted old SRR table.');
end else begin
insert Logs(Message) values('Row counts between old.SRR and dbo.SRR do not match; retaining old.SRR.');
end
这对我们所有其他大型报告表都有效,但是这个(经过 30 小时的 DTU 时间)始终失败并显示以下消息:
Msg 40544, Level 17, State 2, Line 195
The database 'tempdb' has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions.
我能做些什么来完成这项工作?
如果我声明一个列serial
在 PostgreSql 中,它将按序数顺序自动递增。由于回滚等原因,最终结果可能不是连续的,但它或多或少是有序的。
我有一个用户表,其中用户 ID 设置为serial
,因此从 1 开始递增......但我宁愿他们不是,因为它似乎要求某种序列号攻击。
是否有一种相对简单、相对高效的方法可以在 PostgreSQL 中创建自动人工 ID,以便 ID 随机间隔开,并且您不应该期望 ID 987654321 遵循 ID 987654320?
我有一个这样定义的表:
CREATE TABLE [dbo].[IpMetadata](
[StartIp] [bigint] NOT NULL,
[EndIp] [bigint] NOT NULL,
[CountryCode] [char](10) NOT NULL,
[ProxyType] [varchar](50) NULL,
[ProxyDescription] [varchar](50) NULL,
[IspName] [varchar](100) NULL,
[MobileCarrier] [varchar](50) NULL,
[MobileCarrierCode] [varchar](50) NULL,
[Latitude] [varchar](50) NULL,
[Longitude] [varchar](50) NULL,
[PostalCode] [varchar](50) NULL,
[City] [varchar](50) NULL,
[Region] [varchar](50) NULL,
[Country] [varchar](50) NULL,
[GmtOffset] [varchar](50) NULL,
[SupportsDaylightSavings] [char](10) NULL,
[MetroCode] [varchar](50) NULL,
[AddressCount] [int] NOT NULL,
CONSTRAINT [PK_IpMetadata] PRIMARY KEY CLUSTERED
(
[StartIp] ASC,
[EndIp] ASC
)
)
我有一个 UTF-8 编码的采样文件 (D:\data\ipsnip.csv),其中包含制表符分隔、CRLF 终止的行,可以像这样插入到这个表中:
#start-ip end-ip edge-two-letter-country proxy-type proxy-description isp-name mobile-carrier mobile-carrier-code edge-latitude edge-longitude edge-postal-code edge-city edge-region edge-country edge-gmt-offset edge-in-dst edge-metro-code address-count
0 0 ** 0 0 0 0 reserved *** *** +9999 n -1 0
1 255 ** 0 0 0 0 reserved *** *** +9999 n -1 254
256 16777215 ** 0 0 0 0 reserved *** *** +9999 n -1 16776959
16777216 16777343 au 0 -37.7596 145.134 3106 templestowe vic aus +1000 n 36211 127
16777344 16777407 au 0 -37.7596 145.134 3106 templestowe vic aus +1000 n 36211 63
16777408 16777471 au 0 -37.7596 145.134 3106 templestowe vic aus +1000 n 36211 63
16777472 16778239 cn chinanet fujian province network 0 26.0786 119.298 350000 fuzhou 35 chn +800 n 156115 767
16778240 16779263 au big red group 0 -37.8387 144.99 3141 south yarra vic aus +1000 n 36206 1023
16779264 16781311 cn chinanet guangdong province network 0 30.6611 104.082 510000 guangzhou 44 chn +800 n 156196 2047
16781312 16785407 jp i2ts inc. 0 35.6838 139.754 100-0001 tokyo 13 jpn +900 n -1 4095
我像这样运行 BCP 命令:
bcp MyDatabase.dbo.IpMetadata in D:\data\ipsnip.csv -F2 -Slocalhost -n -T
我得到这样的回复:
Starting copy...
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 11 for SQL Server]Unexpected EOF encountered in BCP data-file
BCP copy in failed
我已经尝试明确指定列和行终止符。我尝试过使用 unicode 列定义。我尝试将行尾更改为 LF 而不是 CRLF。我尝试用分号/管道替换字段终止符。我试过-n
和-N
. 我不知道还能尝试什么。有人可以帮忙吗?
这里有点让人头疼。
我有一个数据少于 1GB 的数据库,但有一个 40GB 的日志文件。事务日志每天备份,这个数据库上没有很多活动;大约每周一次,它会记录新的工资单信息,然后将这些数据重复用于报告目的。数据库设置为自动收缩。
运行sp_spaceused @updateusage = true
产生以下信息:
database_name database_size unallocated space
PayrollImports 39412.06 MB 105.00 MB
reserved data index_size unused
321728 KB 278640 KB 42816 KB 272 KB
运行DBCC shrinkfile (N'PayrollImports_log', 1 , notruncate)
产生以下结果:
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
19 2 4991088 3456 4991088 3456
UsedPages
... the和 the之间的差异EstimatedPages
令人费解,但我继续DBCC shrinkfile (N'PayrollImports_log', 1 , truncateonly)
并得到:
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
19 2 4991088 3456 4991088 3456
在这一点上什么都没有改变。日志文件仍然是 40GB。所以我想,也许我有一些公开交易。运行dbcc opentran
应验证:
No active open transactions.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
废话。好吧,也许我的索引是零散的。我将对它们进行碎片整理sp_msForEachTable 'DBCC indexdefrag([PayrollImports], ''?'')'
并尝试再次缩小:
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
19 2 4991088 3456 4991088 3456
仍然没有任何改变。好的,我用 重新索引怎么样sp_msForEachTable 'DBCC dbreindex([?])'
?
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
...现在我们得到:
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
19 2 4991088 3456 4991088 3456
没变。好吧,怎么样sp_msForEachTable 'ALTER INDEX ALL ON [PayrollImports].[?] REBUILD WITH (FILLFACTOR = 10)'
?
立即,这失败了:
Cannot find the object "(One of my tables)" because it does not exist or you do not have permissions.
嗯?它在那里,好的。我做了一个select top 10 * from (My table)
,它空了。嗯,这根本不对。这是一个应该有超过 200 行的查找表。这可能是数据损坏问题吗?我从我的开发环境中收集数据,重新插入。
但我没有想法。我不能缩小这个东西。我还能尝试什么?为什么我的 UsedPages 比我的 EstimatedPages 高得难以置信?这里发生了什么?
如果我使用
explain (analyze true, verbose true, costs true, buffers true)
select * from mystoredprocedurefunction(arg1, arg2);
我没有得到任何关于服务器在我的 sp 中实际执行的信息。相反,我得到 5 行描述我调用了一个函数并且花了很长时间的行。如何查看我的存储过程并查看发生了什么?我发生了一些非常低效的事情。
我有一个安装程序,需要 plpgsql 在 PostgreSQL 8.4 数据库中安装存储过程。我需要确保安装了语言,否则应用程序将失败。我不想放弃该语言并重新添加它,因为这可能会搞砸一些其他事情。
有没有办法“温和地”安装语言?
CREATE LANGUAGE IF NOT EXISTS
似乎无效。
使用PGAdmin III
我可以右键单击数据库,导航到Variables
选项卡,然后将变量名称-值属性放在数据库本身上。有没有办法自定义这些?我看到了一个application_name
变量,但我想要一个application_version
变量。
我想编写一个检查在 PostgreSQL 中的表上使用的排序规则的脚本,但是谷歌搜索对Postgresql detect collation
我来说效果不佳,并且文档并没有使它成为一个简单的搜索。
谁能告诉我如何检查这个?
Stack Overflow Q & A Modify OWNER on all tables 同时在 PostgreSQL中描述了一些将表和其他对象更改为特定用户的绝妙方法,并且它工作得很好,但是所有建议似乎都忽略了我创建的函数。
是否有一种相当简单的方法来重置数据库中所有对象的所有者,包括函数?手工操作是非常不可取的。