我在Netezza有几张大桌子(数十兆字节的数据)。
我正在尝试使用系统/元表来找到计算这些表中行的方法。
我知道我可以使用:
SELECT COUNT(*) FROM tablename;
但这很慢并且会给Netezza设备带来很大的负担。我需要定期计算这些大表中的行,所以我不想影响正在运行的其他重要查询的性能。
我找到了这个查询:
SELECT RELNAME TABLE_NAME,
CASE
WHEN RELTUPLES < 0
THEN ((2^32) * RELREFS) + ((2^32) + RELTUPLES )
ELSE ((2^32) * RELREFS) + ( RELTUPLES )
END NUM_ROWS
FROM
_T_CLASS,
_T_OBJECT
WHERE
_T_OBJECT.OBJID=_T_CLASS.OID AND
_T_OBJECT.OBJCLASS=4905 — DISPLAY ONLY TABLES
AND RELNAME = UPPER('<TABLE NAME>');
哪个几乎有效。这个查询的问题在于它没有处理可能有更新/删除行的事实。
由于Netezza在数据库中保留已删除的行,直到修饰发生,我的行数才会出错。
是否有一个查询可以在考虑已删除的行的情况下为我提供正确的行数?
答案 0 :(得分:1)
我知道没有任何系统表或视图可以保证为记录已删除行的表准确计算行数。
一种折衷解决方案是从基表创建一个非常薄的物化视图(即单个列)。然后,您可以计算mview以获得准确的行计数,这应该比计算基表快得多。实际上,您可以在基表上计数(1),优化器会自动将您重定向到幕后的mview。
缺点是物化视图的常见情况;您需要支付IO成本才能保持更新。如果你的桌子足够宽,并且如果这个功能足够有用,那么它很容易就值得。
答案 1 :(得分:1)
小心_T_OBJECT.OBJCLASS = 4905部分查询,也可以有不同对象类的表。 改为使用它,
SELECT RELNAME TABLE_NAME, CASE WHEN RELTUPLES < 0 THEN ((2^32) * RELREFS) + ((2^32) + RELTUPLES ) ELSE ((2^32) * RELREFS) + ( RELTUPLES ) END NUM_ROWS FROM _T_CLASS, _T_OBJECT, _t_object_classes WHERE _T_OBJECT.OBJID=_T_CLASS.OID AND _T_OBJECT.OBJCLASS=_t_object_classes.OBJCLASS AND _t_object_classes.OBJREFCLASS=4905 -- DISPLAY ONLY TABLES AND RELNAME= UPPER('<TABLE NAME>');
答案 2 :(得分:0)
下面给出的不是使用系统表,但可以降低对设备的性能影响。 而不是将可能很大的结果集返回到您的应用程序(可能需要很长时间),只需返回SQL返回的行数计数。
尝试以下内容:
SELECT
COUNT(*) AS "# Of Rows Your Query Returned"
FROM
(
SELECT * from TABLE_NAME;
) AS "Wrapper";